1+ // REQUIRES: concurrency
2+ // RUN: %target-swift-ide-test -batch-code-completion -source-filename %s -filecheck %raw-FileCheck -completion-output-dir %t -enable-experimental-concurrency
3+
4+ class MyNonSendable { }
5+ struct MySendable { }
6+
7+ @globalActor
8+ actor MyGlobalActor {
9+ static var shared = MyGlobalActor ( )
10+ }
11+
12+ @globalActor
13+ actor MyOtherGlobalActor {
14+ static var shared = MyOtherGlobalActor ( )
15+ }
16+
17+ @MyGlobalActor func globalFuncOnGlobalActor( ) { }
18+
19+ func takeClosure< T> ( _: ( ) async -> T ) { }
20+
21+ var otherInstanceOfMyClass = MyClass ( )
22+
23+ class MyClass {
24+ @MyGlobalActor func funcOnGlobalActor( ) -> Int { return 0 }
25+ @MyOtherGlobalActor func funcOnOtherGlobalActor( ) -> Int { return 0 }
26+ func funcSync( ) -> Int { return 0 }
27+
28+ @MyGlobalActor func nonSenableFuncOnGlobalActor( arg: MyNonSendable ) -> Int { return 0 }
29+ @MyOtherGlobalActor func nonSenableFuncOnOtherGlobalActor( arg: MyNonSendable ) -> Int { return 0 }
30+
31+ @MyGlobalActor var varOnGlobalActor : Int = 0
32+ @MyOtherGlobalActor var varOnOtherGlobalActor : Int = 0
33+ var varSync : Int = 0
34+
35+ @MyGlobalActor subscript( onGlobalActor onGlobalActor: Int ) -> Int { get { 1 } set { } }
36+ @MyOtherGlobalActor subscript( onOtherGlobalActor onOtherGlobalActor: Int ) -> Int { get { 1 } set { } }
37+ subscript( sync sync: Int ) -> Int { get { 1 } set { } }
38+ }
39+
40+ extension MyClass {
41+ @MyGlobalActor func testOnGlobalActor( ) {
42+ let _ = #^IN_FUNC_ON_GLOBAL_ACTOR ^#
43+ // IN_FUNC_ON_GLOBAL_ACTOR: Begin completions
44+ // IN_FUNC_ON_GLOBAL_ACTOR-DAG: Decl[InstanceMethod]/CurrNominal: funcOnGlobalActor()[#Int#]; name=funcOnGlobalActor()
45+ // IN_FUNC_ON_GLOBAL_ACTOR-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: funcOnOtherGlobalActor()[' async'][#Int#]; name=funcOnOtherGlobalActor() async
46+ // IN_FUNC_ON_GLOBAL_ACTOR-DAG: Decl[InstanceMethod]/CurrNominal: funcSync()[#Int#]; name=funcSync()
47+ // IN_FUNC_ON_GLOBAL_ACTOR-DAG: Decl[InstanceMethod]/CurrNominal: nonSenableFuncOnGlobalActor({#arg: MyNonSendable#})[#Int#]; name=nonSenableFuncOnGlobalActor(arg: MyNonSendable)
48+ // IN_FUNC_ON_GLOBAL_ACTOR-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: nonSenableFuncOnOtherGlobalActor({#arg: MyNonSendable#})[' async'][#Int#]; name=nonSenableFuncOnOtherGlobalActor(arg: MyNonSendable) async
49+ // IN_FUNC_ON_GLOBAL_ACTOR-DAG: Decl[InstanceVar]/CurrNominal: varOnGlobalActor[#Int#]; name=varOnGlobalActor
50+ // IN_FUNC_ON_GLOBAL_ACTOR-DAG: Decl[InstanceVar]/CurrNominal/NotRecommended: varOnOtherGlobalActor[#Int#][' async']; name=varOnOtherGlobalActor async
51+ // IN_FUNC_ON_GLOBAL_ACTOR-DAG: Decl[InstanceVar]/CurrNominal: varSync[#Int#]; name=varSync
52+ // IN_FUNC_ON_GLOBAL_ACTOR: End completions
53+
54+ let _ = self . #^IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT^#
55+ // IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT: Begin completions
56+ // IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT-DAG: Decl[InstanceMethod]/CurrNominal: funcOnGlobalActor()[#Int#]; name=funcOnGlobalActor()
57+ // IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: funcOnOtherGlobalActor()[' async'][#Int#]; name=funcOnOtherGlobalActor() async
58+ // IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT-DAG: Decl[InstanceMethod]/CurrNominal: funcSync()[#Int#]; name=funcSync()
59+ // IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT-DAG: Decl[InstanceMethod]/CurrNominal: nonSenableFuncOnGlobalActor({#arg: MyNonSendable#})[#Int#]; name=nonSenableFuncOnGlobalActor(arg: MyNonSendable)
60+ // IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: nonSenableFuncOnOtherGlobalActor({#arg: MyNonSendable#})[' async'][#Int#]; name=nonSenableFuncOnOtherGlobalActor(arg: MyNonSendable) async
61+ // IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT-DAG: Decl[InstanceVar]/CurrNominal: varOnGlobalActor[#Int#]; name=varOnGlobalActor
62+ // IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT-DAG: Decl[InstanceVar]/CurrNominal/NotRecommended: varOnOtherGlobalActor[#Int#][' async']; name=varOnOtherGlobalActor async
63+ // IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT-DAG: Decl[InstanceVar]/CurrNominal: varSync[#Int#]; name=varSync
64+ // IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT: End completions
65+
66+ let _ = self#^IN_FUNC_ON_GLOBAL_ACTOR_NODOT^#
67+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT: Begin completions
68+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT-DAG: Decl[InstanceMethod]/CurrNominal: .funcOnGlobalActor()[#Int#]; name=funcOnGlobalActor()
69+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: .funcOnOtherGlobalActor()[' async'][#Int#]; name=funcOnOtherGlobalActor() async
70+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT-DAG: Decl[InstanceMethod]/CurrNominal: .funcSync()[#Int#]; name=funcSync()
71+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT-DAG: Decl[InstanceMethod]/CurrNominal: .nonSenableFuncOnGlobalActor({#arg: MyNonSendable#})[#Int#]; name=nonSenableFuncOnGlobalActor(arg: MyNonSendable)
72+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: .nonSenableFuncOnOtherGlobalActor({#arg: MyNonSendable#})[' async'][#Int#]; name=nonSenableFuncOnOtherGlobalActor(arg: MyNonSendable) async
73+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT-DAG: Decl[InstanceVar]/CurrNominal: .varOnGlobalActor[#Int#]; name=varOnGlobalActor
74+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT-DAG: Decl[InstanceVar]/CurrNominal/NotRecommended: .varOnOtherGlobalActor[#Int#][' async']; name=varOnOtherGlobalActor async
75+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT-DAG: Decl[InstanceVar]/CurrNominal: .varSync[#Int#]; name=varSync
76+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT-DAG: Decl[Subscript]/CurrNominal: [{#onGlobalActor: Int#}][#Int#]; name=[onGlobalActor: Int]
77+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT-DAG: Decl[Subscript]/CurrNominal/NotRecommended: [{#onOtherGlobalActor: Int#}][' async'][#Int#]; name=[onOtherGlobalActor: Int] async
78+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT-DAG: Decl[Subscript]/CurrNominal: [{#sync: Int#}][#Int#]; name=[sync: Int]
79+ // IN_FUNC_ON_GLOBAL_ACTOR_NODOT: End completions
80+
81+ let _ = otherInstanceOfMyClass. #^IN_FUNC_ON_GLOBAL_ACTOR_OTHER_DOT? check= IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT^#
82+ let _ = otherInstanceOfMyClass#^IN_FUNC_ON_GLOBAL_ACTOR_OTHER_NODOT? check= IN_FUNC_ON_GLOBAL_ACTOR_NODOT^#
83+ }
84+
85+ func testInSyncFunc( ) {
86+ let _ = #^IN_SYNC_FUNC^#
87+ // IN_SYNC_FUNC: Begin completions
88+ // IN_SYNC_FUNC_DOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: funcOnGlobalActor()[' async'][#Int#]; name=funcOnGlobalActor()
89+ // IN_SYNC_FUNC_DOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: funcOnOtherGlobalActor()[' async'][#Int#]; name=funcOnOtherGlobalActor() async
90+ // IN_SYNC_FUNC_DOT-DAG: Decl[InstanceMethod]/CurrNominal: funcSync()[#Int#]; name=funcSync()
91+ // IN_SYNC_FUNC_DOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: nonSenableFuncOnGlobalActor({#arg: MyNonSendable#})[' async'][#Int#]; name=nonSenableFuncOnGlobalActor(arg: MyNonSendable)
92+ // IN_SYNC_FUNC_DOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: nonSenableFuncOnOtherGlobalActor({#arg: MyNonSendable#})[' async'][#Int#]; name=nonSenableFuncOnOtherGlobalActor(arg: MyNonSendable) async
93+ // IN_SYNC_FUNC_DOT-DAG: Decl[InstanceVar]/CurrNominal/NotRecommended: varOnGlobalActor[#Int#][' async']; name=varOnGlobalActor
94+ // IN_SYNC_FUNC_DOT-DAG: Decl[InstanceVar]/CurrNominal/NotRecommended: varOnOtherGlobalActor[#Int#][' async']; name=varOnOtherGlobalActor async
95+ // IN_SYNC_FUNC_DOT-DAG: Decl[InstanceVar]/CurrNominal: varSync[#Int#]; name=varSync
96+ // IN_SYNC_FUNC: End completions
97+
98+ let _ = self . #^IN_SYNC_FUNC_SELF_DOT^#
99+ // IN_SYNC_FUNC_SELF_DOT: Begin completions
100+ // IN_SYNC_FUNC_SELF_DOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: funcOnGlobalActor()[' async'][#Int#]; name=funcOnGlobalActor()
101+ // IN_SYNC_FUNC_SELF_DOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: funcOnOtherGlobalActor()[' async'][#Int#]; name=funcOnOtherGlobalActor() async
102+ // IN_SYNC_FUNC_SELF_DOT-DAG: Decl[InstanceMethod]/CurrNominal: funcSync()[#Int#]; name=funcSync()
103+ // IN_SYNC_FUNC_SELF_DOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: nonSenableFuncOnGlobalActor({#arg: MyNonSendable#})[' async'][#Int#]; name=nonSenableFuncOnGlobalActor(arg: MyNonSendable)
104+ // IN_SYNC_FUNC_SELF_DOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: nonSenableFuncOnOtherGlobalActor({#arg: MyNonSendable#})[' async'][#Int#]; name=nonSenableFuncOnOtherGlobalActor(arg: MyNonSendable) async
105+ // IN_SYNC_FUNC_SELF_DOT-DAG: Decl[InstanceVar]/CurrNominal/NotRecommended: varOnGlobalActor[#Int#][' async']; name=varOnGlobalActor
106+ // IN_SYNC_FUNC_SELF_DOT-DAG: Decl[InstanceVar]/CurrNominal/NotRecommended: varOnOtherGlobalActor[#Int#][' async']; name=varOnOtherGlobalActor async
107+ // IN_SYNC_FUNC_SELF_DOT-DAG: Decl[InstanceVar]/CurrNominal: varSync[#Int#]; name=varSync
108+ // IN_SYNC_FUNC_SELF_DOT: End completions
109+
110+ let _ = self#^IN_SYNC_FUNC_NODOT^#
111+ // IN_SYNC_FUNC_NODOT: Begin completions
112+ // IN_SYNC_FUNC_NODOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: .funcOnGlobalActor()[' async'][#Int#]; name=funcOnGlobalActor()
113+ // IN_SYNC_FUNC_NODOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: .funcOnOtherGlobalActor()[' async'][#Int#]; name=funcOnOtherGlobalActor() async
114+ // IN_SYNC_FUNC_NODOT-DAG: Decl[InstanceMethod]/CurrNominal: .funcSync()[#Int#]; name=funcSync()
115+ // IN_SYNC_FUNC_NODOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: .nonSenableFuncOnGlobalActor({#arg: MyNonSendable#})[' async'][#Int#]; name=nonSenableFuncOnGlobalActor(arg: MyNonSendable)
116+ // IN_SYNC_FUNC_NODOT-DAG: Decl[InstanceMethod]/CurrNominal/NotRecommended: .nonSenableFuncOnOtherGlobalActor({#arg: MyNonSendable#})[' async'][#Int#]; name=nonSenableFuncOnOtherGlobalActor(arg: MyNonSendable) async
117+ // IN_SYNC_FUNC_NODOT-DAG: Decl[InstanceVar]/CurrNominal/NotRecommended: .varOnGlobalActor[#Int#][' async']; name=varOnGlobalActor
118+ // IN_SYNC_FUNC_NODOT-DAG: Decl[InstanceVar]/CurrNominal/NotRecommended: .varOnOtherGlobalActor[#Int#][' async']; name=varOnOtherGlobalActor async
119+ // IN_SYNC_FUNC_NODOT-DAG: Decl[InstanceVar]/CurrNominal: .varSync[#Int#]; name=varSync
120+ // IN_SYNC_FUNC_NODOT-DAG: Decl[Subscript]/CurrNominal/NotRecommended: [{#onGlobalActor: Int#}][' async'][#Int#]; name=[onGlobalActor: Int]
121+ // IN_SYNC_FUNC_NODOT-DAG: Decl[Subscript]/CurrNominal/NotRecommended: [{#onOtherGlobalActor: Int#}][' async'][#Int#]; name=[onOtherGlobalActor: Int] async
122+ // IN_SYNC_FUNC_NODOT-DAG: Decl[Subscript]/CurrNominal: [{#sync: Int#}][#Int#]; name=[sync: Int]
123+ // IN_SYNC_FUNC_NODOT: End completions
124+
125+ let _ = otherInstanceOfMyClass. #^IN_SYNC_FUNC_OTHER_DOT? check= IN_SYNC_FUNC_SELF_DOT^#
126+ let _ = otherInstanceOfMyClass#^IN_SYNC_FUNC_OTHER_NODOT? check= IN_SYNC_FUNC_NODOT^#
127+ }
128+
129+ func testInGlobalActorClosure( ) {
130+ _ = { @MyGlobalActor ( ) -> Void in
131+ let _ = otherInstanceOfMyClass. #^IN_CLOSURE_ON_GLOBAL_ACTOR_OTHER_DOT? check= IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT^#
132+ }
133+ }
134+
135+ func testInGlobalActorClosureWithoutExplicitAttribute( ) {
136+ let callback : @MyGlobalActor ( ) -> Void
137+ callback = {
138+ let _ = otherInstanceOfMyClass. #^IN_CLOSURE_ON_GLOBAL_ACTOR_WITHOUT_EXPLICIT_LABEL_OTHER_DOT? check= IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT^#
139+ }
140+ }
141+
142+ @MyGlobalActor func testInClosureInGlobalActorFunc( ) {
143+ _ = { ( ) -> Void in
144+ let _ = otherInstanceOfMyClass. #^IN_CLOSURE_IN_FUNC_ON_GLOBAL_ACTOR_OTHER_DOT? check= IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT^#
145+ }
146+ }
147+
148+ func testInClosureNestedInClosureOnGlobalActorFunc( ) {
149+ _ = { @MyGlobalActor ( ) -> Void in
150+ _ = { ( ) -> Void in
151+ let _ = otherInstanceOfMyClass. #^IN_CLOSURE_NESTED_IN_CLOSURE_ON_GLOBAL_ACTOR_OTHER_DOT? check= IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT^#
152+ }
153+ }
154+ }
155+
156+ func testInLocalFunc( ) {
157+ @MyGlobalActor func localFunc( ) {
158+ let _ = otherInstanceOfMyClass. #^IN_LOCAL_FUNC_ON_GLOBAL_ACTOR_OTHER_DOT? check= IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT^#
159+ }
160+ }
161+
162+ @MyGlobalActor func testInNestedSingleExpressionClosure( ) {
163+ takeClosure {
164+ takeClosure {
165+ otherInstanceOfMyClass. #^IN_NESTED_SINGLE_EXPRESSION_CLOSURE_ON_GLBOAL_ACTOR_OTHER_DOT? check= IN_FUNC_ON_GLOBAL_ACTOR_SELF_DOT^#
166+ }
167+ }
168+ }
169+ }
170+
171+ actor ActorTests {
172+ func testInActor( ) {
173+ let _ = otherInstanceOfMyClass. #^IN_ACTOR_OTHER_DOT? check= IN_SYNC_FUNC_SELF_DOT^#
174+ let _ = otherInstanceOfMyClass#^IN_ACTOR_OTHER_NODOT? check= IN_SYNC_FUNC_NODOT^#
175+ }
176+ }
0 commit comments