@@ -651,26 +651,13 @@ void Module::FindCompileUnits(const FileSpec &path,
651651
652652Module::LookupInfo::LookupInfo (ConstString name,
653653 FunctionNameType name_type_mask,
654- LanguageType language )
655- : m_name(name), m_lookup_name(name), m_language(language ) {
654+ LanguageType lang_type )
655+ : m_name(name), m_lookup_name(name), m_language(lang_type ) {
656656 std::optional<ConstString> basename;
657-
658- std::vector<Language *> languages;
659- {
660- std::vector<LanguageType> lang_types;
661- if (language != eLanguageTypeUnknown)
662- lang_types.push_back (language);
663- else
664- lang_types = {eLanguageTypeObjC, eLanguageTypeC_plus_plus};
665-
666- for (LanguageType lang_type : lang_types) {
667- if (Language *lang = Language::FindPlugin (lang_type))
668- languages.push_back (lang);
669- }
670- }
657+ Language *lang = Language::FindPlugin (lang_type);
671658
672659 if (name_type_mask & eFunctionNameTypeAuto) {
673- for (Language * lang : languages ) {
660+ if ( lang) {
674661 auto info = lang->GetFunctionNameInfo (name);
675662 if (info.first != eFunctionNameTypeNone) {
676663 m_name_type_mask |= info.first ;
@@ -687,7 +674,7 @@ Module::LookupInfo::LookupInfo(ConstString name,
687674
688675 } else {
689676 m_name_type_mask = name_type_mask;
690- for (Language * lang : languages ) {
677+ if ( lang) {
691678 auto info = lang->GetFunctionNameInfo (name);
692679 if (info.first & m_name_type_mask) {
693680 // If the user asked for FunctionNameTypes that aren't possible,
@@ -696,14 +683,12 @@ Module::LookupInfo::LookupInfo(ConstString name,
696683 // ObjC)
697684 m_name_type_mask &= info.first ;
698685 basename = info.second ;
699- break ;
700- }
701- // Still try and get a basename in case someone specifies a name type mask
702- // of eFunctionNameTypeFull and a name like "A::func"
703- if (name_type_mask & eFunctionNameTypeFull &&
704- info.first != eFunctionNameTypeNone && !basename && info.second ) {
686+ } else if (name_type_mask & eFunctionNameTypeFull &&
687+ info.first != eFunctionNameTypeNone && !basename &&
688+ info.second ) {
689+ // Still try and get a basename in case someone specifies a name type
690+ // mask of eFunctionNameTypeFull and a name like "A::func"
705691 basename = info.second ;
706- break ;
707692 }
708693 }
709694 }
@@ -719,6 +704,36 @@ Module::LookupInfo::LookupInfo(ConstString name,
719704 }
720705}
721706
707+ std::vector<Module::LookupInfo>
708+ Module::LookupInfo::MakeLookupInfos (ConstString name,
709+ lldb::FunctionNameType name_type_mask,
710+ lldb::LanguageType lang_type) {
711+ std::vector<LanguageType> lang_types;
712+ if (lang_type != eLanguageTypeUnknown) {
713+ lang_types.push_back (lang_type);
714+ } else {
715+ // If the language type was not specified, look up in every language
716+ // available.
717+ Language::ForEach ([&](Language *lang) {
718+ auto lang_type = lang->GetLanguageType ();
719+ if (!llvm::is_contained (lang_types, lang_type))
720+ lang_types.push_back (lang_type);
721+ return true ;
722+ });
723+
724+ if (lang_types.empty ())
725+ lang_types = {eLanguageTypeObjC, eLanguageTypeC_plus_plus};
726+ }
727+
728+ std::vector<Module::LookupInfo> infos;
729+ infos.reserve (lang_types.size ());
730+ for (LanguageType lang_type : lang_types) {
731+ Module::LookupInfo info (name, name_type_mask, lang_type);
732+ infos.push_back (info);
733+ }
734+ return infos;
735+ }
736+
722737bool Module::LookupInfo::NameMatchesLookupInfo (
723738 ConstString function_name, LanguageType language_type) const {
724739 // We always keep unnamed symbols
@@ -837,18 +852,29 @@ void Module::FindFunctions(const Module::LookupInfo &lookup_info,
837852 }
838853}
839854
855+ void Module::FindFunctions (const std::vector<Module::LookupInfo> &lookup_infos,
856+ const CompilerDeclContext &parent_decl_ctx,
857+ const ModuleFunctionSearchOptions &options,
858+ SymbolContextList &sc_list) {
859+ for (auto &lookup_info : lookup_infos)
860+ FindFunctions (lookup_info, parent_decl_ctx, options, sc_list);
861+ }
862+
840863void Module::FindFunctions (ConstString name,
841864 const CompilerDeclContext &parent_decl_ctx,
842865 FunctionNameType name_type_mask,
843866 const ModuleFunctionSearchOptions &options,
844867 SymbolContextList &sc_list) {
845- const size_t old_size = sc_list.GetSize ();
846- LookupInfo lookup_info (name, name_type_mask, eLanguageTypeUnknown);
847- FindFunctions (lookup_info, parent_decl_ctx, options, sc_list);
848- if (name_type_mask & eFunctionNameTypeAuto) {
849- const size_t new_size = sc_list.GetSize ();
850- if (old_size < new_size)
851- lookup_info.Prune (sc_list, old_size);
868+ std::vector<LookupInfo> lookup_infos =
869+ LookupInfo::MakeLookupInfos (name, name_type_mask, eLanguageTypeUnknown);
870+ for (auto &lookup_info : lookup_infos) {
871+ const size_t old_size = sc_list.GetSize ();
872+ FindFunctions (lookup_info, parent_decl_ctx, options, sc_list);
873+ if (name_type_mask & eFunctionNameTypeAuto) {
874+ const size_t new_size = sc_list.GetSize ();
875+ if (old_size < new_size)
876+ lookup_info.Prune (sc_list, old_size);
877+ }
852878 }
853879}
854880
0 commit comments