Skip to content

Commit 7a46466

Browse files
authored
Merge pull request #66967 from hborla/extension-macro
[Macros] Generalize `conformance` macros as `extension` macros
2 parents d427696 + 7e85ebd commit 7a46466

Some content is hidden

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

53 files changed

+651
-59
lines changed

include/swift/AST/Attr.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2397,36 +2397,45 @@ class ObjCImplementationAttr final : public DeclAttribute {
23972397
/// which declares one of the roles that a given macro can inhabit.
23982398
class MacroRoleAttr final
23992399
: public DeclAttribute,
2400-
private llvm::TrailingObjects<MacroRoleAttr, MacroIntroducedDeclName> {
2400+
private llvm::TrailingObjects<MacroRoleAttr, MacroIntroducedDeclName,
2401+
TypeExpr *> {
24012402
friend TrailingObjects;
24022403

24032404
MacroSyntax syntax;
24042405
MacroRole role;
24052406
unsigned numNames;
2407+
unsigned numConformances;
24062408
SourceLoc lParenLoc, rParenLoc;
24072409

24082410
MacroRoleAttr(SourceLoc atLoc, SourceRange range, MacroSyntax syntax,
24092411
SourceLoc lParenLoc, MacroRole role,
24102412
ArrayRef<MacroIntroducedDeclName> names,
2413+
ArrayRef<TypeExpr *> conformances,
24112414
SourceLoc rParenLoc, bool implicit);
24122415

24132416
public:
24142417
static MacroRoleAttr *create(ASTContext &ctx, SourceLoc atLoc,
24152418
SourceRange range, MacroSyntax syntax,
24162419
SourceLoc lParenLoc, MacroRole role,
24172420
ArrayRef<MacroIntroducedDeclName> names,
2421+
ArrayRef<TypeExpr *> conformances,
24182422
SourceLoc rParenLoc, bool implicit);
24192423

24202424
size_t numTrailingObjects(OverloadToken<MacroIntroducedDeclName>) const {
24212425
return numNames;
24222426
}
24232427

2428+
size_t numTrailingObjects(OverloadToken<TypeExpr *>) const {
2429+
return numConformances;
2430+
}
2431+
24242432
SourceLoc getLParenLoc() const { return lParenLoc; }
24252433
SourceLoc getRParenLoc() const { return rParenLoc; }
24262434

24272435
MacroSyntax getMacroSyntax() const { return syntax; }
24282436
MacroRole getMacroRole() const { return role; }
24292437
ArrayRef<MacroIntroducedDeclName> getNames() const;
2438+
ArrayRef<TypeExpr *> getConformances() const;
24302439
bool hasNameKind(MacroIntroducedDeclNameKind kind) const;
24312440

24322441
static bool classof(const DeclAttribute *DA) {

include/swift/AST/DiagnosticsSema.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7263,6 +7263,9 @@ ERROR(global_arbitrary_name,none,
72637263
"'%0' macros are not allowed to introduce arbitrary names "
72647264
"at global scope",
72657265
(StringRef))
7266+
ERROR(local_extension_macro,none,
7267+
"local type cannot have attached extension macro",
7268+
())
72667269

72677270
ERROR(macro_resolve_circular_reference, none,
72687271
"circular reference resolving %select{freestanding|attached}0 macro %1",

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/PrintOptions.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,11 @@ struct PrintOptions {
578578
/// If false, we print them as ordinary associated types.
579579
bool PrintPrimaryAssociatedTypes = true;
580580

581+
/// Whether or not to print \c @attached(extension) attributes on
582+
/// macro declarations. This is used for feature suppression in
583+
/// Swift interface printing.
584+
bool PrintExtensionMacroAttributes = true;
585+
581586
/// If this is not \c nullptr then function bodies (including accessors
582587
/// and constructors) will be printed by this function.
583588
std::function<void(const ValueDecl *, ASTPrinter &)> FunctionBody;

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: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ EXPERIMENTAL_FEATURE(CodeItemMacros, true)
123123
EXPERIMENTAL_FEATURE(TupleConformances, false)
124124
EXPERIMENTAL_FEATURE(InitAccessors, false)
125125

126+
EXPERIMENTAL_FEATURE(ExtensionMacros, false)
127+
SUPPRESSIBLE_LANGUAGE_FEATURE(ExtensionMacroAttr, 0, "@attached(extension)", true)
128+
126129
// Whether to enable @_used and @_section attributes
127130
EXPERIMENTAL_FEATURE(SymbolLinkageMarkers, true)
128131

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

0 commit comments

Comments
 (0)