Files
swift-mirror/test/IDE/complete_globalactorunsafe.swift
Rintaro Ishizaki 9a6770e770 [CodeCompletion] Remove warning for 'async in non-concurrency context'
This warnings don't give much benefits for developers. Code completion
UI tends to show them unusable. But usually, developers can modify the
context to accept async calls, e.g. by wrapping it with `Task { }`

rdar://126737530
2024-05-15 12:55:05 -07:00

100 lines
3.1 KiB
Swift

// RUN: %batch-code-completion
// REQUIRES: concurrency
// SAFE_NOTREC: Begin completions, 2 items
// SAFE_NOTREC-DAG: Keyword[self]/CurrNominal: self[#SafelyIsolatedCls#];
// SAFE_NOTREC-DAG: Decl[InstanceMethod]/CurrNominal: method()[' async'][#Void#];
// UNSAFE_NOTREC: Begin completions, 2 items
// UNSAFE_NOTREC-DAG: Keyword[self]/CurrNominal: self[#UnsafelyIsolatedCls#];
// UNSAFE_NOTREC-DAG: Decl[InstanceMethod]/CurrNominal: method()[' async'][#Void#];
// SAFE_OK: Begin completions, 2 items
// SAFE_OK-DAG: Keyword[self]/CurrNominal: self[#SafelyIsolatedCls#];
// SAFE_OK-DAG: Decl[InstanceMethod]/CurrNominal: method()[' async'][#Void#];
// UNSAFE_OK: Begin completions, 2 items
// UNSAFE_OK-DAG: Keyword[self]/CurrNominal: self[#UnsafelyIsolatedCls#];
// UNSAFE_OK-DAG: Decl[InstanceMethod]/CurrNominal: method()[' async'][#Void#];
// UNSAFE_OK_SYNC: Begin completions, 2 items
// UNSAFE_OK_SYNC-DAG: Keyword[self]/CurrNominal: self[#UnsafelyIsolatedCls#];
// UNSAFE_OK_SYNC-DAG: Decl[InstanceMethod]/CurrNominal: method()[#Void#];
@globalActor
actor MyGlobalActor {
static let shared = MyGlobalActor()
}
@MyGlobalActor(unsafe)
class UnsafelyIsolatedCls {
func method()
}
@MyGlobalActor
class SafelyIsolatedCls {
func method()
}
class TestNormal {
func testSync(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) {
s.#^IN_METHOD_SYNC_SAFE?check=SAFE_NOTREC^#
u.#^IN_METHOD_SYNC_UNSAFE?check=UNSAFE_OK_SYNC^#
}
func testAsync(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) async {
s.#^IN_METHOD_ASYNC_SAFE?check=SAFE_OK^#
u.#^IN_METHOD_ASYNC_UNSAFE?check=UNSAFE_OK^#
}
}
func testSync(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) {
s.#^IN_FUNC_SYNC_SAFE?check=SAFE_NOTREC^#
u.#^IN_FUNC_SYNC_UNSAFE?check=UNSAFE_OK_SYNC^#
}
func testAsync(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) async {
s.#^IN_FUNC_ASYNC_SAFE?check=SAFE_OK^#
u.#^IN_FUNC_ASYNC_UNSAFE?check=UNSAFE_OK^#
}
func testClosure(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) {
func receiverSync(fn: () -> Void) {}
func receiverAsync(fn: () async -> Void) {}
receiverSync {
dummy;
s.#^IN_CLOSURE_SYNC_SAFE?check=SAFE_NOTREC^#
u.#^IN_CLOSURE_SYNC_UNSAFE?check=UNSAFE_OK_SYNC^#
}
receiverAsync {
dummy;
s.#^IN_CLOSURE_ASYNC_SAFE?check=SAFE_OK^#
u.#^IN_CLOSURE_ASYNC_UNSAFE?check=UNSAFE_OK^#
}
}
actor TestActor {
func test(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) {
s.#^IN_ACTOR_SYNC_SAFE?check=SAFE_NOTREC^#
u.#^IN_ACTOR_SYNC_UNSAFE?check=UNSAFE_NOTREC^#
}
func testAsync(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) async {
s.#^IN_ACTOR_ASYNC_SAFE?check=SAFE_OK^#
u.#^IN_ACTOR_ASYNC_UNSAFE?check=UNSAFE_OK^#
}
}
@MainActor
class TestMainActorIsolated {
func test(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) {
s.#^IN_GLOBALACTOR_SYNC_SAFE?check=SAFE_NOTREC^#
u.#^IN_GLOBALACTOR_SYNC_UNSAFE?check=UNSAFE_NOTREC^#
}
func testAsync(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) async {
s.#^IN_GLOBALACTOR_ASYNC_SAFE?check=SAFE_OK^#
u.#^IN_GLOBALACTOR_ASYNC_UNSAFE?check=UNSAFE_OK^#
}
}