@@ -1757,6 +1757,17 @@ namespace {
17571757 };
17581758}
17591759
1760+ // / Given an extension declaration, return the extended nominal type if the
1761+ // / extension was produced by expanding an extension or conformance macro from
1762+ // / the nominal declaration itself.
1763+ static NominalTypeDecl *nominalForExpandedExtensionDecl (ExtensionDecl *ext) {
1764+ if (!ext->isInMacroExpansionInContext ())
1765+ return nullptr ;
1766+
1767+
1768+ return ext->getSelfNominalTypeDecl ();
1769+ }
1770+
17601771PotentialMacroExpansions PotentialMacroExpansionsInContextRequest::evaluate (
17611772 Evaluator &evaluator, TypeOrExtensionDecl container) const {
17621773 // / The implementation here needs to be kept in sync with
@@ -1767,6 +1778,15 @@ PotentialMacroExpansions PotentialMacroExpansionsInContextRequest::evaluate(
17671778 auto containerDecl = container.getAsDecl ();
17681779 forEachPotentialAttachedMacro (containerDecl, MacroRole::Member, nameTracker);
17691780
1781+ // If the container is an extension that was created from an extension macro,
1782+ // look at the nominal declaration to find any extension macros.
1783+ if (auto ext = dyn_cast<ExtensionDecl>(containerDecl)) {
1784+ if (auto nominal = nominalForExpandedExtensionDecl (ext)) {
1785+ forEachPotentialAttachedMacro (
1786+ nominal, MacroRole::Extension, nameTracker);
1787+ }
1788+ }
1789+
17701790 // Peer and freestanding declaration macros.
17711791 auto dc = container.getAsDeclContext ();
17721792 auto idc = container.getAsIterableDeclContext ();
@@ -1825,13 +1845,15 @@ populateLookupTableEntryFromMacroExpansions(ASTContext &ctx,
18251845 // names match.
18261846 {
18271847 MacroIntroducedNameTracker nameTracker;
1828- if (auto nominal = dyn_cast<NominalTypeDecl>(container.getAsDecl ())) {
1829- forEachPotentialAttachedMacro (nominal, MacroRole::Extension, nameTracker);
1830- if (nameTracker.shouldExpandForName (name)) {
1831- (void )evaluateOrDefault (
1832- ctx.evaluator ,
1833- ExpandExtensionMacros{nominal},
1834- false );
1848+ if (auto ext = dyn_cast<ExtensionDecl>(container.getAsDecl ())) {
1849+ if (auto nominal = nominalForExpandedExtensionDecl (ext)) {
1850+ forEachPotentialAttachedMacro (nominal, MacroRole::Extension, nameTracker);
1851+ if (nameTracker.shouldExpandForName (name)) {
1852+ (void )evaluateOrDefault (
1853+ ctx.evaluator ,
1854+ ExpandExtensionMacros{nominal},
1855+ false );
1856+ }
18351857 }
18361858 }
18371859 }
0 commit comments