@@ -112,6 +112,7 @@ void swift::simple_display(llvm::raw_ostream &out,
112112 {UnqualifiedLookupFlags::IgnoreAccessControl, " IgnoreAccessControl" },
113113 {UnqualifiedLookupFlags::IncludeOuterResults, " IncludeOuterResults" },
114114 {UnqualifiedLookupFlags::TypeLookup, " TypeLookup" },
115+ {UnqualifiedLookupFlags::MacroLookup, " MacroLookup" },
115116 };
116117
117118 auto flagsToPrint = llvm::make_filter_range (
@@ -1618,6 +1619,11 @@ namelookup::lookupMacros(DeclContext *dc, DeclNameRef macroName,
16181619 auto moduleScopeDC = dc->getModuleScopeContext ();
16191620 ASTContext &ctx = moduleScopeDC->getASTContext ();
16201621
1622+ // When performing lookup for freestanding macro roles, only consider
1623+ // macro names, ignoring types.
1624+ bool onlyMacros = static_cast <bool >(roles & getFreestandingMacroRoles ()) &&
1625+ !(roles - getFreestandingMacroRoles ());
1626+
16211627 // Macro lookup should always exclude macro expansions; macro
16221628 // expansions cannot introduce new macro declarations. Note that
16231629 // the source location here doesn't matter.
@@ -1626,8 +1632,12 @@ namelookup::lookupMacros(DeclContext *dc, DeclNameRef macroName,
16261632 UnqualifiedLookupFlags::ExcludeMacroExpansions
16271633 };
16281634
1635+ if (onlyMacros)
1636+ descriptor.Options |= UnqualifiedLookupFlags::MacroLookup;
1637+
16291638 auto lookup = evaluateOrDefault (
16301639 ctx.evaluator , UnqualifiedLookupRequest{descriptor}, {});
1640+
16311641 for (const auto &found : lookup.allResults ()) {
16321642 if (auto macro = dyn_cast<MacroDecl>(found.getValueDecl ())) {
16331643 auto candidateRoles = macro->getMacroRoles ();
@@ -1638,6 +1648,7 @@ namelookup::lookupMacros(DeclContext *dc, DeclNameRef macroName,
16381648 }
16391649 }
16401650 }
1651+
16411652 return choices;
16421653}
16431654
@@ -2408,6 +2419,11 @@ QualifiedLookupRequest::evaluate(Evaluator &eval, const DeclContext *DC,
24082419 if ((options & NL_OnlyTypes) && !isa<TypeDecl>(decl))
24092420 continue ;
24102421
2422+ // If we're performing a macro lookup, don't even attempt to validate
2423+ // the decl if its not a macro.
2424+ if ((options & NL_OnlyMacros) && !isa<MacroDecl>(decl))
2425+ continue ;
2426+
24112427 if (isAcceptableLookupResult (DC, options, decl, onlyCompleteObjectInits))
24122428 decls.push_back (decl);
24132429 }
@@ -2491,8 +2507,8 @@ ModuleQualifiedLookupRequest::evaluate(Evaluator &eval, const DeclContext *DC,
24912507 using namespace namelookup ;
24922508 QualifiedLookupResult decls;
24932509
2494- auto kind = (options & NL_OnlyTypes
2495- ? ResolutionKind::TypesOnly
2510+ auto kind = (options & NL_OnlyTypes ? ResolutionKind::TypesOnly
2511+ : options & NL_OnlyMacros ? ResolutionKind::MacrosOnly
24962512 : ResolutionKind::Overloadable);
24972513 auto topLevelScope = DC->getModuleScopeContext ();
24982514 if (module == topLevelScope->getParentModule ()) {
@@ -2534,8 +2550,8 @@ AnyObjectLookupRequest::evaluate(Evaluator &evaluator, const DeclContext *dc,
25342550 using namespace namelookup ;
25352551 QualifiedLookupResult decls;
25362552
2537- // Type-only lookup won't find anything on AnyObject.
2538- if (options & NL_OnlyTypes)
2553+ // Type-only and macro lookup won't find anything on AnyObject.
2554+ if (options & ( NL_OnlyTypes | NL_OnlyMacros) )
25392555 return decls;
25402556
25412557 // Collect all of the visible declarations.
@@ -4000,6 +4016,7 @@ void swift::simple_display(llvm::raw_ostream &out, NLOptions options) {
40004016 FLAG (NL_RemoveOverridden)
40014017 FLAG (NL_IgnoreAccessControl)
40024018 FLAG (NL_OnlyTypes)
4019+ FLAG (NL_OnlyMacros)
40034020 FLAG (NL_IncludeAttributeImplements)
40044021#undef FLAG
40054022 };
0 commit comments