Skip to content

Commit a6f98c9

Browse files
16bit-ykikoclaude
andcommitted
fix(command): inject resource dir on all lookup paths and inline to_argv() temporaries
- Move resource dir injection out of query_toolchain branch to cover all paths in build_command (non-toolchain was missing it) - Also inject resource dir in the default fallback command (no CDB entry) - Inline unnecessary `auto argv = cmd.to_argv()` locals where the result is immediately passed as a function argument Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 4cd1036 commit a6f98c9

File tree

4 files changed

+90
-90
lines changed

4 files changed

+90
-90
lines changed

src/command/command.cpp

Lines changed: 85 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -439,103 +439,107 @@ llvm::SmallVector<CompileCommand> CompilationDatabase::lookup(llvm::StringRef fi
439439
}
440440
flags = std::move(cleaned);
441441

442-
// Detect cc1 mode.
443-
is_cc1 = (flags.size() >= 2 && flags[1] == llvm::StringRef("-cc1"));
444-
}
445-
446-
// Inject our resource dir if not already present.
447-
if(!resource_dir().empty()) {
448-
bool has_resource_dir = false;
449-
for(auto& arg: flags) {
450-
if(arg == llvm::StringRef("-resource-dir")) {
451-
has_resource_dir = true;
452-
break;
453-
}
454-
}
455-
if(!has_resource_dir) {
456-
append_arg("-resource-dir");
457-
append_arg(resource_dir());
458-
}
442+
// Detect cc1 mode (search rather than assuming index).
443+
is_cc1 = ranges::contains(flags, llvm::StringRef("-cc1"));
459444
}
460445
} else {
461446
append_args(info->canonical->arguments);
462447
append_args(info->patch);
463448
}
464449

465-
// Apply remove filter.
466-
if(!options.remove.empty()) {
467-
using Arg = std::unique_ptr<llvm::opt::Arg>;
468-
llvm::SmallVector<const char*> remove_strs;
469-
for(auto& s: options.remove) {
470-
remove_strs.push_back(strings.save(s).data());
450+
// Inject our resource dir if not already present.
451+
if(!resource_dir().empty()) {
452+
bool has_resource_dir = false;
453+
for(auto& arg: flags) {
454+
if(arg == llvm::StringRef("-resource-dir")) {
455+
has_resource_dir = true;
456+
break;
471457
}
472-
llvm::SmallVector<Arg> remove_args;
473-
parser->parse(
474-
remove_strs,
475-
[&remove_args](Arg arg) { remove_args.emplace_back(std::move(arg)); },
476-
[](int, int) {});
477-
auto get_id = [](const Arg& arg) {
478-
return arg->getOption().getID();
479-
};
480-
std::ranges::sort(remove_args, {}, get_id);
481-
482-
auto saved_flags = std::move(flags);
483-
flags.clear();
484-
flags.push_back(saved_flags.front());
485-
486-
parser->parse(
487-
llvm::ArrayRef(saved_flags).drop_front(),
488-
[&](Arg arg) {
489-
auto id = arg->getOption().getID();
490-
auto range = std::ranges::equal_range(remove_args, id, {}, get_id);
491-
for(auto& remove: range) {
492-
if(remove->getNumValues() == 1 &&
493-
remove->getValue(0) == llvm::StringRef("*")) {
494-
return;
495-
}
496-
if(std::ranges::equal(
497-
arg->getValues(),
498-
remove->getValues(),
499-
[](llvm::StringRef l, llvm::StringRef r) { return l == r; })) {
500-
return;
501-
}
502-
}
503-
render_arg(flags, *arg);
504-
},
505-
[](int, int) {});
506458
}
507-
508-
for(auto& arg: options.append) {
509-
append_arg(arg);
459+
if(!has_resource_dir) {
460+
append_arg("-resource-dir");
461+
append_arg(resource_dir());
510462
}
463+
}
511464

512-
return CompileCommand{
513-
ResolvedFlags{directory, std::move(flags), is_cc1},
514-
paths.resolve(path_id).data()
465+
// Apply remove filter.
466+
if(!options.remove.empty()) {
467+
using Arg = std::unique_ptr<llvm::opt::Arg>;
468+
llvm::SmallVector<const char*> remove_strs;
469+
for(auto& s: options.remove) {
470+
remove_strs.push_back(strings.save(s).data());
471+
}
472+
llvm::SmallVector<Arg> remove_args;
473+
parser->parse(
474+
remove_strs,
475+
[&remove_args](Arg arg) { remove_args.emplace_back(std::move(arg)); },
476+
[](int, int) {});
477+
auto get_id = [](const Arg& arg) {
478+
return arg->getOption().getID();
515479
};
480+
std::ranges::sort(remove_args, {}, get_id);
481+
482+
auto saved_flags = std::move(flags);
483+
flags.clear();
484+
flags.push_back(saved_flags.front());
485+
486+
parser->parse(
487+
llvm::ArrayRef(saved_flags).drop_front(),
488+
[&](Arg arg) {
489+
auto id = arg->getOption().getID();
490+
auto range = std::ranges::equal_range(remove_args, id, {}, get_id);
491+
for(auto& remove: range) {
492+
if(remove->getNumValues() == 1 && remove->getValue(0) == llvm::StringRef("*")) {
493+
return;
494+
}
495+
if(std::ranges::equal(
496+
arg->getValues(),
497+
remove->getValues(),
498+
[](llvm::StringRef l, llvm::StringRef r) { return l == r; })) {
499+
return;
500+
}
501+
}
502+
render_arg(flags, *arg);
503+
},
504+
[](int, int) {});
505+
}
506+
507+
for(auto& arg: options.append) {
508+
append_arg(arg);
509+
}
510+
511+
return CompileCommand{
512+
ResolvedFlags{directory, std::move(flags), is_cc1},
513+
paths.resolve(path_id).data()
516514
};
515+
};
517516

518-
llvm::SmallVector<CompileCommand> results;
517+
llvm::SmallVector<CompileCommand> results;
519518

520-
if(!matched.empty()) {
521-
for(auto& entry: matched) {
522-
results.push_back(build_command(entry.info));
523-
}
519+
if(!matched.empty()) {
520+
for(auto& entry: matched) {
521+
results.push_back(build_command(entry.info));
522+
}
523+
} else {
524+
// No matching entry — synthesize a default command.
525+
std::vector<const char*> flags;
526+
if(file.ends_with(".cpp") || file.ends_with(".hpp") || file.ends_with(".cc")) {
527+
flags = {"clang++", "-std=c++20"};
524528
} else {
525-
// No matching entry — synthesize a default command.
526-
std::vector<const char*> flags;
527-
if(file.ends_with(".cpp") || file.ends_with(".hpp") || file.ends_with(".cc")) {
528-
flags = {"clang++", "-std=c++20"};
529-
} else {
530-
flags = {"clang"};
531-
}
532-
results.push_back(CompileCommand{
533-
ResolvedFlags{{}, std::move(flags), false},
534-
paths.resolve(path_id).data()
535-
});
529+
flags = {"clang"};
536530
}
531+
if(!resource_dir().empty()) {
532+
flags.push_back(strings.save("-resource-dir").data());
533+
flags.push_back(strings.save(resource_dir()).data());
534+
}
535+
results.push_back(CompileCommand{
536+
ResolvedFlags{{}, std::move(flags), false},
537+
paths.resolve(path_id).data()
538+
});
539+
}
540+
541+
return results;
537542

538-
return results;
539543
}
540544

541545
SearchConfig CompilationDatabase::lookup_search_config(llvm::StringRef file,
@@ -557,8 +561,7 @@ SearchConfig CompilationDatabase::lookup_search_config(llvm::StringRef file,
557561

558562
auto results = lookup(file, options);
559563
auto& cmd = results.front();
560-
auto argv = cmd.to_argv();
561-
auto config = extract_search_config(argv, cmd.resolved.directory);
564+
auto config = extract_search_config(cmd.to_argv(), cmd.resolved.directory);
562565

563566
if(cacheable) {
564567
auto key = ConfigCacheKey{matched.front().info.ptr, options_bits(options)};

src/server/compiler.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ void Compiler::init_compile_graph() {
5353
return {};
5454

5555
auto& cmd = results[0];
56-
auto argv = cmd.to_argv();
57-
auto scan_result = scan_precise(argv, cmd.resolved.directory);
56+
auto scan_result = scan_precise(cmd.to_argv(), cmd.resolved.directory);
5857

5958
llvm::SmallVector<std::uint32_t> deps;
6059
for(auto& mod_name: scan_result.modules) {

src/syntax/dependency_graph.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -624,8 +624,8 @@ et::task<> scan_impl(CompilationDatabase& cdb,
624624
cdb.lookup(file_path, {.query_toolchain = true, .suppress_logging = true});
625625
if(!contexts.empty()) {
626626
auto& cmd = contexts[0];
627-
auto argv = cmd.to_argv();
628-
auto fallback = scan_module_decl(argv, cmd.resolved.directory, /*content=*/{});
627+
auto fallback =
628+
scan_module_decl(cmd.to_argv(), cmd.resolved.directory, /*content=*/{});
629629
if(!fallback.module_name.empty()) {
630630
scan_result.scan_result.module_name = std::move(fallback.module_name);
631631
scan_result.scan_result.is_interface_unit = fallback.is_interface_unit;

tests/unit/server/compile_graph_integration_tests.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ CompileGraph::resolve_fn make_resolver(CompilationDatabase& cdb,
7070
return {};
7171
}
7272

73-
auto argv = results[0].to_argv();
74-
auto scan_result = scan_precise(argv, results[0].resolved.directory);
73+
auto scan_result = scan_precise(results[0].to_argv(), results[0].resolved.directory);
7574

7675
llvm::SmallVector<std::uint32_t> deps;
7776
for(auto& mod_name: scan_result.modules) {
@@ -1033,8 +1032,7 @@ TEST_CASE(ReResolveAfterUpdate) {
10331032
if(results.empty()) {
10341033
return {};
10351034
}
1036-
auto argv = results[0].to_argv();
1037-
auto scan_result = scan_precise(argv, results[0].resolved.directory);
1035+
auto scan_result = scan_precise(results[0].to_argv(), results[0].resolved.directory);
10381036
llvm::SmallVector<std::uint32_t> deps;
10391037
for(auto& mod_name: scan_result.modules) {
10401038
auto mod_ids = env.graph.lookup_module(mod_name);

0 commit comments

Comments
 (0)