@@ -77,24 +77,17 @@ extension ASTGenVisitor {
77
77
. unimplementable:
78
78
return self . generateSimpleTypeAttr ( attribute: node, kind: attrKind)
79
79
80
- case . opened:
81
- fatalError ( " unimplemented " )
82
- case . packElement:
83
- fatalError ( " unimplemented " )
84
- case . differentiable:
85
- fatalError ( " unimplemented " )
86
80
case . convention:
87
81
return self . generateConventionTypeAttr ( attribute: node) ? . asTypeAttribute
82
+ case . differentiable:
88
83
fatalError ( " unimplemented " )
84
+ case . execution:
85
+ return self . generateExecutionTypeAttr ( attribute: node) ? . asTypeAttribute
89
86
case . opaqueReturnTypeOf:
90
- fatalError ( " unimplemented " )
91
-
87
+ return self . generateOpaqueReturnTypeOfTypeAttr ( attribute: node) ? . asTypeAttribute
92
88
case . isolated:
93
89
return self . generateIsolatedTypeAttr ( attribute: node) ? . asTypeAttribute
94
90
95
- case . execution:
96
- return self . generateExecutionTypeAttr ( attribute: node) ? . asTypeAttribute
97
-
98
91
// SIL type attributes are not supported.
99
92
case . autoreleased,
100
93
. blockStorage,
@@ -116,8 +109,10 @@ extension ASTGenVisitor {
116
109
. inoutAliasable,
117
110
. moveOnly,
118
111
. objCMetatype,
112
+ . opened,
119
113
. out,
120
114
. owned,
115
+ . packElement,
121
116
. silIsolated,
122
117
. silUnmanaged,
123
118
. silUnowned,
@@ -148,7 +143,7 @@ extension ASTGenVisitor {
148
143
}
149
144
150
145
func generateConventionTypeAttr( attribute node: AttributeSyntax ) -> BridgedConventionTypeAttr ? {
151
- // FIXME: This don 't need custom attribute arguments syntax.
146
+ // FIXME: This doesn 't need custom attribute arguments syntax.
152
147
// FIXME: Support 'witness_method' argument.
153
148
guard let args = node. arguments? . as ( ConventionAttributeArgumentsSyntax . self) else {
154
149
// TODO: Diangose.
@@ -171,7 +166,7 @@ extension ASTGenVisitor {
171
166
self . ctx,
172
167
atLoc: self . generateSourceLoc ( node. atSign) ,
173
168
nameLoc: self . generateSourceLoc ( node. attributeName) ,
174
- parensRange: self . generateSourceRange ( start : node. leftParen! , end : node . rightParen! ) ,
169
+ parensRange: self . generateAttrParensRange ( attribute : node) ,
175
170
name: ctx. allocateCopy ( string: args. conventionLabel. rawText. bridged) ,
176
171
nameLoc: self . generateSourceLoc ( args. conventionLabel) ,
177
172
witnessMethodProtocol: witnessMethodProtocol,
@@ -180,67 +175,96 @@ extension ASTGenVisitor {
180
175
)
181
176
}
182
177
183
- func generateIsolatedTypeAttr( attribute node: AttributeSyntax ) -> BridgedIsolatedTypeAttr ? {
184
- guard case . argumentList( let isolatedArgs) = node. arguments,
185
- isolatedArgs. count == 1 ,
186
- let labelArg = isolatedArgs. first,
187
- labelArg. label == nil ,
188
- let isolationKindExpr = labelArg. expression. as ( DeclReferenceExprSyntax . self) ,
189
- isolationKindExpr. argumentNames == nil
190
- else {
191
- // TODO: Diagnose.
178
+ func generateExecutionTypeAttr( attribute node: AttributeSyntax ) -> BridgedExecutionTypeAttr ? {
179
+ let behaviorLoc = self . generateSourceLoc ( node. arguments)
180
+ let behavior : BridgedExecutionTypeAttrExecutionKind ? = self . generateSingleAttrOption (
181
+ attribute: node,
182
+ {
183
+ switch $0. rawText {
184
+ case " concurrent " : return . concurrent
185
+ case " caller " : return . caller
186
+ default :
187
+ // TODO: Diagnose.
188
+ return nil
189
+ }
190
+ }
191
+ )
192
+ guard let behavior else {
192
193
return nil
193
194
}
195
+
196
+ return . createParsed(
197
+ self . ctx,
198
+ atLoc: self . generateSourceLoc ( node. atSign) ,
199
+ nameLoc: self . generateSourceLoc ( node. attributeName) ,
200
+ parensRange: self . generateAttrParensRange ( attribute: node) ,
201
+ behavior: behavior,
202
+ behaviorLoc: behaviorLoc
203
+ )
204
+ }
194
205
195
-
196
- var isolationKind : BridgedIsolatedTypeAttrIsolationKind
197
- switch isolationKindExpr. baseName {
198
- case " any " : isolationKind = . dynamicIsolation
199
- default :
200
- // TODO: Diagnose.
206
+ func generateIsolatedTypeAttr( attribute node: AttributeSyntax ) -> BridgedIsolatedTypeAttr ? {
207
+ let isolationKindLoc = self . generateSourceLoc ( node. arguments)
208
+ let isolationKind : BridgedIsolatedTypeAttrIsolationKind ? = self . generateSingleAttrOption (
209
+ attribute: node,
210
+ {
211
+ switch $0. rawText {
212
+ case " any " : return . dynamicIsolation
213
+ default :
214
+ // TODO: Diagnose.
215
+ return nil
216
+ }
217
+ }
218
+ )
219
+ guard let isolationKind else {
201
220
return nil
202
221
}
203
222
204
- return BridgedIsolatedTypeAttr . createParsed (
223
+ return . createParsed(
205
224
self . ctx,
206
225
atLoc: self . generateSourceLoc ( node. atSign) ,
207
226
nameLoc: self . generateSourceLoc ( node. attributeName) ,
208
- lpLoc: self . generateSourceLoc ( node. leftParen!) ,
209
- isolationKindLoc: self . generateSourceLoc ( isolationKindExpr. baseName) ,
227
+ parensRange: self . generateAttrParensRange ( attribute: node) ,
210
228
isolationKind: isolationKind,
211
- rpLoc : self . generateSourceLoc ( node . rightParen! )
229
+ isolationKindLoc : isolationKindLoc
212
230
)
213
231
}
214
232
215
- func generateExecutionTypeAttr( attribute node: AttributeSyntax ) -> BridgedExecutionTypeAttr ? {
216
- guard case . argumentList( let executionArgs) = node. arguments,
217
- executionArgs. count == 1 ,
218
- let labelArg = executionArgs. first,
219
- labelArg. label == nil ,
220
- let behaviorExpr = labelArg. expression. as ( DeclReferenceExprSyntax . self) ,
221
- behaviorExpr. argumentNames == nil
222
- else {
223
- // TODO: Diagnose.
224
- return nil
233
+ func generateOpaqueReturnTypeOfTypeAttr( attribute node: AttributeSyntax ) -> BridgedOpaqueReturnTypeOfTypeAttr ? {
234
+ // FIXME: This doesn't need custom attribute arguments syntax.
235
+ guard let args = node. arguments? . as ( OpaqueReturnTypeOfAttributeArgumentsSyntax . self) else {
236
+ // TODO: Diagnose
237
+ fatalError ( " expected arguments for @_opaqueReturnTypeOfType type attribute " )
225
238
}
226
239
227
- var behavior : BridgedExecutionTypeAttrExecutionKind
228
- switch behaviorExpr. baseName {
229
- case " concurrent " : behavior = . concurrent
230
- case " caller " : behavior = . caller
231
- default :
232
- // TODO: Diagnose.
233
- return nil
240
+ let mangledLoc = self . generateSourceLoc ( args. mangledName)
241
+ guard let mangled = self . generateStringLiteralTextIfNotInterpolated ( expr: args. mangledName) else {
242
+ // TODO: Diagnose
243
+ fatalError ( " expected string literal for @_opaqueReturnTypeOfType type attribute " )
244
+ }
245
+
246
+ let indexLoc = self . generateSourceLoc ( args. ordinal)
247
+ let index = Int ( args. ordinal. text, radix: 10 )
248
+ guard let index else {
249
+ // TODO: Diagnose
250
+ fatalError ( " expected integer literal for @_opaqueReturnTypeOfType type attribute " )
234
251
}
235
252
236
- return BridgedExecutionTypeAttr . createParsed (
253
+ return . createParsed(
237
254
self . ctx,
238
255
atLoc: self . generateSourceLoc ( node. atSign) ,
239
256
nameLoc: self . generateSourceLoc ( node. attributeName) ,
240
- lpLoc : self . generateSourceLoc ( node. leftParen! ) ,
241
- behaviorLoc : self . generateSourceLoc ( behaviorExpr . baseName ) ,
242
- behavior : behavior ,
243
- rpLoc : self . generateSourceLoc ( node . rightParen! )
257
+ parensRange : self . generateAttrParensRange ( attribute : node) ,
258
+ mangled : mangled ,
259
+ mangledLoc : mangledLoc ,
260
+ index : index , indexLoc : indexLoc
244
261
)
245
262
}
263
+
264
+ func generateAttrParensRange( attribute node: AttributeSyntax ) -> BridgedSourceRange {
265
+ guard let lParen = node. leftParen else {
266
+ return BridgedSourceRange ( )
267
+ }
268
+ return self . generateSourceRange ( start: lParen, end: node. lastToken ( viewMode: . sourceAccurate) !)
269
+ }
246
270
}
0 commit comments