Skip to content

Commit 137cb6b

Browse files
authored
Merge pull request swiftlang#70023 from DougGregor/yet-more-macro-role-metaprogramming
2 parents f58a46f + 6fa556b commit 137cb6b

File tree

8 files changed

+54
-181
lines changed

8 files changed

+54
-181
lines changed

include/swift/Basic/MacroRoles.def

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@
1616
//===----------------------------------------------------------------------===//
1717

1818
#ifndef ATTACHED_MACRO_ROLE
19-
# define ATTACHED_MACRO_ROLE(Name, Description) MACRO_ROLE(Name, Description)
19+
# define ATTACHED_MACRO_ROLE(Name, Description, MangledChar) MACRO_ROLE(Name, Description)
2020
#endif
2121

2222
#ifndef FREESTANDING_MACRO_ROLE
2323
# define FREESTANDING_MACRO_ROLE(Name, Description) MACRO_ROLE(Name, Description)
2424
#endif
2525

2626
#ifndef EXPERIMENTAL_ATTACHED_MACRO_ROLE
27-
# define EXPERIMENTAL_ATTACHED_MACRO_ROLE(Name, Description, Feature) \
28-
ATTACHED_MACRO_ROLE(Name, Description)
27+
# define EXPERIMENTAL_ATTACHED_MACRO_ROLE(Name, Description, MangledChar, Feature) \
28+
ATTACHED_MACRO_ROLE(Name, Description, MangledChar)
2929
#endif
3030

3131
#ifndef EXPERIMENTAL_FREESTANDING_MACRO_ROLE
@@ -43,31 +43,31 @@ FREESTANDING_MACRO_ROLE(Declaration, "declaration")
4343

4444
/// An attached macro that declares accessors for a variable or subscript
4545
/// declaration.
46-
ATTACHED_MACRO_ROLE(Accessor, "accessor")
46+
ATTACHED_MACRO_ROLE(Accessor, "accessor", "a")
4747

4848
/// An attached macro that generates attributes for the
4949
/// members inside the declaration.
50-
ATTACHED_MACRO_ROLE(MemberAttribute, "memberAttribute")
50+
ATTACHED_MACRO_ROLE(MemberAttribute, "memberAttribute", "r")
5151

5252
/// An attached macro that generates synthesized members
5353
/// inside the declaration.
54-
ATTACHED_MACRO_ROLE(Member, "member")
54+
ATTACHED_MACRO_ROLE(Member, "member", "m")
5555

5656
/// An attached macro that generates declarations that are peers
5757
/// of the declaration the macro is attached to.
58-
ATTACHED_MACRO_ROLE(Peer, "peer")
58+
ATTACHED_MACRO_ROLE(Peer, "peer", "p")
5959

6060
/// An attached macro that adds conformances to the declaration the
6161
/// macro is attached to.
62-
ATTACHED_MACRO_ROLE(Conformance, "conformance")
62+
ATTACHED_MACRO_ROLE(Conformance, "conformance", "c")
6363

6464
/// A freestanding macro that expands to expressions, statements and
6565
/// declarations in a code block.
6666
EXPERIMENTAL_FREESTANDING_MACRO_ROLE(CodeItem, "codeItem", CodeItemMacros)
6767

6868
/// An attached macro that adds extensions to the declaration the
6969
/// macro is attached to.
70-
ATTACHED_MACRO_ROLE(Extension, "extension")
70+
ATTACHED_MACRO_ROLE(Extension, "extension", "e")
7171

7272
#undef ATTACHED_MACRO_ROLE
7373
#undef FREESTANDING_MACRO_ROLE

lib/AST/ASTMangler.cpp

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3892,7 +3892,7 @@ void ASTMangler::appendMacroExpansionContext(
38923892
// Freestanding macros
38933893
#define FREESTANDING_MACRO_ROLE(Name, Description) \
38943894
case GeneratedSourceInfo::Name##MacroExpansion:
3895-
#define ATTACHED_MACRO_ROLE(Name, Description)
3895+
#define ATTACHED_MACRO_ROLE(Name, Description, MangledChar)
38963896
#include "swift/Basic/MacroRoles.def"
38973897
{
38983898
auto parent = ASTNode::getFromOpaqueValue(generatedSourceInfo->astNode);
@@ -3914,7 +3914,7 @@ void ASTMangler::appendMacroExpansionContext(
39143914

39153915
// Attached macros
39163916
#define FREESTANDING_MACRO_ROLE(Name, Description)
3917-
#define ATTACHED_MACRO_ROLE(Name, Description) \
3917+
#define ATTACHED_MACRO_ROLE(Name, Description, MangledChar) \
39183918
case GeneratedSourceInfo::Name##MacroExpansion:
39193919
#include "swift/Basic/MacroRoles.def"
39203920
{
@@ -3956,34 +3956,17 @@ void ASTMangler::appendMacroExpansionOperator(
39563956

39573957
switch (role) {
39583958
#define FREESTANDING_MACRO_ROLE(Name, Description) case MacroRole::Name:
3959-
#define ATTACHED_MACRO_ROLE(Name, Description)
3959+
#define ATTACHED_MACRO_ROLE(Name, Description, MangledChar)
39603960
#include "swift/Basic/MacroRoles.def"
39613961
appendOperator("fMf", Index(discriminator));
39623962
break;
39633963

3964-
case MacroRole::Accessor:
3965-
appendOperator("fMa", Index(discriminator));
3966-
break;
3967-
3968-
case MacroRole::MemberAttribute:
3969-
appendOperator("fMr", Index(discriminator));
3970-
break;
3971-
3972-
case MacroRole::Member:
3973-
appendOperator("fMm", Index(discriminator));
3974-
break;
3975-
3976-
case MacroRole::Peer:
3977-
appendOperator("fMp", Index(discriminator));
3978-
break;
3979-
3980-
case MacroRole::Conformance:
3981-
appendOperator("fMc", Index(discriminator));
3982-
break;
3983-
3984-
case MacroRole::Extension:
3985-
appendOperator("fMe", Index(discriminator));
3964+
#define FREESTANDING_MACRO_ROLE(Name, Description)
3965+
#define ATTACHED_MACRO_ROLE(Name, Description, MangledChar) \
3966+
case MacroRole::Name: \
3967+
appendOperator("fM" MangledChar, Index(discriminator)); \
39863968
break;
3969+
#include "swift/Basic/MacroRoles.def"
39873970
}
39883971
}
39893972

lib/AST/Decl.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11019,12 +11019,12 @@ StringRef swift::getMacroIntroducedDeclNameString(
1101911019
static MacroRoles freestandingMacroRoles =
1102011020
(MacroRoles()
1102111021
#define FREESTANDING_MACRO_ROLE(Name, Description) | MacroRole::Name
11022-
#define ATTACHED_MACRO_ROLE(Name, Description)
11022+
#define ATTACHED_MACRO_ROLE(Name, Description, MangledChar)
1102311023
#include "swift/Basic/MacroRoles.def"
1102411024
);
1102511025
static MacroRoles attachedMacroRoles =
1102611026
(MacroRoles()
11027-
#define ATTACHED_MACRO_ROLE(Name, Description) | MacroRole::Name
11027+
#define ATTACHED_MACRO_ROLE(Name, Description, MangledChar) | MacroRole::Name
1102811028
#define FREESTANDING_MACRO_ROLE(Name, Description)
1102911029
#include "swift/Basic/MacroRoles.def"
1103011030
);
@@ -11049,7 +11049,7 @@ bool swift::isMacroSupported(MacroRole role, ASTContext &ctx) {
1104911049
switch (role) {
1105011050
#define EXPERIMENTAL_ATTACHED_MACRO_ROLE(Name, Description, FeatureName) \
1105111051
case MacroRole::Name: \
11052-
return ctx.LangOpts.hasFeature(FeatureName::CodeItemMacros);
11052+
return ctx.LangOpts.hasFeature(Feature::FeatureName);
1105311053

1105411054
#define EXPERIMENTAL_FREESTANDING_MACRO_ROLE(Name, Description, FeatureName) \
1105511055
case MacroRole::Name: return ctx.LangOpts.hasFeature(Feature::FeatureName);
@@ -11506,7 +11506,7 @@ MacroDiscriminatorContext MacroDiscriminatorContext::getParentOf(
1150611506
// Attached macros
1150711507
#define FREESTANDING_MACRO_ROLE(Name, Description) \
1150811508
case GeneratedSourceInfo::Name##MacroExpansion:
11509-
#define ATTACHED_MACRO_ROLE(Name, Description)
11509+
#define ATTACHED_MACRO_ROLE(Name, Description, MangledChar)
1151011510
#include "swift/Basic/MacroRoles.def"
1151111511
{
1151211512
auto node = ASTNode::getFromOpaqueValue(generatedSourceInfo->astNode);
@@ -11525,7 +11525,7 @@ MacroDiscriminatorContext MacroDiscriminatorContext::getParentOf(
1152511525

1152611526
// Attached macros
1152711527
#define FREESTANDING_MACRO_ROLE(Name, Description)
11528-
#define ATTACHED_MACRO_ROLE(Name, Description) \
11528+
#define ATTACHED_MACRO_ROLE(Name, Description, MangledChar) \
1152911529
case GeneratedSourceInfo::Name##MacroExpansion:
1153011530
#include "swift/Basic/MacroRoles.def"
1153111531
case GeneratedSourceInfo::PrettyPrinted:

lib/Demangling/Demangler.cpp

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4109,48 +4109,21 @@ NodePointer Demangler::demangleMacroExpansion() {
41094109
bool isAttached;
41104110
bool isFreestanding;
41114111
switch (nextChar()) {
4112-
case 'a':
4113-
kind = Node::Kind::AccessorAttachedMacroExpansion;
4114-
isAttached = true;
4115-
isFreestanding = false;
4116-
break;
4117-
4118-
case 'r':
4119-
kind = Node::Kind::MemberAttributeAttachedMacroExpansion;
4120-
isAttached = true;
4121-
isFreestanding = false;
4112+
#define FREESTANDING_MACRO_ROLE(Name, Description)
4113+
#define ATTACHED_MACRO_ROLE(Name, Description, MangledChar) \
4114+
case MangledChar[0]: \
4115+
kind = Node::Kind::Name##AttachedMacroExpansion; \
4116+
isAttached = true; \
4117+
isFreestanding = false; \
41224118
break;
4119+
#include "swift/Basic/MacroRoles.def"
41234120

41244121
case 'f':
41254122
kind = Node::Kind::FreestandingMacroExpansion;
41264123
isAttached = false;
41274124
isFreestanding = true;
41284125
break;
41294126

4130-
case 'm':
4131-
kind = Node::Kind::MemberAttachedMacroExpansion;
4132-
isAttached = true;
4133-
isFreestanding = false;
4134-
break;
4135-
4136-
case 'p':
4137-
kind = Node::Kind::PeerAttachedMacroExpansion;
4138-
isAttached = true;
4139-
isFreestanding = false;
4140-
break;
4141-
4142-
case 'c':
4143-
kind = Node::Kind::ConformanceAttachedMacroExpansion;
4144-
isAttached = true;
4145-
isFreestanding = false;
4146-
break;
4147-
4148-
case 'e':
4149-
kind = Node::Kind::ExtensionAttachedMacroExpansion;
4150-
isAttached = true;
4151-
isFreestanding = false;
4152-
break;
4153-
41544127
case 'u':
41554128
kind = Node::Kind::MacroExpansionUniqueName;
41564129
isAttached = false;

lib/Demangling/OldRemangler.cpp

Lines changed: 9 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,47 +1080,15 @@ ManglingError Remangler::mangleFreestandingMacroExpansion(
10801080
return mangleChildNodes(node, depth + 1);
10811081
}
10821082

1083-
ManglingError Remangler::mangleAccessorAttachedMacroExpansion(
1084-
Node *node, unsigned depth) {
1085-
Buffer << "fMa";
1086-
RETURN_IF_ERROR(mangleIndex(node, depth + 1));
1087-
return mangleChildNodes(node, depth + 1);
1088-
}
1089-
1090-
ManglingError Remangler::mangleMemberAttributeAttachedMacroExpansion(
1091-
Node *node, unsigned depth) {
1092-
Buffer << "fMr";
1093-
RETURN_IF_ERROR(mangleIndex(node, depth + 1));
1094-
return mangleChildNodes(node, depth + 1);
1095-
}
1096-
1097-
ManglingError Remangler::mangleMemberAttachedMacroExpansion(
1098-
Node *node, unsigned depth) {
1099-
Buffer << "fMm";
1100-
RETURN_IF_ERROR(mangleIndex(node, depth + 1));
1101-
return mangleChildNodes(node, depth + 1);
1102-
}
1103-
1104-
ManglingError Remangler::manglePeerAttachedMacroExpansion(
1105-
Node *node, unsigned depth) {
1106-
Buffer << "fMp";
1107-
RETURN_IF_ERROR(mangleIndex(node, depth + 1));
1108-
return mangleChildNodes(node, depth + 1);
1109-
}
1110-
1111-
ManglingError Remangler::mangleConformanceAttachedMacroExpansion(
1112-
Node *node, unsigned depth) {
1113-
Buffer << "fMc";
1114-
RETURN_IF_ERROR(mangleIndex(node, depth + 1));
1115-
return mangleChildNodes(node, depth + 1);
1116-
}
1117-
1118-
ManglingError Remangler::mangleExtensionAttachedMacroExpansion(
1119-
Node *node, unsigned depth) {
1120-
Buffer << "fMe";
1121-
RETURN_IF_ERROR(mangleIndex(node, depth + 1));
1122-
return mangleChildNodes(node, depth + 1);
1123-
}
1083+
#define FREESTANDING_MACRO_ROLE(Name, Description)
1084+
#define ATTACHED_MACRO_ROLE(Name, Description, MangledChar) \
1085+
ManglingError Remangler::mangle##Name##AttachedMacroExpansion( \
1086+
Node *node, unsigned depth) { \
1087+
Buffer << "fM" MangledChar; \
1088+
RETURN_IF_ERROR(mangleIndex(node, depth + 1)); \
1089+
return mangleChildNodes(node, depth + 1); \
1090+
}
1091+
#include "swift/Basic/MacroRoles.def"
11241092

11251093
ManglingError Remangler::mangleMacroExpansionUniqueName(
11261094
Node *node, unsigned depth) {

lib/Demangling/Remangler.cpp

Lines changed: 11 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2930,59 +2930,17 @@ ManglingError Remangler::mangleFreestandingMacroExpansion(
29302930
return mangleChildNode(node, 2, depth + 1);
29312931
}
29322932

2933-
ManglingError Remangler::mangleAccessorAttachedMacroExpansion(
2934-
Node *node, unsigned depth) {
2935-
RETURN_IF_ERROR(mangleChildNode(node, 0, depth + 1));
2936-
RETURN_IF_ERROR(mangleChildNode(node, 1, depth + 1));
2937-
RETURN_IF_ERROR(mangleChildNode(node, 2, depth + 1));
2938-
Buffer << "fMa";
2939-
return mangleChildNode(node, 3, depth + 1);
2940-
}
2941-
2942-
ManglingError Remangler::mangleMemberAttributeAttachedMacroExpansion(
2943-
Node *node, unsigned depth) {
2944-
RETURN_IF_ERROR(mangleChildNode(node, 0, depth + 1));
2945-
RETURN_IF_ERROR(mangleChildNode(node, 1, depth + 1));
2946-
RETURN_IF_ERROR(mangleChildNode(node, 2, depth + 1));
2947-
Buffer << "fMr";
2948-
return mangleChildNode(node, 3, depth + 1);
2949-
}
2950-
2951-
ManglingError Remangler::mangleMemberAttachedMacroExpansion(
2952-
Node *node, unsigned depth) {
2953-
RETURN_IF_ERROR(mangleChildNode(node, 0, depth + 1));
2954-
RETURN_IF_ERROR(mangleChildNode(node, 1, depth + 1));
2955-
RETURN_IF_ERROR(mangleChildNode(node, 2, depth + 1));
2956-
Buffer << "fMm";
2957-
return mangleChildNode(node, 3, depth + 1);
2958-
}
2959-
2960-
ManglingError Remangler::manglePeerAttachedMacroExpansion(
2961-
Node *node, unsigned depth) {
2962-
RETURN_IF_ERROR(mangleChildNode(node, 0, depth + 1));
2963-
RETURN_IF_ERROR(mangleChildNode(node, 1, depth + 1));
2964-
RETURN_IF_ERROR(mangleChildNode(node, 2, depth + 1));
2965-
Buffer << "fMp";
2966-
return mangleChildNode(node, 3, depth + 1);
2967-
}
2968-
2969-
ManglingError Remangler::mangleConformanceAttachedMacroExpansion(
2970-
Node *node, unsigned depth) {
2971-
RETURN_IF_ERROR(mangleChildNode(node, 0, depth + 1));
2972-
RETURN_IF_ERROR(mangleChildNode(node, 1, depth + 1));
2973-
RETURN_IF_ERROR(mangleChildNode(node, 2, depth + 1));
2974-
Buffer << "fMc";
2975-
return mangleChildNode(node, 3, depth + 1);
2976-
}
2977-
2978-
ManglingError Remangler::mangleExtensionAttachedMacroExpansion(
2979-
Node *node, unsigned depth) {
2980-
RETURN_IF_ERROR(mangleChildNode(node, 0, depth + 1));
2981-
RETURN_IF_ERROR(mangleChildNode(node, 1, depth + 1));
2982-
RETURN_IF_ERROR(mangleChildNode(node, 2, depth + 1));
2983-
Buffer << "fMe";
2984-
return mangleChildNode(node, 3, depth + 1);
2985-
}
2933+
#define FREESTANDING_MACRO_ROLE(Name, Description)
2934+
#define ATTACHED_MACRO_ROLE(Name, Description, MangledChar) \
2935+
ManglingError Remangler::mangle##Name##AttachedMacroExpansion( \
2936+
Node *node, unsigned depth) { \
2937+
RETURN_IF_ERROR(mangleChildNode(node, 0, depth + 1)); \
2938+
RETURN_IF_ERROR(mangleChildNode(node, 1, depth + 1)); \
2939+
RETURN_IF_ERROR(mangleChildNode(node, 2, depth + 1)); \
2940+
Buffer << "fM" MangledChar; \
2941+
return mangleChildNode(node, 3, depth + 1); \
2942+
}
2943+
#include "swift/Basic/MacroRoles.def"
29862944

29872945
ManglingError Remangler::mangleMacroExpansionUniqueName(
29882946
Node *node, unsigned depth) {

lib/Sema/TypeCheckMacros.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ bool swift::isInvalidAttachedMacro(MacroRole role,
570570
Decl *attachedTo) {
571571
switch (role) {
572572
#define FREESTANDING_MACRO_ROLE(Name, Description) case MacroRole::Name:
573-
#define ATTACHED_MACRO_ROLE(Name, Description)
573+
#define ATTACHED_MACRO_ROLE(Name, Description, MangledChar)
574574
#include "swift/Basic/MacroRoles.def"
575575
llvm_unreachable("Invalid macro role for attached macro");
576576

lib/Serialization/Serialization.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2343,20 +2343,11 @@ getStableSelfAccessKind(swift::SelfAccessKind MM) {
23432343

23442344
static uint8_t getRawStableMacroRole(swift::MacroRole context) {
23452345
switch (context) {
2346-
#define CASE(NAME) \
2347-
case swift::MacroRole::NAME: \
2348-
return static_cast<uint8_t>(serialization::MacroRole::NAME);
2349-
CASE(Expression)
2350-
CASE(Declaration)
2351-
CASE(Accessor)
2352-
CASE(MemberAttribute)
2353-
CASE(Member)
2354-
CASE(Peer)
2355-
CASE(Conformance)
2356-
CASE(CodeItem)
2357-
CASE(Extension)
2346+
#define MACRO_ROLE(Name, Description) \
2347+
case swift::MacroRole::Name: \
2348+
return static_cast<uint8_t>(serialization::MacroRole::Name);
2349+
#include "swift/Basic/MacroRoles.def"
23582350
}
2359-
#undef CASE
23602351
llvm_unreachable("bad result declaration macro kind");
23612352
}
23622353

0 commit comments

Comments
 (0)