@@ -4824,7 +4824,8 @@ static Identifier encodeLocalPrecheckedDiscriminator(
48244824
48254825void ASTMangler::appendMacroExpansionContext (
48264826 SourceLoc loc, DeclContext *origDC,
4827- const FreestandingMacroExpansion *expansion
4827+ Identifier macroName,
4828+ unsigned macroDiscriminator
48284829) {
48294830 origDC = MacroDiscriminatorContext::getInnermostMacroContext (origDC);
48304831 BaseEntitySignature nullBase (nullptr );
@@ -4833,9 +4834,9 @@ void ASTMangler::appendMacroExpansionContext(
48334834 if (auto outermostLocalDC = getOutermostLocalContext (origDC)) {
48344835 auto innermostNonlocalDC = outermostLocalDC->getParent ();
48354836 appendContext (innermostNonlocalDC, nullBase, StringRef ());
4836- Identifier name = expansion-> getMacroName (). getBaseIdentifier () ;
4837+ Identifier name = macroName ;
48374838 ASTContext &ctx = origDC->getASTContext ();
4838- unsigned discriminator = expansion-> getDiscriminator () ;
4839+ unsigned discriminator = macroDiscriminator ;
48394840 name = encodeLocalPrecheckedDiscriminator (ctx, name, discriminator);
48404841 appendIdentifier (name.str ());
48414842 } else {
@@ -4940,7 +4941,10 @@ void ASTMangler::appendMacroExpansionContext(
49404941 return appendMacroExpansionLoc ();
49414942
49424943 // Append our own context and discriminator.
4943- appendMacroExpansionContext (outerExpansionLoc, origDC, expansion);
4944+ appendMacroExpansionContext (
4945+ outerExpansionLoc, origDC,
4946+ macroName,
4947+ macroDiscriminator);
49444948 appendMacroExpansionOperator (
49454949 baseName.userFacingName (), role, discriminator);
49464950}
@@ -4967,16 +4971,14 @@ void ASTMangler::appendMacroExpansionOperator(
49674971}
49684972
49694973static StringRef getPrivateDiscriminatorIfNecessary (
4970- const MacroExpansionExpr *expansion) {
4971- auto dc = MacroDiscriminatorContext::getInnermostMacroContext (
4972- expansion->getDeclContext ());
4973- auto decl = dc->getAsDecl ();
4974+ const DeclContext *macroDC) {
4975+ auto decl = macroDC->getAsDecl ();
49744976 if (decl && !decl->isOutermostPrivateOrFilePrivateScope ())
49754977 return StringRef ();
49764978
49774979 // Mangle non-local private declarations with a textual discriminator
49784980 // based on their enclosing file.
4979- auto topLevelSubcontext = dc ->getModuleScopeContext ();
4981+ auto topLevelSubcontext = macroDC ->getModuleScopeContext ();
49804982 SourceFile *sf = dyn_cast<SourceFile>(topLevelSubcontext);
49814983 if (!sf)
49824984 return StringRef ();
@@ -4992,6 +4994,13 @@ static StringRef getPrivateDiscriminatorIfNecessary(
49924994 return discriminator.str ();
49934995}
49944996
4997+ static StringRef getPrivateDiscriminatorIfNecessary (
4998+ const MacroExpansionExpr *expansion) {
4999+ auto dc = MacroDiscriminatorContext::getInnermostMacroContext (
5000+ expansion->getDeclContext ());
5001+ return getPrivateDiscriminatorIfNecessary (dc);
5002+ }
5003+
49955004static StringRef getPrivateDiscriminatorIfNecessary (
49965005 const FreestandingMacroExpansion *expansion) {
49975006 switch (expansion->getFreestandingMacroKind ()) {
@@ -5008,7 +5017,8 @@ void
50085017ASTMangler::appendMacroExpansion (const FreestandingMacroExpansion *expansion) {
50095018 appendMacroExpansionContext (expansion->getPoundLoc (),
50105019 expansion->getDeclContext (),
5011- expansion);
5020+ expansion->getMacroName ().getBaseIdentifier (),
5021+ expansion->getDiscriminator ());
50125022 auto privateDiscriminator = getPrivateDiscriminatorIfNecessary (expansion);
50135023 if (!privateDiscriminator.empty ()) {
50145024 appendIdentifier (privateDiscriminator);
@@ -5020,6 +5030,42 @@ ASTMangler::appendMacroExpansion(const FreestandingMacroExpansion *expansion) {
50205030 expansion->getDiscriminator ());
50215031}
50225032
5033+ void ASTMangler::appendMacroExpansion (ClosureExpr *attachedTo,
5034+ CustomAttr *attr,
5035+ MacroDecl *macro) {
5036+ auto &ctx = attachedTo->getASTContext ();
5037+ auto discriminator =
5038+ ctx.getNextMacroDiscriminator (attachedTo,
5039+ macro->getBaseName ());
5040+
5041+ appendMacroExpansionContext (
5042+ attr->getLocation (),
5043+ attachedTo,
5044+ macro->getBaseName ().getIdentifier (),
5045+ discriminator);
5046+
5047+ auto privateDiscriminator =
5048+ getPrivateDiscriminatorIfNecessary (attachedTo);
5049+ if (!privateDiscriminator.empty ()) {
5050+ appendIdentifier (privateDiscriminator);
5051+ appendOperator (" Ll" );
5052+ }
5053+
5054+ appendMacroExpansionOperator (
5055+ macro->getBaseName ().userFacingName (),
5056+ MacroRole::Body,
5057+ discriminator);
5058+ }
5059+
5060+ std::string
5061+ ASTMangler::mangleAttachedMacroExpansion (ClosureExpr *attachedTo,
5062+ CustomAttr *attr,
5063+ MacroDecl *macro) {
5064+ beginMangling ();
5065+ appendMacroExpansion (attachedTo, attr, macro);
5066+ return finalize ();
5067+ }
5068+
50235069std::string
50245070ASTMangler::mangleMacroExpansion (const FreestandingMacroExpansion *expansion) {
50255071 beginMangling ();
0 commit comments