Skip to content

Commit c633da0

Browse files
committed
[CodeCompletion] Add IDE test case for annotated description
1 parent d54e70c commit c633da0

File tree

2 files changed

+110
-1
lines changed

2 files changed

+110
-1
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1310,6 +1310,7 @@ Optional<unsigned> CodeCompletionString::getFirstTextChunkIndex(
13101310
case ChunkKind::BaseName:
13111311
case ChunkKind::TypeIdSystem:
13121312
case ChunkKind::TypeIdUser:
1313+
case ChunkKind::CallParameterBegin:
13131314
return i;
13141315
case ChunkKind::Dot:
13151316
case ChunkKind::ExclamationMark:
@@ -1336,7 +1337,6 @@ Optional<unsigned> CodeCompletionString::getFirstTextChunkIndex(
13361337
case ChunkKind::CallParameterType:
13371338
case ChunkKind::CallParameterClosureType:
13381339
case ChunkKind::OptionalBegin:
1339-
case ChunkKind::CallParameterBegin:
13401340
case ChunkKind::GenericParameterBegin:
13411341
case ChunkKind::DynamicLookupMethodCallTail:
13421342
case ChunkKind::OptionalMethodCallTail:

test/IDE/complete_annotation.swift

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// RUN: %swift-ide-test -code-completion -code-completion-annotate-results -source-filename %s -code-completion-token=GLOBAL_EXPR | %FileCheck %s --check-prefix=GLOBAL_EXPR
2+
// RUN: %swift-ide-test -code-completion -code-completion-annotate-results -source-filename %s -code-completion-token=GLOBAL_TYPE | %FileCheck %s --check-prefix=GLOBAL_TYPE
3+
// RUN: %swift-ide-test -code-completion -code-completion-annotate-results -source-filename %s -code-completion-token=EXPR_MEMBER | %FileCheck %s --check-prefix=EXPR_MEMBER
4+
// RUN: %swift-ide-test -code-completion -code-completion-annotate-results -source-filename %s -code-completion-token=EXPR_POSTFIX | %FileCheck %s --check-prefix=EXPR_POSTFIX
5+
// RUN: %swift-ide-test -code-completion -code-completion-annotate-results -source-filename %s -code-completion-token=EXPR_IMPLICITMEMBER | %FileCheck %s --check-prefix=EXPR_IMPLICITMEMBER
6+
// RUN: %swift-ide-test -code-completion -code-completion-annotate-results -source-filename %s -code-completion-token=CALLARG | %FileCheck %s --check-prefix=CALLARG
7+
8+
struct MyStruct {
9+
init(x: Int) {}
10+
var propNormal: Int { fatalError() }
11+
var propFunction: () -> MyStruct { fatalError() }
12+
func labelNameParamName(label param: (inout Int) throws -> MyStruct) rethrows {}
13+
func labelName(label: (@autoclosure () -> Int) -> Int) {}
14+
func sameName(label label: inout Int) {}
15+
func paramName(_ param: Int) {}
16+
subscript(param: Int) -> Int { 1 }
17+
subscript(label param: Int) -> Int { 1 }
18+
19+
static func +(lhs: MyStruct, rhs: MyStruct) -> MyStruct { fatalError() }
20+
21+
static var instance: MyStruct { fatalError() }
22+
static func create(x: Int) -> MyStruct { fatalError() }
23+
}
24+
25+
func testGlobal() {
26+
#^GLOBAL_EXPR^#
27+
}
28+
// GLOBAL_EXPR: Begin completions
29+
// GLOBAL_EXPR-DAG: Decl[Struct]/CurrModule: <name>MyStruct</name>; name=MyStruct
30+
// GLOBAL_EXPR-DAG: Keyword[class]/None: <keyword>class</keyword>; name=class
31+
// GLOBAL_EXPR-DAG: Keyword[enum]/None: <keyword>enum</keyword>; name=enum
32+
// GLOBAL_EXPR-DAG: Keyword[if]/None: <keyword>if</keyword>; name=if
33+
// GLOBAL_EXPR-DAG: Keyword[guard]/None: <keyword>guard</keyword>; name=guard
34+
// GLOBAL_EXPR-DAG: Keyword[try]/None: <keyword>try</keyword>; name=try
35+
// GLOBAL_EXPR-DAG: Keyword[try]/None: <keyword>try!</keyword>; name=try!
36+
// GLOBAL_EXPR-DAG: Keyword/None: <keyword>Any</keyword>; name=Any
37+
// GLOBAL_EXPR-DAG: Literal[Integer]/None: 0; name=0
38+
// GLOBAL_EXPR-DAG: Literal[Boolean]/None: <name>true</name>; name=true
39+
// GLOBAL_EXPR-DAG: Literal[Boolean]/None: <name>false</name>; name=false
40+
// GLOBAL_EXPR-DAG: Literal[Nil]/None: <name>nil</name>; name=nil
41+
// GLOBAL_EXPR-DAG: Literal[String]/None: &quot;<callarg><callarg.param>abc</callarg.param></callarg>&quot;; name="abc"
42+
// GLOBAL_EXPR-DAG: Literal[Array]/None: [<callarg><callarg.param>values</callarg.param></callarg>]; name=[values]
43+
// GLOBAL_EXPR-DAG: Literal[Dictionary]/None: [<callarg><callarg.param>key</callarg.param></callarg>: <callarg><callarg.param>value</callarg.param></callarg>]; name=[key: value]
44+
// GLOBAL_EXPR-DAG: Literal[_Color]/None: <name>#colorLiteral</name>(<callarg><callarg.label>red</callarg.label>: <callarg.type><typeid.sys>Float</typeid.sys></callarg.type></callarg>, <callarg><callarg.label>green</callarg.label>: <callarg.type><typeid.sys>Float</typeid.sys></callarg.type></callarg>, <callarg><callarg.label>blue</callarg.label>: <callarg.type><typeid.sys>Float</typeid.sys></callarg.type></callarg>, <callarg><callarg.label>alpha</callarg.label>: <callarg.type><typeid.sys>Float</typeid.sys></callarg.type></callarg>); name=#colorLiteral(red: Float, green: Float, blue: Float, alpha: Float)
45+
// GLOBAL_EXPR-DAG: Literal[_Image]/None: <name>#imageLiteral</name>(<callarg><callarg.label>resourceName</callarg.label>: <callarg.type><typeid.sys>String</typeid.sys></callarg.type></callarg>); name=#imageLiteral(resourceName: String)
46+
// GLOBAL_EXPR-DAG: Literal[Tuple]/None: (<callarg><callarg.param>values</callarg.param></callarg>); name=(values)
47+
// GLOBAL_EXPR-DAG: Keyword[#function]/None: <name>#function</name>; name=#function
48+
// GLOBAL_EXPR-DAG: Decl[Module]/None: <name>Swift</name>; name=Swift
49+
// GLOBAL_EXPR-DAG: Decl[Struct]/OtherModule[Swift]: <name>Int</name>; name=Int
50+
// GLOBAL_EXPR-DAG: Decl[FreeFunction]/OtherModule[Swift]: <name>print</name>(<callarg><callarg.label>_</callarg.label> <callarg.param>items</callarg.param>: <callarg.type>Any</callarg.type>...</callarg>, <callarg><callarg.label>to</callarg.label> <callarg.param>output</callarg.param>: &amp;<callarg.type><typeid.sys>TextOutputStream</typeid.sys></callarg.type></callarg>); name=print(items: Any..., to: &TextOutputStream)
51+
// GLOBAL_EXPR: End completions
52+
53+
54+
func testType(value: #^GLOBAL_TYPE^#) {}
55+
// GLOBAL_TYPE: Begin completions
56+
// GLOBAL_TYPE-DAG: Keyword/None: <keyword>Any</keyword>; name=Any
57+
// GLOBAL_TYPE-DAG: Decl[Struct]/CurrModule: <name>MyStruct</name>; name=MyStruct
58+
// GLOBAL_TYPE-DAG: Decl[Module]/None: <name>swift_ide_test</name>; name=swift_ide_test
59+
// GLOBAL_TYPE-DAG: Decl[Module]/None: <name>Swift</name>; name=Swift
60+
// GLOBAL_TYPE-DAG: Decl[Struct]/OtherModule[Swift]: <name>Int</name>; name=Int
61+
// GLOBAL_TYPE: End completions
62+
63+
64+
func testMember(value: MyStruct) {
65+
value.#^EXPR_MEMBER^#
66+
}
67+
// EXPR_MEMBER: Begin completions, 7 items
68+
// EXPR_MEMBER-DAG: Keyword[self]/CurrNominal: <keyword>self</keyword>; name=self
69+
// EXPR_MEMBER-DAG: Decl[InstanceVar]/CurrNominal: <name>propNormal</name>; name=propNormal
70+
// EXPR_MEMBER-DAG: Decl[InstanceVar]/CurrNominal: <name>propFunction</name>; name=propFunction
71+
// EXPR_MEMBER-DAG: Decl[InstanceMethod]/CurrNominal: <name>labelNameParamName</name>(<callarg><callarg.label>label</callarg.label> <callarg.param>param</callarg.param>: <callarg.type>(<keyword>inout</keyword> <typeid.sys>Int</typeid.sys>) <keyword>throws</keyword> -&gt; <typeid.user>MyStruct</typeid.user></callarg.type></callarg>)<keyword> rethrows</keyword>; name=labelNameParamName(label: (inout Int) throws -> MyStruct) rethrows
72+
// EXPR_MEMBER-DAG: Decl[InstanceMethod]/CurrNominal: <name>labelName</name>(<callarg><callarg.label>label</callarg.label>: <callarg.type>(<attribute>@autoclosure </attribute>() -&gt; <typeid.sys>Int</typeid.sys>) -&gt; <typeid.sys>Int</typeid.sys></callarg.type></callarg>); name=labelName(label: (@autoclosure () -> Int) -> Int)
73+
// EXPR_MEMBER-DAG: Decl[InstanceMethod]/CurrNominal: <name>sameName</name>(<callarg><callarg.label>label</callarg.label>: &amp;<callarg.type><typeid.sys>Int</typeid.sys></callarg.type></callarg>); name=sameName(label: &Int)
74+
// EXPR_MEMBER-DAG: Decl[InstanceMethod]/CurrNominal: <name>paramName</name>(<callarg><callarg.label>_</callarg.label> <callarg.param>param</callarg.param>: <callarg.type><typeid.sys>Int</typeid.sys></callarg.type></callarg>); name=paramName(param: Int)
75+
// EXPR_MEMBER: End completions
76+
77+
func testPostfix(value: MyStruct) {
78+
value #^EXPR_POSTFIX^#
79+
}
80+
// EXPR_POSTFIX: Begin completions, 10 items
81+
// EXPR_POSTFIX-DAG: Decl[InstanceVar]/CurrNominal: <name>propNormal</name>; name=propNormal
82+
// EXPR_POSTFIX-DAG: Decl[InstanceVar]/CurrNominal: <name>propFunction</name>; name=propFunction
83+
// EXPR_POSTFIX-DAG: Decl[InstanceMethod]/CurrNominal: <name>labelNameParamName</name>(<callarg><callarg.label>label</callarg.label> <callarg.param>param</callarg.param>: <callarg.type>(<keyword>inout</keyword> <typeid.sys>Int</typeid.sys>) <keyword>throws</keyword> -&gt; <typeid.user>MyStruct</typeid.user></callarg.type></callarg>)<keyword> rethrows</keyword>; name=labelNameParamName(label: (inout Int) throws -> MyStruct) rethrows
84+
// EXPR_POSTFIX-DAG: Decl[InstanceMethod]/CurrNominal: <name>labelName</name>(<callarg><callarg.label>label</callarg.label>: <callarg.type>(<attribute>@autoclosure </attribute>() -&gt; <typeid.sys>Int</typeid.sys>) -&gt; <typeid.sys>Int</typeid.sys></callarg.type></callarg>); name=labelName(label: (@autoclosure () -> Int) -> Int)
85+
// EXPR_POSTFIX-DAG: Decl[InstanceMethod]/CurrNominal: <name>sameName</name>(<callarg><callarg.label>label</callarg.label>: &amp;<callarg.type><typeid.sys>Int</typeid.sys></callarg.type></callarg>); name=sameName(label: &Int)
86+
// EXPR_POSTFIX-DAG: Decl[InstanceMethod]/CurrNominal: <name>paramName</name>(<callarg><callarg.label>_</callarg.label> <callarg.param>param</callarg.param>: <callarg.type><typeid.sys>Int</typeid.sys></callarg.type></callarg>); name=paramName(param: Int)
87+
// EXPR_POSTFIX-DAG: Decl[Subscript]/CurrNominal: [<callarg><callarg.label>_</callarg.label> <callarg.param>param</callarg.param>: <callarg.type><typeid.sys>Int</typeid.sys></callarg.type></callarg>]; name=[param: Int]
88+
// EXPR_POSTFIX-DAG: Decl[Subscript]/CurrNominal: [<callarg><callarg.label>label</callarg.label> <callarg.param>param</callarg.param>: <callarg.type><typeid.sys>Int</typeid.sys></callarg.type></callarg>]; name=[label: Int]
89+
// EXPR_POSTFIX-DAG: Keyword[self]/CurrNominal: <keyword>self</keyword>; name=self
90+
// EXPR_POSTFIX-DAG: Decl[InfixOperatorFunction]/OtherModule[Swift]: <name>+</name>; name=+ MyStruct
91+
// EXPR_POSTFIX: End completions
92+
93+
func testImplicitMember() -> MyStruct {
94+
return .#^EXPR_IMPLICITMEMBER^#
95+
}
96+
// EXPR_IMPLICITMEMBER: Begin completions, 3 items
97+
// EXPR_IMPLICITMEMBER-DAG: Decl[Constructor]/CurrNominal/TypeRelation[Identical]: <name>init</name>(<callarg><callarg.label>x</callarg.label>: <callarg.type><typeid.sys>Int</typeid.sys></callarg.type></callarg>); name=init(x: Int)
98+
// EXPR_IMPLICITMEMBER-DAG: Decl[StaticVar]/CurrNominal/TypeRelation[Identical]: <name>instance</name>; name=instance
99+
// EXPR_IMPLICITMEMBER-DAG: Decl[StaticMethod]/CurrNominal/TypeRelation[Identical]: <name>create</name>(<callarg><callarg.label>x</callarg.label>: <callarg.type><typeid.sys>Int</typeid.sys></callarg.type></callarg>); name=create(x: Int)
100+
// EXPR_IMPLICITMEMBER: End completions
101+
102+
func testArgument() -> MyStruct {
103+
func foo(x: Int, y: Int) {}
104+
foo(x: 1, #^CALLARG^#
105+
}
106+
// CALLARG: Begin completions, 1 items
107+
// CALLARG-DAG: Pattern/ExprSpecific: <callarg><callarg.label>y</callarg.label>: <callarg.type><typeid.sys>Int</typeid.sys></callarg.type></callarg>; name=y: Int
108+
// CALLARG: End completions
109+

0 commit comments

Comments
 (0)