in tools/worker/swift_runner.cc [380:417]
std::vector<std::string> SwiftRunner::ProcessArguments(
const std::vector<std::string> &args) {
std::vector<std::string> new_args;
std::vector<std::string> response_file_args;
#if __APPLE__
// On Apple platforms, inject `/usr/bin/xcrun` in front of our command
// invocation.
new_args.push_back("/usr/bin/xcrun");
#endif
// The tool is assumed to be the first argument. Push it directly.
auto parsed_args = ParseArguments(args);
auto it = parsed_args.begin();
new_args.push_back(*it++);
// If we're forcing response files, push the remaining processed args onto a
// different vector that we write out below. If not, push them directly onto
// the vector being returned.
auto &args_destination = force_response_file_ ? response_file_args : new_args;
while (it != parsed_args.end()) {
ProcessArgument(it, *it, [&](const std::string &arg) {
args_destination.push_back(arg);
});
++it;
}
if (force_response_file_) {
// Write the processed args to the response file, and push the path to that
// file (preceded by '@') onto the arg list being returned.
auto new_file = WriteResponseFile(response_file_args);
new_args.push_back("@" + new_file->GetPath());
temp_files_.push_back(std::move(new_file));
}
return new_args;
}