mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
`FreeTypeVariableBinding::GenericParameters` mode allowed to bind all free type variables with fresh generic parameter types, which is incorrect (at least) if there are multiple generic solutions present, because such parameters couldn't be compared. This mode was used for code completion, which is now switched to use `FreeTypeVariableBinding::UnresolvedType` instead.
129 lines
4.1 KiB
Swift
129 lines
4.1 KiB
Swift
// XFAIL: broken_std_regex
|
|
// RUN: %complete-test %s -group=none -fuzz -structure -tok=S1_DOT | %FileCheck %s -check-prefix=S1_DOT
|
|
// RUN: %complete-test %s -group=none -add-inner-results -fuzz -structure -tok=S1_POSTFIX | %FileCheck %s -check-prefix=S1_POSTFIX
|
|
// RUN: %complete-test %s -group=none -add-inner-results -fuzz -structure -tok=S1_POSTFIX_INIT | %FileCheck %s -check-prefix=S1_INIT
|
|
// RUN: %complete-test %s -group=none -fuzz -structure -tok=S1_PAREN_INIT | %FileCheck %s -check-prefix=S1_INIT
|
|
// RUN: %complete-test %s -group=none -hide-none -fuzz -structure -tok=STMT_0 | %FileCheck %s -check-prefix=STMT_0
|
|
// RUN: %complete-test %s -group=none -fuzz -structure -tok=ENUM_0 | %FileCheck %s -check-prefix=ENUM_0
|
|
// RUN: %complete-test %s -group=none -fuzz -structure -tok=OVERRIDE_0 | %FileCheck %s -check-prefix=OVERRIDE_0
|
|
// RUN: %complete-test %s -group=none -fuzz -structure -tok=S1_INNER_0 | %FileCheck %s -check-prefix=S1_INNER_0
|
|
// RUN: %complete-test %s -group=none -fuzz -structure -tok=INT_INNER_0 | %FileCheck %s -check-prefix=INT_INNER_0
|
|
// RUN: %complete-test %s -group=none -fuzz -structure -tok=ASSOCIATED_TYPE_1 | %FileCheck %s -check-prefix=ASSOCIATED_TYPE_1
|
|
|
|
struct S1 {
|
|
func method1() {}
|
|
func method2(_ a: Int, b: Int) -> Int { return 1 }
|
|
func method3(a a: Int, b: Int) {}
|
|
func method4(_: Int, _: Int) {}
|
|
func method5(_: inout Int, b: inout Int) {}
|
|
func method6(_ c: Int) throws {}
|
|
func method7(_ callback: () throws -> ()) rethrows {}
|
|
func method8<T, U>(_ d: (T, U) -> T, e: T -> U) {}
|
|
|
|
let v1: Int = 1
|
|
var v2: Int { return 1 }
|
|
|
|
subscript(x: Int, y: Int) -> Int { return 1 }
|
|
subscript(x x: Int, y y: Int) -> Int { return 1 }
|
|
|
|
init() {}
|
|
init(a: Int, b: Int) {}
|
|
init(_: Int, _: Int) {}
|
|
init(c: Int)? {}
|
|
}
|
|
|
|
func test1(_ x: S1) {
|
|
x.#^S1_DOT^#
|
|
}
|
|
// S1_DOT: {name:method1}()
|
|
// S1_DOT: {name:method2}({params:{l:a:}{t: Int}, {n:b:}{t: Int}})
|
|
// S1_DOT: {name:method3}({params:{n:a:}{t: Int}, {n:b:}{t: Int}})
|
|
// S1_DOT: {name:method4}({params:{t:Int}, {t:Int}})
|
|
// S1_DOT: {name:method5}({params:{t:&Int}, {n:b:}{t: &Int}})
|
|
// FIXME: put throws in a range!
|
|
// S1_DOT: {name:method6}({params:{l:c:}{t: Int}}){throws: throws}
|
|
// S1_DOT: {name:method7}({params:{l:callback:}{t: () throws -> ()}}){throws: rethrows}
|
|
// S1_DOT: {name:method8}({params:{l:d:}{t: (T, U) -> T}, {n:e:}{t: (T) -> U}})
|
|
// S1_DOT: {name:v1}
|
|
// S1_DOT: {name:v2}
|
|
|
|
func test2(_ x: S1) {
|
|
x#^S1_POSTFIX^#
|
|
}
|
|
// Subscripts!
|
|
// S1_POSTFIX: {name:.}
|
|
// S1_POSTFIX: [{params:{t:Int}, {t:Int}}]
|
|
// S1_POSTFIX: [{params:{n:x:}{t: Int}, {n:y:}{t: Int}}]
|
|
// The dot becomes part of the name
|
|
// S1_POSTFIX: {name:.method1}()
|
|
// S1_POSTFIX: {name:.method2}({params:{l:a:}{t: Int}, {n:b:}{t: Int}})
|
|
|
|
func test4() {
|
|
S1#^S1_POSTFIX_INIT^#
|
|
}
|
|
func test5() {
|
|
S1(#^S1_PAREN_INIT^#
|
|
}
|
|
// S1_INIT: ()
|
|
// S1_INIT: ({params:{t:Int}, {t:Int}})
|
|
// S1_INIT: ({params:{n:a:}{t: Int}, {n:b:}{t: Int}})
|
|
// S1_INIT: ({params:{n:c:}{t: Int}})
|
|
|
|
func test6(_ xyz: S1, fgh: (S1) -> S1) {
|
|
#^STMT_0^#
|
|
}
|
|
// STMT_0: {name:func}
|
|
// STMT_0: {name:fgh}
|
|
// STMT_0: {name:xyz}
|
|
// STMT_0: {name:S1}
|
|
// STMT_0: {name:test6}({params:{l:xyz:}{t: S1}, {n:fgh:}{t: (S1) -> S1}})
|
|
// STMT_0: {name:try!}
|
|
|
|
enum E1 {
|
|
case C1
|
|
case C2(S1)
|
|
case C3(l1: S1, l2: S1)
|
|
}
|
|
|
|
func test7(_ x: E1) {
|
|
test7(.#^ENUM_0^#)
|
|
}
|
|
// ENUM_0: {name:C1}
|
|
// ENUM_0: {name:C2}({params:{t:S1}})
|
|
// ENUM_0: {name:C3}({params:{n:l1:}{t: S1}, {n:l2:}{t: S1}})
|
|
|
|
class C1 {
|
|
func foo(x: S1, y: S1, z: (S1) -> S1) -> S1 {}
|
|
func zap<T, U>(x: T, y: U, z: (T) -> U) -> T {}
|
|
}
|
|
|
|
class C2 : C1 {
|
|
override func #^OVERRIDE_0^#
|
|
}
|
|
// FIXME: overrides don't break out their code completion string structure.
|
|
// OVERRIDE_0: {name:foo(x: S1, y: S1, z: (S1) -> S1) -> S1}
|
|
// OVERRIDE_0: {name:zap<T, U>(x: T, y: U, z: (T) -> U) -> T}
|
|
|
|
func test8() {
|
|
#^S1_INNER_0,S1^#
|
|
}
|
|
// S1_INNER_0: {name:S1.}
|
|
// FIXME: should the ( go inside the name here?
|
|
// S1_INNER_0: {name:S1}(
|
|
|
|
func test9(_ x: inout Int) {
|
|
#^INT_INNER_0,x^#
|
|
}
|
|
// INT_INNER_0: {name:x==}
|
|
// INT_INNER_0: {name:x<}
|
|
// INT_INNER_0: {name:x+}
|
|
// INT_INNER_0: {name:x..<}
|
|
|
|
protocol P1 {
|
|
associatedtype T
|
|
}
|
|
struct S2: P1 {
|
|
#^ASSOCIATED_TYPE_1^#
|
|
}
|
|
// ASSOCIATED_TYPE_1: {name:T = }{params:{l:Type}}
|