@@ -77,24 +77,17 @@ extension ASTGenVisitor {
7777 . unimplementable:
7878 return self . generateSimpleTypeAttr ( attribute: node, kind: attrKind)
7979
80- case . opened:
81- fatalError ( " unimplemented " )
82- case . packElement:
83- fatalError ( " unimplemented " )
84- case . differentiable:
85- fatalError ( " unimplemented " )
8680 case . convention:
8781 return self . generateConventionTypeAttr ( attribute: node) ? . asTypeAttribute
82+ case . differentiable:
8883 fatalError ( " unimplemented " )
84+ case . execution:
85+ return self . generateExecutionTypeAttr ( attribute: node) ? . asTypeAttribute
8986 case . opaqueReturnTypeOf:
90- fatalError ( " unimplemented " )
91-
87+ return self . generateOpaqueReturnTypeOfTypeAttr ( attribute: node) ? . asTypeAttribute
9288 case . isolated:
9389 return self . generateIsolatedTypeAttr ( attribute: node) ? . asTypeAttribute
9490
95- case . execution:
96- return self . generateExecutionTypeAttr ( attribute: node) ? . asTypeAttribute
97-
9891 // SIL type attributes are not supported.
9992 case . autoreleased,
10093 . blockStorage,
@@ -116,8 +109,10 @@ extension ASTGenVisitor {
116109 . inoutAliasable,
117110 . moveOnly,
118111 . objCMetatype,
112+ . opened,
119113 . out,
120114 . owned,
115+ . packElement,
121116 . silIsolated,
122117 . silUnmanaged,
123118 . silUnowned,
@@ -148,7 +143,7 @@ extension ASTGenVisitor {
148143 }
149144
150145 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.
152147 // FIXME: Support 'witness_method' argument.
153148 guard let args = node. arguments? . as ( ConventionAttributeArgumentsSyntax . self) else {
154149 // TODO: Diangose.
@@ -171,7 +166,7 @@ extension ASTGenVisitor {
171166 self . ctx,
172167 atLoc: self . generateSourceLoc ( node. atSign) ,
173168 nameLoc: self . generateSourceLoc ( node. attributeName) ,
174- parensRange: self . generateSourceRange ( start : node. leftParen! , end : node . rightParen! ) ,
169+ parensRange: self . generateAttrParensRange ( attribute : node) ,
175170 name: ctx. allocateCopy ( string: args. conventionLabel. rawText. bridged) ,
176171 nameLoc: self . generateSourceLoc ( args. conventionLabel) ,
177172 witnessMethodProtocol: witnessMethodProtocol,
@@ -180,67 +175,96 @@ extension ASTGenVisitor {
180175 )
181176 }
182177
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 {
192193 return nil
193194 }
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+ }
194205
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 {
201220 return nil
202221 }
203222
204- return BridgedIsolatedTypeAttr . createParsed (
223+ return . createParsed(
205224 self . ctx,
206225 atLoc: self . generateSourceLoc ( node. atSign) ,
207226 nameLoc: self . generateSourceLoc ( node. attributeName) ,
208- lpLoc: self . generateSourceLoc ( node. leftParen!) ,
209- isolationKindLoc: self . generateSourceLoc ( isolationKindExpr. baseName) ,
227+ parensRange: self . generateAttrParensRange ( attribute: node) ,
210228 isolationKind: isolationKind,
211- rpLoc : self . generateSourceLoc ( node . rightParen! )
229+ isolationKindLoc : isolationKindLoc
212230 )
213231 }
214232
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 " )
225238 }
226239
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 " )
234251 }
235252
236- return BridgedExecutionTypeAttr . createParsed (
253+ return . createParsed(
237254 self . ctx,
238255 atLoc: self . generateSourceLoc ( node. atSign) ,
239256 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
244261 )
245262 }
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+ }
246270}
0 commit comments