// RUN: %batch-code-completion -code-completion-annotate-results -code-completion-sourcetext struct MyStruct { init(x: Int) {} init(_: T.Type, _: U.Type, value: Int = 1) {} var propNormal: Int { fatalError() } var propFunction: () -> MyStruct { fatalError() } func labelNameParamName(label param: (inout Int) throws -> MyStruct) rethrows {} func labelName(label: (@autoclosure () -> Int) -> Int) {} func sameName(label label: inout Int) {} func paramName(_ param: Int) {} func emptyName(_: T.Type) {} subscript(param: Int) -> Int { 1 } subscript(label param: Int) -> Int { 1 } static func +(lhs: MyStruct, rhs: MyStruct) -> MyStruct { fatalError() } static var instance: MyStruct { fatalError() } static func create(x: Int) -> MyStruct { fatalError() } } func testGlobal() { #^GLOBAL_EXPR^# } // GLOBAL_EXPR-DAG: Decl[Struct]/CurrModule: MyStruct; typename=MyStruct; // GLOBAL_EXPR-DAG: Keyword[class]/None/Flair[RareKeyword]: class; typename=; // GLOBAL_EXPR-DAG: Keyword[enum]/None/Flair[RareKeyword]: enum; typename=; // GLOBAL_EXPR-DAG: Keyword[if]/None: if; typename=; // GLOBAL_EXPR-DAG: Keyword[guard]/None: guard; typename=; // GLOBAL_EXPR-DAG: Keyword[try]/None: try; typename=; // GLOBAL_EXPR-DAG: Keyword[try]/None: try!; typename=; // GLOBAL_EXPR-DAG: Keyword/None: Any; typename=Any; // GLOBAL_EXPR-DAG: Literal[Integer]/None: 0; typename=Int; // GLOBAL_EXPR-DAG: Literal[Boolean]/None: true; typename=Bool; // GLOBAL_EXPR-DAG: Literal[Boolean]/None: false; typename=Bool; // GLOBAL_EXPR-DAG: Literal[Nil]/None: nil; typename=; // GLOBAL_EXPR-DAG: Literal[String]/None: "abc"; typename=String; // GLOBAL_EXPR-DAG: Literal[Array]/None: [values]; typename=Array<Element>; // GLOBAL_EXPR-DAG: Literal[Dictionary]/None: [key: value]; typename=Dictionary<Key, Value>; // GLOBAL_EXPR-DAG: Literal[_Color]/None: #colorLiteral(red: Float, green: Float, blue: Float, alpha: Float); typename=; // GLOBAL_EXPR-DAG: Literal[_Image]/None: #imageLiteral(resourceName: String); typename=; // GLOBAL_EXPR-DAG: Literal[Tuple]/None: (values); typename=; // GLOBAL_EXPR-DAG: Decl[Module]/None/IsSystem: Swift; typename=Module; // GLOBAL_EXPR-DAG: Decl[Struct]/OtherModule[Swift]/IsSystem: Int; typename=Int; // GLOBAL_EXPR-DAG: Decl[FreeFunction]/OtherModule[Swift]/IsSystem: print(_ items: Any..., to output: &TextOutputStream); typename=Void; func testType(value: #^GLOBAL_TYPE^#) {} // GLOBAL_TYPE-DAG: Keyword/None: Any; typename=Any; // GLOBAL_TYPE-DAG: Decl[Struct]/CurrModule: MyStruct; typename=MyStruct; // GLOBAL_TYPE-DAG: Decl[Module]/None: swift_ide_test; typename=Module; // GLOBAL_TYPE-DAG: Decl[Module]/None/IsSystem: Swift; typename=Module; // GLOBAL_TYPE-DAG: Decl[Struct]/OtherModule[Swift]/IsSystem: Int; typename=Int; func testMember(value: MyStruct) { value.#^EXPR_MEMBER^# } // EXPR_MEMBER: Begin completions, 8 items // EXPR_MEMBER-DAG: Keyword[self]/CurrNominal: self; typename=MyStruct; // EXPR_MEMBER-DAG: Decl[InstanceVar]/CurrNominal: propNormal; typename=Int; // EXPR_MEMBER-DAG: Decl[InstanceVar]/CurrNominal: propFunction; typename=() -> MyStruct; // EXPR_MEMBER-DAG: Decl[InstanceMethod]/CurrNominal: labelNameParamName(label param: (inout Int) throws -> MyStruct) rethrows; typename=Void; // EXPR_MEMBER-DAG: Decl[InstanceMethod]/CurrNominal: labelName(label: (@autoclosure () -> Int) -> Int); typename=Void; // EXPR_MEMBER-DAG: Decl[InstanceMethod]/CurrNominal: sameName(label: &Int); typename=Void; // EXPR_MEMBER-DAG: Decl[InstanceMethod]/CurrNominal: paramName(_ param: Int); typename=Void; // EXPR_MEMBER-DAG: Decl[InstanceMethod]/CurrNominal: emptyName(_: T.Type); typename=Void; name=emptyName(:); sourcetext=emptyName(<#T##T.Type#>) func testPostfix(value: MyStruct) { value #^EXPR_POSTFIX^# } // EXPR_POSTFIX: Begin completions, 11 items // EXPR_POSTFIX-DAG: Decl[InstanceVar]/CurrNominal: propNormal; typename=Int; // EXPR_POSTFIX-DAG: Decl[InstanceVar]/CurrNominal: propFunction; typename=() -> MyStruct; // EXPR_POSTFIX-DAG: Decl[InstanceMethod]/CurrNominal: labelNameParamName(label param: (inout Int) throws -> MyStruct) rethrows; typename=Void; // EXPR_POSTFIX-DAG: Decl[InstanceMethod]/CurrNominal: labelName(label: (@autoclosure () -> Int) -> Int); typename=Void; // EXPR_POSTFIX-DAG: Decl[InstanceMethod]/CurrNominal: sameName(label: &Int); typename=Void; // EXPR_POSTFIX-DAG: Decl[InstanceMethod]/CurrNominal: paramName(_ param: Int); typename=Void; // EXPR_POSTFIX-DAG: Decl[Subscript]/CurrNominal: [_ param: Int]; typename=Int; // EXPR_POSTFIX-DAG: Decl[Subscript]/CurrNominal: [label param: Int]; typename=Int; // EXPR_POSTFIX-DAG: Keyword[self]/CurrNominal: self; typename=MyStruct; // EXPR_POSTFIX-DAG: Decl[InfixOperatorFunction]/OtherModule[Swift]/IsSystem: +; typename=MyStruct; // EXPR_POSTFIX-DAG: Decl[InstanceMethod]/CurrNominal: emptyName(_: T.Type); typename=Void; name=emptyName(:); sourcetext=.emptyName(<#T##T.Type#>) func testImplicitMember() -> MyStruct { return .#^EXPR_IMPLICITMEMBER^# } // EXPR_IMPLICITMEMBER: Begin completions, 10 items // EXPR_IMPLICITMEMBER-DAG: Decl[Constructor]/CurrNominal/TypeRelation[Convertible]: init(x: Int); typename=MyStruct; // EXPR_IMPLICITMEMBER-DAG: Decl[Constructor]/CurrNominal/TypeRelation[Convertible]: init(_: T.Type, _: U.Type); typename=MyStruct; name=init(::); sourcetext=init(<#T##T.Type#>, <#T##U.Type#>) // EXPR_IMPLICITMEMBER-DAG: Decl[Constructor]/CurrNominal/TypeRelation[Convertible]: init(_: T.Type, _: U.Type, value: Int); typename=MyStruct; name=init(::value:); sourcetext=init(<#T##T.Type#>, <#T##U.Type#>, value: <#T##Int#>) // EXPR_IMPLICITMEMBER-DAG: Decl[StaticVar]/CurrNominal/Flair[ExprSpecific]/TypeRelation[Convertible]: instance; typename=MyStruct; // EXPR_IMPLICITMEMBER-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: labelNameParamName(_ self: MyStruct); typename=(label: (inout Int) throws -> MyStruct) -> Void; // EXPR_IMPLICITMEMBER-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: labelName(_ self: MyStruct); typename=(label: (@autoclosure () -> Int) -> Int) -> Void; // EXPR_IMPLICITMEMBER-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: sameName(_ self: MyStruct); typename=(label: inout Int) -> Void; // EXPR_IMPLICITMEMBER-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: paramName(_ self: MyStruct); typename=(Int) -> Void; // EXPR_IMPLICITMEMBER-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: emptyName(_ self: MyStruct); typename=(T.Type) -> Void; name=emptyName(:); sourcetext=emptyName(<#T##self: MyStruct##MyStruct#>) // EXPR_IMPLICITMEMBER-DAG: Decl[StaticMethod]/CurrNominal/Flair[ExprSpecific]/TypeRelation[Convertible]: create(x: Int); typename=MyStruct; func testArgument() -> MyStruct { func foo(x: Int, y: Int) {} foo(x: 1, #^CALLARG^# } // CALLARG: Begin completions, 1 items // CALLARG-DAG: Pattern/Local/Flair[ArgLabels]: y: Int; typename=Int struct TestArchetypeAnnotations { func foo1(u: U, t: T) {} func foo2(s: S, elt: S.Element) {} } func testArchetypeAnnotations(arg: TestArchetypeAnnotations) { arg.#^GENERIC^# } // GENERIC: Begin completions, 3 items // GENERIC-DAG: Keyword[self]/CurrNominal: self; typename=TestArchetypeAnnotations<T>; name=self // GENERIC-DAG: Decl[InstanceMethod]/CurrNominal: foo1(u: U, t: T); typename=Void; name=foo1(u:t:) // GENERIC-DAG: Decl[InstanceMethod]/CurrNominal: foo2(s: Sequence, elt: Sequence.Element); typename=Void; name=foo2(s:elt:) struct TestGenericParamAnnotations { func foo1(u: U) where #^WHERE^# } // WHERE: Begin completions, 4 items // WHERE-DAG: Decl[GenericTypeParam]/Local: T; typename=T; name=T // WHERE-DAG: Decl[GenericTypeParam]/Local: U; typename=U; name=U // WHERE-DAG: Decl[Struct]/Local: TestGenericParamAnnotations; // WHERE-DAG: Keyword[Self]/CurrNominal: Self; protocol BaseP { func protoMethod() -> @convention(c) (UInt8) -> Void var value: MyStruct } class BaseC { func baseMethod(x: Int) -> Int { } func baseMethodWithName(x y: Int) -> Int { } func baseMethodWithEmptyName(_ y: Int) -> Int { } func baseMethodAsync(x: Int) async -> Int { } func genericAsyncThrowsConstraint(x: T) async throws -> U.Element where U: Collection, U.Element == Int {} subscript(index: Int) -> (Int) -> Int { } subscript(withName index: Int) -> Float { } subscript(_ index: String) -> String { } } class DerivedC: BaseC, BaseP { #^OVERRIDE^# // OVERRIDE-DAG: Keyword[func]/None: func; typename=; name=func; sourcetext=func // OVERRIDE-DAG: Decl[InstanceMethod]/Super: protoMethod() -> (UInt8) -> Void; typename=; name=protoMethod(); sourcetext=func protoMethod() -> (UInt8) -> Void {\n<#code#>\n} // OVERRIDE-DAG: Decl[InstanceVar]/Super: value: MyStruct; typename=; name=value; sourcetext=var value: MyStruct // OVERRIDE-DAG: Decl[InstanceMethod]/Super: baseMethod(x: Int) -> Int; typename=; name=baseMethod(x:); sourcetext=override func baseMethod(x: Int) -> Int {\n<#code#>\n} // OVERRIDE-DAG: Decl[InstanceMethod]/Super: baseMethodWithName(x y: Int) -> Int; typename=; name=baseMethodWithName(x:); sourcetext=override func baseMethodWithName(x y: Int) -> Int {\n<#code#>\n} // OVERRIDE-DAG: Decl[InstanceMethod]/Super: baseMethodWithEmptyName(_ y: Int) -> Int; typename=; name=baseMethodWithEmptyName(:); sourcetext=override func baseMethodWithEmptyName(_ y: Int) -> Int {\n<#code#>\n} // OVERRIDE-DAG: Decl[InstanceMethod]/Super: baseMethodAsync(x: Int) async -> Int; typename=; name=baseMethodAsync(x:); sourcetext=override func baseMethodAsync(x: Int) async -> Int {\n<#code#>\n} // OVERRIDE-DAG: Decl[InstanceMethod]/Super: genericAsyncThrowsConstraint<T, U>(x: T) async throws -> U.Element where U : Collection, U.Element == Int; typename=; name=genericAsyncThrowsConstraint(x:); sourcetext=override func genericAsyncThrowsConstraint(x: T) async throws -> U.Element where U : Collection, U.Element == Int {\n<#code#>\n} // OVERRIDE-DAG: Decl[Subscript]/Super: subscript(index: Int) -> (Int) -> Int; typename=; name=subscript(:); sourcetext=override subscript(index: Int) -> (Int) -> Int {\n<#code#>\n} // OVERRIDE-DAG: Decl[Subscript]/Super: subscript(withName index: Int) -> Float; typename=; name=subscript(withName:); sourcetext=override subscript(withName index: Int) -> Float {\n<#code#>\n} // OVERRIDE-DAG: Decl[Subscript]/Super: subscript(index: String) -> String; typename=; name=subscript(:); sourcetext=override subscript(index: String) -> String {\n<#code#>\n} // OVERRIDE-DAG: Decl[Constructor]/Super: init(); typename=; name=init(); sourcetext=override init() {\n<#code#>\n} } struct Defaults { func noDefault(a: Int) { } func singleDefault(a: Int = 0) { } func mixedDefaults(a: Int, b: Int = 0, c: Int) { } func closureDefault(a: (Int) -> Void = {_ in }) { } } func defaults(def: Defaults) { def.#^DEFAULTS^# } // DEFAULTS-DAG: Keyword[self]/CurrNominal: self; typename=Defaults; name=self; sourcetext=self // DEFAULTS-DAG: Decl[InstanceMethod]/CurrNominal: noDefault(a: Int); typename=Void; name=noDefault(a:); sourcetext=noDefault(a: <#T##Int#>) // DEFAULTS-DAG: Decl[InstanceMethod]/CurrNominal: singleDefault(); typename=Void; name=singleDefault(); sourcetext=singleDefault() // DEFAULTS-DAG: Decl[InstanceMethod]/CurrNominal: singleDefault(a: Int); typename=Void; name=singleDefault(a:); sourcetext=singleDefault(a: <#T##Int#>) // DEFAULTS-DAG: Decl[InstanceMethod]/CurrNominal: mixedDefaults(a: Int, c: Int); typename=Void; name=mixedDefaults(a:c:); sourcetext=mixedDefaults(a: <#T##Int#>, c: <#T##Int#>) // DEFAULTS-DAG: Decl[InstanceMethod]/CurrNominal: mixedDefaults(a: Int, b: Int, c: Int); typename=Void; name=mixedDefaults(a:b:c:); sourcetext=mixedDefaults(a: <#T##Int#>, b: <#T##Int#>, c: <#T##Int#>) // DEFAULTS-DAG: Decl[InstanceMethod]/CurrNominal: closureDefault(); typename=Void; name=closureDefault(); sourcetext=closureDefault() // DEFAULTS-DAG: Decl[InstanceMethod]/CurrNominal: closureDefault(a: (Int) -> Void); typename=Void; name=closureDefault(a:); sourcetext=closureDefault(a: <#T##(Int) -> Void#>)