Files
swift-mirror/test/IDE/complete_func_reference.swift
Rintaro Ishizaki 84f0c5723a [CodeCompletion] Calculate type relation when adding type annotation
Calculate and set the type relation in each result building logic which
knows the actual result type.

CodeCompletionResultBuilder couldn't know the actual result type. From
the declaration alone, it cannot know the correct result type because it
doesn't know how the declaration is used (e.g. calling? referencing by
compound name? curried?)
2020-09-16 22:04:50 -07:00

214 lines
10 KiB
Swift

// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=VOID_VOID_0 | %FileCheck %s -check-prefix=VOID_VOID
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=VOID_VOID_1 | %FileCheck %s -check-prefix=VOID_VOID
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=VOID_VOID_2 | %FileCheck %s -check-prefix=VOID_VOID
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=VOID_VOID_3 | %FileCheck %s -check-prefix=VOID_VOID
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=VOID_VOID_4 | %FileCheck %s -check-prefix=VOID_VOID
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ANY_INT_0 | %FileCheck %s -check-prefix=ANY_INT
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ANY_INT_1 | %FileCheck %s -check-prefix=ANY_INT
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ANY_INT_2 > %t.results
// RUN:%FileCheck %s -check-prefix=ANY_INT < %t.results
// RUN:%FileCheck %s -check-prefix=ANY_INT_STATIC_CURRY < %t.results
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ANY_INT_3 | %FileCheck %s -check-prefix=ANY_INT
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ANY_INT_4 | %FileCheck %s -check-prefix=ANY_INT
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=INT_ANY_0 | %FileCheck %s -check-prefix=INT_ANY
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=INT_ANY_1 | %FileCheck %s -check-prefix=INT_ANY
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=INT_ANY_2 > %t.results
// RUN: %FileCheck %s -check-prefix=INT_ANY < %t.results
// RUN: %FileCheck %s -check-prefix=INT_ANY_STATIC_CURRY < %t.results
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=INT_ANY_3 > %t.results
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=VOID_INT_INT_0 | %FileCheck %s -check-prefix=VOID_INT_INT
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=VOID_INT_INT_1 | %FileCheck %s -check-prefix=VOID_INT_INT
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=VOID_INT_INT_2 | %FileCheck %s -check-prefix=VOID_INT_INT
func voidToVoid() {}
func voidToInt() -> Int {}
func intToInt(a: Int) -> Int {}
func intToVoid(a: Int) {}
func voidToAny() -> Any {}
func anyToAny(a: Any) -> Any {}
func anyToVoid(a: Any) {}
func intToAny(a: Int) -> Any {}
func anyToInt(a: Any) -> Int {}
func returnsIntToInt() -> (Int) -> Int {}
struct S0 {
func voidToVoid() {}
func voidToInt() -> Int {}
func intToInt(a: Int) -> Int {}
func intToVoid(a: Int) {}
func voidToAny() -> Any {}
func anyToAny(a: Any) -> Any {}
func anyToVoid(a: Any) {}
func intToAny(a: Int) -> Any {}
func anyToInt(a: Any) -> Int {}
func returnsIntToInt() -> (Int) -> Int {}
static func voidToVoid() {}
static func voidToInt() -> Int {}
static func intToInt(a: Int) -> Int {}
static func intToVoid(a: Int) {}
static func voidToAny() -> Any {}
static func anyToAny(a: Any) -> Any {}
static func anyToVoid(a: Any) {}
static func intToAny(a: Int) -> Any {}
static func anyToInt(a: Any) -> Int {}
static func returnsIntToInt() -> (Int) -> Int {}
}
do {
func take(_: @escaping ()->()) {}
take(#^VOID_VOID_0^#)
}
// VOID_VOID: Begin completions
// VOID_VOID-DAG: Decl{{.*}}/TypeRelation[Identical]: voidToVoid[#() -> ()#];
// VOID_VOID-DAG: Decl{{.*}}/TypeRelation[Invalid]: anyToVoid({#a: Any#})[#Void#];
// VOID_VOID-DAG: Decl{{.*}}/TypeRelation[Invalid]: intToVoid({#a: Int#})[#Void#];
// VOID_VOID-DAG: Decl{{.*}}: anyToAny({#a: Any#})[#Any#];
// VOID_VOID-DAG: Decl{{.*}}: intToAny({#a: Int#})[#Any#];
// VOID_VOID-DAG: Decl{{.*}}: voidToInt()[#Int#];
// VOID_VOID-DAG: Decl{{.*}}: anyToInt({#a: Any#})[#Int#];
// VOID_VOID-DAG: Decl{{.*}}: intToInt({#a: Int#})[#Int#];
// VOID_VOID-DAG: Decl{{.*}}: voidToAny()[#Any#];
// VOID_VOID-DAG: Decl{{.*}}: returnsIntToInt()[#(Int) -> Int#];
// VOID_VOID: End completions
do {
func take(_: Int, _: Int, c: @escaping ()->()) {}
take(1, 2, c: #^VOID_VOID_1^#)
}
do {
let take: ()->()
take = #^VOID_VOID_2^#
}
do {
let take: ()->()
take = S0().#^VOID_VOID_3^#
}
do {
let take: ()->()
take = S0.#^VOID_VOID_4^#
}
do {
func take(_: @escaping (Any)->Int) {}
take(#^ANY_INT_0^#)
}
do {
func take(_: @escaping (Any)->Int) {}
take(S0().#^ANY_INT_1^#)
}
do {
func take(_: @escaping (Any)->Int) {}
take(S0.#^ANY_INT_2^#)
}
do {
func take(_: @escaping ((Any)->Int)???!) {}
take(S0().#^ANY_INT_3^#)
}
do {
let take: ((Any)->Int)?
take = S0().#^ANY_INT_4^#
}
// ANY_INT: Begin completions
// ANY_INT_DAG: Decl{{.*}}/TypeRelation[Identical]: anyToInt(a:); name=anyToInt(a:)
// ANY_INT-DAG: Decl{{.*}}/TypeRelation[Invalid]: intToVoid({#a: Int#})[#Void#];
// ANY_INT-DAG: Decl{{.*}}/TypeRelation[Invalid]: anyToVoid({#a: Any#})[#Void#];
// ANY_INT-DAG: Decl{{.*}}/TypeRelation[Invalid]: voidToVoid()[#Void#];
// ANY_INT-DAG: Decl{{.*}}: voidToAny()[#Any#];
// ANY_INT-DAG: Decl{{.*}}: intToInt({#a: Int#})[#Int#];
// ANY_INT-DAG: Decl{{.*}}: intToAny({#a: Int#})[#Any#];
// ANY_INT-DAG: Decl{{.*}}: anyToAny({#a: Any#})[#Any#];
// ANY_INT-DAG: Decl{{.*}}: voidToInt()[#Int#];
// ANY_INT-DAG: Decl{{.*}}: returnsIntToInt()[#(Int) -> Int#];
// ANY_INT: End completions
// ANY_INT_STATIC_CURRY: Begin completions
// ANY_INT_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Identical]: anyToInt({#(self): S0#})[#(a: Any) -> Int#];
// ANY_INT_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: voidToVoid({#(self): S0#})[#() -> Void#];
// ANY_INT_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: intToVoid({#(self): S0#})[#(a: Int) -> Void#];
// ANY_INT_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: anyToVoid({#(self): S0#})[#(a: Any) -> Void#];
// ANY_INT_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal: voidToInt({#(self): S0#})[#() -> Int#];
// ANY_INT_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal: intToInt({#(self): S0#})[#(a: Int) -> Int#];
// ANY_INT_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal: voidToAny({#(self): S0#})[#() -> Any#];
// ANY_INT_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal: anyToAny({#(self): S0#})[#(a: Any) -> Any#];
// ANY_INT_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal: intToAny({#(self): S0#})[#(a: Int) -> Any#];
// ANY_INT_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal: returnsIntToInt({#(self): S0#})[#() -> (Int) -> Int#];
// ANY_INT_STATIC_CURRY: End completions
do {
func take(_: @escaping (Int)->Any) {}
take(#^INT_ANY_0^#)
}
// INT_ANY: Begin completions
// INT_ANY-DAG: Decl{{.*}}/TypeRelation[Identical]: intToAny(a:)[#(Int) -> Any#];
// INT_ANY-DAG: Decl{{.*}}/TypeRelation[Convertible]: intToInt(a:)[#(Int) -> Int#];
// INT_ANY-DAG: Decl{{.*}}/TypeRelation[Convertible]: intToVoid(a:)[#(Int) -> ()#];
// INT_ANY-DAG: Decl{{.*}}/TypeRelation[Convertible]: anyToAny(a:)[#(Any) -> Any#];
// INT_ANY-DAG: Decl{{.*}}/TypeRelation[Convertible]: anyToInt(a:)[#(Any) -> Int#];
// INT_ANY-DAG: Decl{{.*}}/TypeRelation[Convertible]: anyToVoid(a:)[#(Any) -> ()#];
// INT_ANY-DAG: Decl{{.*}}/TypeRelation[Convertible]: returnsIntToInt()[#(Int) -> Int#];
// INT_ANY-DAG: Decl{{.*}}/TypeRelation[Invalid]: voidToVoid()[#Void#];
// INT_ANY-DAG: Decl{{.*}}: voidToInt()[#Int#];
// INT_ANY-DAG: Decl{{.*}}: voidToAny()[#Any#];
// INT_ANY: End completions
// INT_ANY_STATIC_CURRY: Begin completions
// INT_ANY_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: intToInt({#(self): S0#})[#(a: Int) -> Int#];
// INT_ANY_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: intToVoid({#(self): S0#})[#(a: Int) -> Void#];
// INT_ANY_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: anyToAny({#(self): S0#})[#(a: Any) -> Any#];
// INT_ANY_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: anyToVoid({#(self): S0#})[#(a: Any) -> Void#];
// INT_ANY_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Identical]: intToAny({#(self): S0#})[#(a: Int) -> Any#];
// INT_ANY_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: anyToInt({#(self): S0#})[#(a: Any) -> Int#];
// INT_ANY_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal: returnsIntToInt({#(self): S0#})[#() -> (Int) -> Int#];
// INT_ANY_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal: voidToAny({#(self): S0#})[#() -> Any#];
// INT_ANY_STATIC_CURRY-DAG: Decl[InstanceMethod]/CurrNominal: voidToInt({#(self): S0#})[#() -> Int#];
// INT_ANY_STATIC_CURRY: End completions
do {
func take(_: @escaping (Int)->Any) {}
take(S0().#^INT_ANY_1^#)
}
do {
func take(_: @escaping (Int)->Any) {}
take(S0.#^INT_ANY_2^#)
}
do {
func take(_: @escaping ((Int)->Any)?) {}
take(S0.#^INT_ANY_3^#)
}
do {
func take(_: @escaping ()->(Int)->Int) {}
take(#^VOID_INT_INT_0^#)
}
do {
func take(_: @escaping ()->(Int)->Int) {}
take(S0().#^VOID_INT_INT_1^#)
}
do {
func take(_: @escaping ()->(Int)->Int) {}
take(S0.#^VOID_INT_INT_2^#)
}
// VOID_INT_INT-DAG: Decl{{.*}}/TypeRelation[Identical]: returnsIntToInt[#() -> (Int) -> Int#];
// VOID_INT_INT-DAG: Decl{{.*}}/TypeRelation[Invalid]: intToVoid({#a: Int#})[#Void#];
// VOID_INT_INT-DAG: Decl{{.*}}/TypeRelation[Invalid]: anyToVoid({#a: Any#})[#Void#];
// VOID_INT_INT-DAG: Decl{{.*}}/TypeRelation[Invalid]: voidToVoid()[#Void#];
// VOID_INT_INT-DAG: Decl{{.*}}: voidToAny()[#Any#];
// VOID_INT_INT-DAG: Decl{{.*}}: intToAny({#a: Int#})[#Any#];
// VOID_INT_INT-DAG: Decl{{.*}}: anyToAny({#a: Any#})[#Any#];
// VOID_INT_INT-DAG: Decl{{.*}}: voidToInt()[#Int#];
// VOID_INT_INT-DAG: Decl{{.*}}: anyToInt({#a: Any#})[#Int#];
// VOID_INT_INT-DAG: Decl{{.*}}: intToInt({#a: Int#})[#Int#];