@@ -4759,7 +4759,8 @@ static Identifier encodeLocalPrecheckedDiscriminator(
47594759
47604760void ASTMangler::appendMacroExpansionContext (
47614761 SourceLoc loc, DeclContext *origDC,
4762- const FreestandingMacroExpansion *expansion
4762+ Identifier macroName,
4763+ unsigned macroDiscriminator
47634764) {
47644765 origDC = MacroDiscriminatorContext::getInnermostMacroContext (origDC);
47654766 BaseEntitySignature nullBase (nullptr );
@@ -4768,9 +4769,9 @@ void ASTMangler::appendMacroExpansionContext(
47684769 if (auto outermostLocalDC = getOutermostLocalContext (origDC)) {
47694770 auto innermostNonlocalDC = outermostLocalDC->getParent ();
47704771 appendContext (innermostNonlocalDC, nullBase, StringRef ());
4771- Identifier name = expansion-> getMacroName (). getBaseIdentifier () ;
4772+ Identifier name = macroName ;
47724773 ASTContext &ctx = origDC->getASTContext ();
4773- unsigned discriminator = expansion-> getDiscriminator () ;
4774+ unsigned discriminator = macroDiscriminator ;
47744775 name = encodeLocalPrecheckedDiscriminator (ctx, name, discriminator);
47754776 appendIdentifier (name.str ());
47764777 } else {
@@ -4875,7 +4876,10 @@ void ASTMangler::appendMacroExpansionContext(
48754876 return appendMacroExpansionLoc ();
48764877
48774878 // Append our own context and discriminator.
4878- appendMacroExpansionContext (outerExpansionLoc, origDC, expansion);
4879+ appendMacroExpansionContext (
4880+ outerExpansionLoc, origDC,
4881+ macroName,
4882+ macroDiscriminator);
48794883 appendMacroExpansionOperator (
48804884 baseName.userFacingName (), role, discriminator);
48814885}
@@ -4902,16 +4906,14 @@ void ASTMangler::appendMacroExpansionOperator(
49024906}
49034907
49044908static StringRef getPrivateDiscriminatorIfNecessary (
4905- const MacroExpansionExpr *expansion) {
4906- auto dc = MacroDiscriminatorContext::getInnermostMacroContext (
4907- expansion->getDeclContext ());
4908- auto decl = dc->getAsDecl ();
4909+ const DeclContext *macroDC) {
4910+ auto decl = macroDC->getAsDecl ();
49094911 if (decl && !decl->isOutermostPrivateOrFilePrivateScope ())
49104912 return StringRef ();
49114913
49124914 // Mangle non-local private declarations with a textual discriminator
49134915 // based on their enclosing file.
4914- auto topLevelSubcontext = dc ->getModuleScopeContext ();
4916+ auto topLevelSubcontext = macroDC ->getModuleScopeContext ();
49154917 SourceFile *sf = dyn_cast<SourceFile>(topLevelSubcontext);
49164918 if (!sf)
49174919 return StringRef ();
@@ -4927,6 +4929,13 @@ static StringRef getPrivateDiscriminatorIfNecessary(
49274929 return discriminator.str ();
49284930}
49294931
4932+ static StringRef getPrivateDiscriminatorIfNecessary (
4933+ const MacroExpansionExpr *expansion) {
4934+ auto dc = MacroDiscriminatorContext::getInnermostMacroContext (
4935+ expansion->getDeclContext ());
4936+ return getPrivateDiscriminatorIfNecessary (dc);
4937+ }
4938+
49304939static StringRef getPrivateDiscriminatorIfNecessary (
49314940 const FreestandingMacroExpansion *expansion) {
49324941 switch (expansion->getFreestandingMacroKind ()) {
@@ -4943,7 +4952,8 @@ void
49434952ASTMangler::appendMacroExpansion (const FreestandingMacroExpansion *expansion) {
49444953 appendMacroExpansionContext (expansion->getPoundLoc (),
49454954 expansion->getDeclContext (),
4946- expansion);
4955+ expansion->getMacroName ().getBaseIdentifier (),
4956+ expansion->getDiscriminator ());
49474957 auto privateDiscriminator = getPrivateDiscriminatorIfNecessary (expansion);
49484958 if (!privateDiscriminator.empty ()) {
49494959 appendIdentifier (privateDiscriminator);
@@ -4955,6 +4965,42 @@ ASTMangler::appendMacroExpansion(const FreestandingMacroExpansion *expansion) {
49554965 expansion->getDiscriminator ());
49564966}
49574967
4968+ void ASTMangler::appendMacroExpansion (ClosureExpr *attachedTo,
4969+ CustomAttr *attr,
4970+ MacroDecl *macro) {
4971+ auto &ctx = attachedTo->getASTContext ();
4972+ auto discriminator =
4973+ ctx.getNextMacroDiscriminator (attachedTo,
4974+ macro->getBaseName ());
4975+
4976+ appendMacroExpansionContext (
4977+ attr->getLocation (),
4978+ attachedTo,
4979+ macro->getBaseName ().getIdentifier (),
4980+ discriminator);
4981+
4982+ auto privateDiscriminator =
4983+ getPrivateDiscriminatorIfNecessary (attachedTo);
4984+ if (!privateDiscriminator.empty ()) {
4985+ appendIdentifier (privateDiscriminator);
4986+ appendOperator (" Ll" );
4987+ }
4988+
4989+ appendMacroExpansionOperator (
4990+ macro->getBaseName ().userFacingName (),
4991+ MacroRole::Body,
4992+ discriminator);
4993+ }
4994+
4995+ std::string
4996+ ASTMangler::mangleAttachedMacroExpansion (ClosureExpr *attachedTo,
4997+ CustomAttr *attr,
4998+ MacroDecl *macro) {
4999+ beginMangling ();
5000+ appendMacroExpansion (attachedTo, attr, macro);
5001+ return finalize ();
5002+ }
5003+
49585004std::string
49595005ASTMangler::mangleMacroExpansion (const FreestandingMacroExpansion *expansion) {
49605006 beginMangling ();
0 commit comments