Skip to content

Commit 725374e

Browse files
committed
[Macros] Implement attached extension macros.
1 parent bd11fce commit 725374e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+325
-38
lines changed

include/swift/AST/MacroDeclaration.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ enum class MacroRole: uint32_t {
5858
/// A freestanding macro that expands to expressions, statements and
5959
/// declarations in a code block.
6060
CodeItem = 0x80,
61+
/// An attached macro that adds extensions to the declaration the
62+
/// macro is attached to.
63+
Extension = 0x100,
6164

6265
// NOTE: When adding a new macro role, also add it to `getAllMacroRoles`.
6366
};

include/swift/AST/TypeCheckRequests.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4053,6 +4053,28 @@ class ExpandConformanceMacros
40534053
void noteCycleStep(DiagnosticEngine &diags) const;
40544054
};
40554055

4056+
/// Expand all extension macros attached to the given declaration.
4057+
///
4058+
/// Produces the set of macro expansion buffer IDs.
4059+
class ExpandExtensionMacros
4060+
: public SimpleRequest<ExpandExtensionMacros,
4061+
ArrayRef<unsigned>(NominalTypeDecl *),
4062+
RequestFlags::Cached> {
4063+
public:
4064+
using SimpleRequest::SimpleRequest;
4065+
4066+
private:
4067+
friend SimpleRequest;
4068+
4069+
ArrayRef<unsigned> evaluate(Evaluator &evaluator,
4070+
NominalTypeDecl *nominal) const;
4071+
4072+
public:
4073+
bool isCached() const { return true; }
4074+
void diagnoseCycle(DiagnosticEngine &diags) const;
4075+
void noteCycleStep(DiagnosticEngine &diags) const;
4076+
};
4077+
40564078
/// Expand all member attribute macros attached to the given
40574079
/// declaration.
40584080
///

include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,9 @@ SWIFT_REQUEST(TypeChecker, ExpandAccessorMacros,
460460
SWIFT_REQUEST(TypeChecker, ExpandConformanceMacros,
461461
ArrayRef<unsigned>(NominalTypeDecl *),
462462
Cached, NoLocationInfo)
463+
SWIFT_REQUEST(TypeChecker, ExpandExtensionMacros,
464+
ArrayRef<unsigned>(NominalTypeDecl *),
465+
Cached, NoLocationInfo)
463466
SWIFT_REQUEST(TypeChecker, ExpandSynthesizedMemberMacroRequest,
464467
ArrayRef<unsigned>(Decl *),
465468
Cached, NoLocationInfo)

include/swift/Basic/Features.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ EXPERIMENTAL_FEATURE(StaticAssert, false)
119119
EXPERIMENTAL_FEATURE(NamedOpaqueTypes, false)
120120
EXPERIMENTAL_FEATURE(FlowSensitiveConcurrencyCaptures, false)
121121
EXPERIMENTAL_FEATURE(CodeItemMacros, true)
122+
EXPERIMENTAL_FEATURE(ExtensionMacros, false)
122123
EXPERIMENTAL_FEATURE(TupleConformances, false)
123124
EXPERIMENTAL_FEATURE(InitAccessors, false)
124125

include/swift/Basic/SourceManager.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ class GeneratedSourceInfo {
5454
/// The expansion of an attached conformance macro.
5555
ConformanceMacroExpansion,
5656

57+
/// The expansion of an attached extension macro.
58+
ExtensionMacroExpansion,
59+
5760
/// A new function body that is replacing an existing function body.
5861
ReplacedFunctionBody,
5962

include/swift/Demangling/DemangleNodes.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ NODE(DifferentiableFunctionType)
9393
NODE(ExistentialMetatype)
9494
CONTEXT_NODE(ExplicitClosure)
9595
CONTEXT_NODE(Extension)
96+
NODE(ExtensionAttachedMacroExpansion)
9697
NODE(FieldOffset)
9798
NODE(FreestandingMacroExpansion)
9899
NODE(FullTypeMetadata)

lib/AST/ASTMangler.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3914,7 +3914,8 @@ void ASTMangler::appendMacroExpansionContext(
39143914
case GeneratedSourceInfo::MemberAttributeMacroExpansion:
39153915
case GeneratedSourceInfo::MemberMacroExpansion:
39163916
case GeneratedSourceInfo::PeerMacroExpansion:
3917-
case GeneratedSourceInfo::ConformanceMacroExpansion: {
3917+
case GeneratedSourceInfo::ConformanceMacroExpansion:
3918+
case GeneratedSourceInfo::ExtensionMacroExpansion: {
39183919
auto decl = ASTNode::getFromOpaqueValue(generatedSourceInfo->astNode)
39193920
.get<Decl *>();
39203921
auto attr = generatedSourceInfo->attachedMacroCustomAttr;
@@ -3940,6 +3941,10 @@ void ASTMangler::appendMacroExpansionContext(
39403941
role = MacroRole::Conformance;
39413942
break;
39423943

3944+
case GeneratedSourceInfo::ExtensionMacroExpansion:
3945+
role = MacroRole::Extension;
3946+
break;
3947+
39433948
default:
39443949
llvm_unreachable("Unhandled macro role");
39453950
}
@@ -4004,6 +4009,10 @@ void ASTMangler::appendMacroExpansionOperator(
40044009
case MacroRole::Conformance:
40054010
appendOperator("fMc", Index(discriminator));
40064011
break;
4012+
4013+
case MacroRole::Extension:
4014+
appendOperator("fMe", Index(discriminator));
4015+
break;
40074016
}
40084017
}
40094018

lib/AST/ASTPrinter.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2852,6 +2852,14 @@ static bool usesFeatureCodeItemMacros(Decl *decl) {
28522852
return macro->getMacroRoles().contains(MacroRole::CodeItem);
28532853
}
28542854

2855+
static bool usesFeatureExtensionMacros(Decl *decl) {
2856+
auto macro = dyn_cast<MacroDecl>(decl);
2857+
if (!macro)
2858+
return false;
2859+
2860+
return macro->getMacroRoles().contains(MacroRole::Extension);
2861+
}
2862+
28552863
static bool usesFeatureAttachedMacros(Decl *decl) {
28562864
auto macro = dyn_cast<MacroDecl>(decl);
28572865
if (!macro)

lib/AST/ASTScopeCreation.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ ASTSourceFileScope::ASTSourceFileScope(SourceFile *SF,
272272
case MacroRole::Accessor:
273273
case MacroRole::MemberAttribute:
274274
case MacroRole::Conformance:
275+
case MacroRole::Extension:
275276
parentLoc = expansion.getStartLoc();
276277
break;
277278
case MacroRole::Peer: {

lib/AST/ConformanceLookupTable.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,10 @@ void ConformanceLookupTable::updateLookupTable(NominalTypeDecl *nominal,
286286
ASTContext &ctx = nominal->getASTContext();
287287
(void)evaluateOrDefault(
288288
ctx.evaluator, ExpandConformanceMacros{nominal}, { });
289+
290+
// Expand extension macros.
291+
(void)evaluateOrDefault(
292+
ctx.evaluator, ExpandExtensionMacros{nominal}, { });
289293
},
290294
[&](ExtensionDecl *ext,
291295
ArrayRef<ConformanceConstructionInfo> protos) {

0 commit comments

Comments
 (0)