@@ -1316,19 +1316,7 @@ std::vector<Diagnostic> DiagnosticEngine::getGeneratedSourceBufferNotes(
13161316 case GeneratedSourceInfo::PeerMacroExpansion:
13171317 case GeneratedSourceInfo::ConformanceMacroExpansion: {
13181318 SourceRange origRange = expansionNode.getSourceRange ();
1319- DeclName macroName;
1320- if (auto customAttr = generatedInfo->attachedMacroCustomAttr ) {
1321- // FIXME: How will we handle deserialized custom attributes like this?
1322- auto declRefType = dyn_cast<DeclRefTypeRepr>(customAttr->getTypeRepr ());
1323- macroName = declRefType->getNameRef ().getFullName ();
1324- } else if (auto expansionExpr = dyn_cast_or_null<MacroExpansionExpr>(
1325- expansionNode.dyn_cast <Expr *>())) {
1326- macroName = expansionExpr->getMacroName ().getFullName ();
1327- } else {
1328- auto expansionDecl =
1329- cast<MacroExpansionDecl>(expansionNode.get <Decl *>());
1330- macroName = expansionDecl->getMacroName ().getFullName ();
1331- }
1319+ DeclName macroName = getGeneratedSourceInfoMacroName (*generatedInfo);
13321320
13331321 Diagnostic expansionNote (diag::in_macro_expansion, macroName);
13341322 expansionNote.setLoc (origRange.Start );
@@ -1510,3 +1498,37 @@ swift::getAccessorKindAndNameForDiagnostics(const ValueDecl *D) {
15101498
15111499 return {NOT_ACCESSOR_INDEX, D->getName ()};
15121500}
1501+
1502+ DeclName
1503+ swift::getGeneratedSourceInfoMacroName (const GeneratedSourceInfo &info) {
1504+ ASTNode expansionNode = ASTNode::getFromOpaqueValue (info.astNode );
1505+ switch (info.kind ) {
1506+ case GeneratedSourceInfo::ExpressionMacroExpansion:
1507+ case GeneratedSourceInfo::FreestandingDeclMacroExpansion:
1508+ case GeneratedSourceInfo::AccessorMacroExpansion:
1509+ case GeneratedSourceInfo::MemberAttributeMacroExpansion:
1510+ case GeneratedSourceInfo::MemberMacroExpansion:
1511+ case GeneratedSourceInfo::PeerMacroExpansion:
1512+ case GeneratedSourceInfo::ConformanceMacroExpansion: {
1513+ DeclName macroName;
1514+ if (auto customAttr = info.attachedMacroCustomAttr ) {
1515+ // FIXME: How will we handle deserialized custom attributes like this?
1516+ auto declRefType = cast<DeclRefTypeRepr>(customAttr->getTypeRepr ());
1517+ return declRefType->getNameRef ().getFullName ();
1518+ }
1519+
1520+ if (auto expansionExpr = dyn_cast_or_null<MacroExpansionExpr>(
1521+ expansionNode.dyn_cast <Expr *>())) {
1522+ return expansionExpr->getMacroName ().getFullName ();
1523+ }
1524+
1525+ auto expansionDecl =
1526+ cast<MacroExpansionDecl>(expansionNode.get <Decl *>());
1527+ return expansionDecl->getMacroName ().getFullName ();
1528+ }
1529+
1530+ case GeneratedSourceInfo::PrettyPrinted:
1531+ case GeneratedSourceInfo::ReplacedFunctionBody:
1532+ return DeclName ();
1533+ }
1534+ }
0 commit comments