@@ -91,6 +91,9 @@ extension ASTGenVisitor {
9191 case . isolated:
9292 return self . generateIsolatedTypeAttr ( attribute: node)
9393
94+ case . execution:
95+ return self . generateExecutionTypeAttr ( attribute: node)
96+
9497 // SIL type attributes are not supported.
9598 case . autoreleased,
9699 . blockStorage,
@@ -173,4 +176,35 @@ extension ASTGenVisitor {
173176 isolationKind: isolationKind,
174177 rpLoc: self . generateSourceLoc ( node. rightParen!) )
175178 }
179+
180+ func generateExecutionTypeAttr( attribute node: AttributeSyntax ) -> BridgedTypeAttribute ? {
181+ guard case . argumentList( let executionArgs) = node. arguments,
182+ executionArgs. count == 1 ,
183+ let labelArg = executionArgs. first,
184+ labelArg. label == nil ,
185+ let behaviorExpr = labelArg. expression. as ( DeclReferenceExprSyntax . self) ,
186+ behaviorExpr. argumentNames == nil
187+ else {
188+ // TODO: Diagnose.
189+ return nil
190+ }
191+
192+ var behavior : BridgedExecutionTypeAttrExecutionKind
193+ switch behaviorExpr. baseName {
194+ case " concurrent " : behavior = . concurrent
195+ case " caller " : behavior = . caller
196+ default :
197+ // TODO: Diagnose.
198+ return nil
199+ }
200+
201+ return BridgedTypeAttribute . createExecution (
202+ self . ctx,
203+ atLoc: self . generateSourceLoc ( node. atSign) ,
204+ nameLoc: self . generateSourceLoc ( node. attributeName) ,
205+ lpLoc: self . generateSourceLoc ( node. leftParen!) ,
206+ behaviorLoc: self . generateSourceLoc ( behaviorExpr. baseName) ,
207+ behavior: behavior,
208+ rpLoc: self . generateSourceLoc ( node. rightParen!) )
209+ }
176210}
0 commit comments