2222
2323namespace swift {
2424
25+ class ASTContext ;
26+
2527// / A reference to an external macro definition that is understood by ASTGen.
2628struct ExternalMacroDefinition {
2729 enum class PluginKind {
@@ -46,6 +48,35 @@ enum class BuiltinMacroKind: uint8_t {
4648 ExternalMacro,
4749};
4850
51+ // / A single replacement
52+ struct ExpandedMacroReplacement {
53+ unsigned startOffset, endOffset;
54+ unsigned parameterIndex;
55+ };
56+
57+ // / An expansion of another macro.
58+ class ExpandedMacroDefinition {
59+ friend class MacroDefinition ;
60+
61+ // / The expansion text, ASTContext-allocated.
62+ StringRef expansionText;
63+
64+ // / The macro replacements, ASTContext-allocated.
65+ ArrayRef<ExpandedMacroReplacement> replacements;
66+
67+ ExpandedMacroDefinition (
68+ StringRef expansionText,
69+ ArrayRef<ExpandedMacroReplacement> replacements
70+ ) : expansionText(expansionText), replacements(replacements) { }
71+
72+ public:
73+ StringRef getExpansionText () const { return expansionText; }
74+
75+ ArrayRef<ExpandedMacroReplacement> getReplacements () const {
76+ return replacements;
77+ }
78+ };
79+
4980// / Provides the definition of a macro.
5081class MacroDefinition {
5182public:
@@ -63,6 +94,9 @@ class MacroDefinition {
6394
6495 // / A builtin macro definition, which has a separate builtin kind.
6596 Builtin,
97+
98+ // / A macro that is defined as an expansion of another macro.
99+ Expanded,
66100 };
67101
68102 Kind kind;
@@ -71,6 +105,7 @@ class MacroDefinition {
71105 union Data {
72106 ExternalMacroReference external;
73107 BuiltinMacroKind builtin;
108+ ExpandedMacroDefinition expanded;
74109
75110 Data () : builtin (BuiltinMacroKind::ExternalMacro) { }
76111 } data;
@@ -85,6 +120,10 @@ class MacroDefinition {
85120 data.builtin = builtinKind;
86121 }
87122
123+ MacroDefinition (ExpandedMacroDefinition expanded) : kind(Kind::Expanded) {
124+ data.expanded = expanded;
125+ }
126+
88127public:
89128 static MacroDefinition forInvalid () {
90129 return MacroDefinition (Kind::Invalid);
@@ -105,6 +144,13 @@ class MacroDefinition {
105144 return MacroDefinition (builtinKind);
106145 }
107146
147+ // / Create a representation of an expanded macro definition.
148+ static MacroDefinition forExpanded (
149+ ASTContext &ctx,
150+ StringRef expansionText,
151+ ArrayRef<ExpandedMacroReplacement> replacements
152+ );
153+
108154 // / Retrieve the external macro being referenced.
109155 ExternalMacroReference getExternalMacro () const {
110156 assert (kind == Kind::External);
@@ -117,6 +163,11 @@ class MacroDefinition {
117163 return data.builtin ;
118164 }
119165
166+ ExpandedMacroDefinition getExpanded () const {
167+ assert (kind == Kind::Expanded);
168+ return data.expanded ;
169+ }
170+
120171 operator Kind () const { return kind; }
121172};
122173
0 commit comments