@@ -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
541545SearchConfig 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)};
0 commit comments