11
11
//===----------------------------------------------------------------------===//
12
12
13
13
import SwiftDiagnostics
14
+ import SwiftOperators
14
15
@_spi ( MacroExpansion) import SwiftParser
15
16
import SwiftSyntax
16
17
import SwiftSyntaxBuilder
@@ -55,7 +56,7 @@ private func expandFreestandingMemberDeclList(
55
56
let expanded = try expandFreestandingMacro (
56
57
definition: definition,
57
58
macroRole: inferFreestandingMacroRole ( definition: definition) ,
58
- node: node. detach ( in: context) ,
59
+ node: node. detach ( in: context, foldingWith : . standardOperators ) ,
59
60
in: context,
60
61
indentationWidth: indentationWidth
61
62
)
@@ -80,7 +81,7 @@ private func expandFreestandingCodeItemList(
80
81
let expanded = try expandFreestandingMacro (
81
82
definition: definition,
82
83
macroRole: inferFreestandingMacroRole ( definition: definition) ,
83
- node: node. detach ( in: context) ,
84
+ node: node. detach ( in: context, foldingWith : . standardOperators ) ,
84
85
in: context,
85
86
indentationWidth: indentationWidth
86
87
)
@@ -108,7 +109,7 @@ private func expandFreestandingExpr(
108
109
let expanded = expandFreestandingMacro (
109
110
definition: definition,
110
111
macroRole: . expression,
111
- node: node. detach ( in: context) ,
112
+ node: node. detach ( in: context, foldingWith : . standardOperators ) ,
112
113
in: context,
113
114
indentationWidth: indentationWidth
114
115
)
@@ -134,7 +135,7 @@ private func expandMemberMacro(
134
135
let expanded = expandAttachedMacro (
135
136
definition: definition,
136
137
macroRole: . member,
137
- attributeNode: attributeNode. detach ( in: context) ,
138
+ attributeNode: attributeNode. detach ( in: context, foldingWith : . standardOperators ) ,
138
139
declarationNode: attachedTo. detach ( in: context) ,
139
140
parentDeclNode: nil ,
140
141
extendedType: nil ,
@@ -163,7 +164,7 @@ private func expandMemberAttributeMacro(
163
164
let expanded = expandAttachedMacro (
164
165
definition: definition,
165
166
macroRole: . memberAttribute,
166
- attributeNode: attributeNode. detach ( in: context) ,
167
+ attributeNode: attributeNode. detach ( in: context, foldingWith : . standardOperators ) ,
167
168
declarationNode: member. detach ( in: context) ,
168
169
parentDeclNode: declaration. detach ( in: context) ,
169
170
extendedType: nil ,
@@ -191,7 +192,7 @@ private func expandPeerMacroMember(
191
192
let expanded = expandAttachedMacro (
192
193
definition: definition,
193
194
macroRole: . peer,
194
- attributeNode: attributeNode. detach ( in: context) ,
195
+ attributeNode: attributeNode. detach ( in: context, foldingWith : . standardOperators ) ,
195
196
declarationNode: attachedTo. detach ( in: context) ,
196
197
parentDeclNode: nil ,
197
198
extendedType: nil ,
@@ -219,7 +220,7 @@ private func expandPeerMacroCodeItem(
219
220
let expanded = expandAttachedMacro (
220
221
definition: definition,
221
222
macroRole: . peer,
222
- attributeNode: attributeNode. detach ( in: context) ,
223
+ attributeNode: attributeNode. detach ( in: context, foldingWith : . standardOperators ) ,
223
224
declarationNode: attachedTo. detach ( in: context) ,
224
225
parentDeclNode: nil ,
225
226
extendedType: nil ,
@@ -251,7 +252,7 @@ private func expandAccessorMacroWithoutExistingAccessors(
251
252
let expanded = expandAttachedMacro (
252
253
definition: definition,
253
254
macroRole: . accessor,
254
- attributeNode: attributeNode. detach ( in: context) ,
255
+ attributeNode: attributeNode. detach ( in: context, foldingWith : . standardOperators ) ,
255
256
declarationNode: attachedTo. detach ( in: context) ,
256
257
parentDeclNode: nil ,
257
258
extendedType: nil ,
@@ -285,7 +286,7 @@ private func expandAccessorMacroWithExistingAccessors(
285
286
let expanded = expandAttachedMacro (
286
287
definition: definition,
287
288
macroRole: . accessor,
288
- attributeNode: attributeNode. detach ( in: context) ,
289
+ attributeNode: attributeNode. detach ( in: context, foldingWith : . standardOperators ) ,
289
290
declarationNode: attachedTo. detach ( in: context) ,
290
291
parentDeclNode: nil ,
291
292
extendedType: nil ,
@@ -322,7 +323,7 @@ private func expandExtensionMacro(
322
323
let expanded = expandAttachedMacro (
323
324
definition: definition,
324
325
macroRole: . extension,
325
- attributeNode: attributeNode. detach ( in: context) ,
326
+ attributeNode: attributeNode. detach ( in: context, foldingWith : . standardOperators ) ,
326
327
declarationNode: attachedTo. detach ( in: context) ,
327
328
parentDeclNode: nil ,
328
329
extendedType: extendedType. detach ( in: context) ,
@@ -983,4 +984,47 @@ private extension SyntaxProtocol {
983
984
984
985
return self . detached
985
986
}
987
+
988
+ /// Fold operators in this node using the given operator table, detach the
989
+ /// node and inform the macro expansion context, if it needs to know.
990
+ func detach(
991
+ in context: MacroExpansionContext ,
992
+ foldingWith operatorTable: OperatorTable ?
993
+ ) -> Syntax {
994
+ let folded : Syntax
995
+ if let operatorTable {
996
+ if let basicContext = context as? BasicMacroExpansionContext {
997
+ folded = basicContext. foldAllOperators ( of: self , with: operatorTable)
998
+ } else {
999
+ folded = operatorTable. foldAll ( self , errorHandler: { _ in /*ignore*/ } )
1000
+ }
1001
+ } else {
1002
+ folded = Syntax ( self )
1003
+ }
1004
+ return folded. detach ( in: context)
1005
+ }
1006
+ }
1007
+
1008
+ private extension FreestandingMacroExpansionSyntax {
1009
+ /// Same as `SyntaxProtocol.detach(in:foldingWith:)` but returns a node of type
1010
+ /// `Self` since we know that operator folding doesn't change the type of any
1011
+ /// `FreestandingMacroExpansionSyntax`.
1012
+ func detach(
1013
+ in context: MacroExpansionContext ,
1014
+ foldingWith operatorTable: OperatorTable ?
1015
+ ) -> Self {
1016
+ return ( detach ( in: context, foldingWith: operatorTable) as Syntax ) . cast ( Self . self)
1017
+ }
1018
+ }
1019
+
1020
+ private extension AttributeSyntax {
1021
+ /// Same as `SyntaxProtocol.detach(in:foldingWith:)` but returns a node of type
1022
+ /// `Self` since we know that operator folding doesn't change the type of any
1023
+ /// `AttributeSyntax`.
1024
+ func detach(
1025
+ in context: MacroExpansionContext ,
1026
+ foldingWith operatorTable: OperatorTable ?
1027
+ ) -> Self {
1028
+ return ( detach ( in: context, foldingWith: operatorTable) as Syntax ) . cast ( Self . self)
1029
+ }
986
1030
}
0 commit comments