Pass vectors of raw pointers to OptionProcessor helpers instead of vectors of unique_ptrs. Passing a vector<unique_ptr<T>>& is bad for two reasons: 1) Conceptual - unique_ptr is meant to be a clear signal of ownership transfer. But this is a *reference* to a vector of unique_ptrs so ownership isn't transferred. 2) Practical - this interface is impossible to work with unless you happen to already have a vector of unique_ptrs, because they're move-only so you can't create this on the fly. RELNOTES: None. PiperOrigin-RevId: 329760925
diff --git a/src/main/cpp/option_processor.cc b/src/main/cpp/option_processor.cc index e91f84d..9a702ff 100644 --- a/src/main/cpp/option_processor.cc +++ b/src/main/cpp/option_processor.cc
@@ -488,15 +488,20 @@ } } + // The helpers expect regular pointers, not unique_ptrs. + std::vector<RcFile*> rc_file_ptrs; + rc_file_ptrs.reserve(rc_files.size()); + for (auto& rc_file : rc_files) { rc_file_ptrs.push_back(rc_file.get()); } + // Parse the startup options in the correct priority order. const blaze_exit_code::ExitCode parse_startup_options_exit_code = - ParseStartupOptions(rc_files, error); + ParseStartupOptions(rc_file_ptrs, error); if (parse_startup_options_exit_code != blaze_exit_code::SUCCESS) { return parse_startup_options_exit_code; } blazerc_and_env_command_args_ = - GetBlazercAndEnvCommandArgs(cwd, rc_files, GetProcessedEnv()); + GetBlazercAndEnvCommandArgs(cwd, rc_file_ptrs, GetProcessedEnv()); return blaze_exit_code::SUCCESS; } @@ -538,15 +543,14 @@ } blaze_exit_code::ExitCode OptionProcessor::ParseStartupOptions( - const std::vector<std::unique_ptr<RcFile>> &rc_files, - std::string *error) { + const std::vector<RcFile*> &rc_files, std::string *error) { // Rc files can import other files at any point, and these imported rcs are // expanded in place. Here, we isolate just the startup options but keep the // file they came from attached for the option_sources tracking and for // sending to the server. std::vector<RcStartupFlag> rcstartup_flags; - for (const auto& blazerc : rc_files) { + for (const auto* blazerc : rc_files) { const auto iter = blazerc->options().find("startup"); if (iter == blazerc->options().end()) continue; @@ -637,7 +641,7 @@ // BlazeOptionHandler.INTERNAL_COMMAND_OPTIONS! std::vector<std::string> OptionProcessor::GetBlazercAndEnvCommandArgs( const std::string& cwd, - const std::vector<std::unique_ptr<RcFile>>& blazercs, + const std::vector<RcFile*>& blazercs, const std::vector<std::string>& env) { // Provide terminal options as coming from the least important rc file. std::vector<std::string> result = { @@ -656,7 +660,7 @@ // is reserved the "client" options created by this function. int cur_index = 1; std::map<std::string, int> rcfile_indexes; - for (const auto& blazerc : blazercs) { + for (const auto* blazerc : blazercs) { for (const std::string& source_path : blazerc->canonical_source_paths()) { // Deduplicate the rc_source list because the same file might be included // from multiple places. @@ -669,7 +673,7 @@ } // Add RcOptions as default_overrides. - for (const auto& blazerc : blazercs) { + for (const auto* blazerc : blazercs) { for (const auto& command_options : blazerc->options()) { const string& command = command_options.first; // Skip startup flags, which are already parsed by the client.
diff --git a/src/main/cpp/option_processor.h b/src/main/cpp/option_processor.h index 4692b0d..4bbee41 100644 --- a/src/main/cpp/option_processor.h +++ b/src/main/cpp/option_processor.h
@@ -121,7 +121,7 @@ // server to configure blazerc options and client environment. static std::vector<std::string> GetBlazercAndEnvCommandArgs( const std::string& cwd, - const std::vector<std::unique_ptr<RcFile>>& blazercs, + const std::vector<RcFile*>& blazercs, const std::vector<std::string>& env); // Finds and parses the appropriate RcFiles: @@ -138,8 +138,7 @@ private: blaze_exit_code::ExitCode ParseStartupOptions( - const std::vector<std::unique_ptr<RcFile>>& rc_files, - std::string* error); + const std::vector<RcFile*>& rc_files, std::string* error); // An ordered list of command args that contain information about the // execution environment and the flags passed via the bazelrc files.