Skip to content

Commit c934315

Browse files
committed
[SourceKit] Update terminology in generic parameter tag names
And add a test that does cursor info on the generic parameter itself, not just on the parent decl context. rdar://problem/24292226
1 parent 1763a43 commit c934315

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
lines changed

test/SourceKit/DocSupport/doc_source_file.swift.response

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2574,7 +2574,7 @@
25742574
],
25752575
key.offset: 1868,
25762576
key.length: 53,
2577-
key.fully_annotated_decl: "<decl.function.free><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>genfoo</decl.name>&lt;<decl.generic_type_param usr=\"s:tF8__main__6genfoouRxS_5Prot2wx7ElementzSirFxT_L_1TMx\"><decl.name>T</decl.name> : <decl.generic_type_param.type><ref.protocol usr=\"s:P8__main__5Prot2\">Prot2</ref.protocol></decl.generic_type_param.type></decl.generic_type_param> <syntaxtype.keyword>where</syntaxtype.keyword> <decl.function.returntype><ref.generic_type_param usr=\"s:tF8__main__6genfoouRxS_5Prot2wx7ElementzSirFxT_L_1TMx\">T</ref.generic_type_param>.<ref.associatedtype usr=\"s:P8__main__5Prot27Element\">Element</ref.associatedtype></decl.function.returntype> == <decl.function.returntype><ref.struct usr=\"s:Si\">Int</ref.struct></decl.function.returntype>&gt;(<decl.var.parameter><decl.var.parameter.name>x</decl.var.parameter.name>: <decl.var.parameter.type><ref.generic_type_param usr=\"s:tF8__main__6genfoouRxS_5Prot2wx7ElementzSirFxT_L_1TMx\">T</ref.generic_type_param></decl.var.parameter.type></decl.var.parameter>)</decl.function.free>",
2577+
key.fully_annotated_decl: "<decl.function.free><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>genfoo</decl.name>&lt;<decl.generic_type_param usr=\"s:tF8__main__6genfoouRxS_5Prot2wx7ElementzSirFxT_L_1TMx\"><decl.generic_type_param.name>T</decl.generic_type_param.name> : <decl.generic_type_param.constraint><ref.protocol usr=\"s:P8__main__5Prot2\">Prot2</ref.protocol></decl.generic_type_param.constraint></decl.generic_type_param> <syntaxtype.keyword>where</syntaxtype.keyword> <decl.function.returntype><ref.generic_type_param usr=\"s:tF8__main__6genfoouRxS_5Prot2wx7ElementzSirFxT_L_1TMx\">T</ref.generic_type_param>.<ref.associatedtype usr=\"s:P8__main__5Prot27Element\">Element</ref.associatedtype></decl.function.returntype> == <decl.function.returntype><ref.struct usr=\"s:Si\">Int</ref.struct></decl.function.returntype>&gt;(<decl.var.parameter><decl.var.parameter.name>x</decl.var.parameter.name>: <decl.var.parameter.type><ref.generic_type_param usr=\"s:tF8__main__6genfoouRxS_5Prot2wx7ElementzSirFxT_L_1TMx\">T</ref.generic_type_param></decl.var.parameter.type></decl.var.parameter>)</decl.function.free>",
25782578
key.entities: [
25792579
{
25802580
key.kind: source.lang.swift.decl.var.local,

test/SourceKit/DocSupport/doc_swift_module.swift.response

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ func genfoo<T1 : Prot, T2 : cake.C1 where T1.Element == Int, T2.Element == T1.El
662662
],
663663
key.offset: 381,
664664
key.length: 106,
665-
key.fully_annotated_decl: "<decl.function.free><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>genfoo</decl.name>&lt;<decl.generic_type_param usr=\"s:tF4cake6genfoou0_RxS_4Prot_CS_2C1wx7ElementzSirFT1xx1yq__T_L_2T1Mx\"><decl.name>T1</decl.name> : <decl.generic_type_param.type><ref.protocol usr=\"s:P4cake4Prot\">Prot</ref.protocol></decl.generic_type_param.type></decl.generic_type_param>, <decl.generic_type_param usr=\"s:tF4cake6genfoou0_RxS_4Prot_CS_2C1wx7ElementzSirFT1xx1yq__T_L_2T2Mq_\"><decl.name>T2</decl.name> : <decl.generic_type_param.type><ref.class usr=\"s:C4cake2C1\">C1</ref.class></decl.generic_type_param.type></decl.generic_type_param> <syntaxtype.keyword>where</syntaxtype.keyword> T1.Element == Int, T2.Element == T1.Element&gt;(<decl.var.parameter><decl.var.parameter.argument_label>x</decl.var.parameter.argument_label> <decl.var.parameter.name>ix</decl.var.parameter.name>: <decl.var.parameter.type>T1</decl.var.parameter.type></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.argument_label>y</decl.var.parameter.argument_label> <decl.var.parameter.name>iy</decl.var.parameter.name>: <decl.var.parameter.type>T2</decl.var.parameter.type></decl.var.parameter>)</decl.function.free>",
665+
key.fully_annotated_decl: "<decl.function.free><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>genfoo</decl.name>&lt;<decl.generic_type_param usr=\"s:tF4cake6genfoou0_RxS_4Prot_CS_2C1wx7ElementzSirFT1xx1yq__T_L_2T1Mx\"><decl.generic_type_param.name>T1</decl.generic_type_param.name> : <decl.generic_type_param.constraint><ref.protocol usr=\"s:P4cake4Prot\">Prot</ref.protocol></decl.generic_type_param.constraint></decl.generic_type_param>, <decl.generic_type_param usr=\"s:tF4cake6genfoou0_RxS_4Prot_CS_2C1wx7ElementzSirFT1xx1yq__T_L_2T2Mq_\"><decl.generic_type_param.name>T2</decl.generic_type_param.name> : <decl.generic_type_param.constraint><ref.class usr=\"s:C4cake2C1\">C1</ref.class></decl.generic_type_param.constraint></decl.generic_type_param> <syntaxtype.keyword>where</syntaxtype.keyword> T1.Element == Int, T2.Element == T1.Element&gt;(<decl.var.parameter><decl.var.parameter.argument_label>x</decl.var.parameter.argument_label> <decl.var.parameter.name>ix</decl.var.parameter.name>: <decl.var.parameter.type>T1</decl.var.parameter.type></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.argument_label>y</decl.var.parameter.argument_label> <decl.var.parameter.name>iy</decl.var.parameter.name>: <decl.var.parameter.type>T2</decl.var.parameter.type></decl.var.parameter>)</decl.function.free>",
666666
key.entities: [
667667
{
668668
key.kind: source.lang.swift.decl.var.local,

test/SourceKit/SourceDocInfo/cursor_info.swift

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -311,31 +311,31 @@ func refEnumElements() {
311311
// CHECK33-NEXT: s:V11cursor_info2S2
312312
// CHECK33-NEXT: S2.Type
313313
// CHECK33-NEXT: <Declaration>struct S2&lt;T, U&gt;</Declaration>
314-
// CHECK33-NEXT: <decl.struct><syntaxtype.keyword>struct</syntaxtype.keyword> <decl.name>S2</decl.name>&lt;<decl.generic_type_param usr="s:tV11cursor_info2S21TMx"><decl.name>T</decl.name></decl.generic_type_param>, <decl.generic_type_param usr="{{.*}}"><decl.name>U</decl.name></decl.generic_type_param>&gt;</decl.struct>
314+
// CHECK33-NEXT: <decl.struct><syntaxtype.keyword>struct</syntaxtype.keyword> <decl.name>S2</decl.name>&lt;<decl.generic_type_param usr="s:tV11cursor_info2S21TMx"><decl.generic_type_param.name>T</decl.generic_type_param.name></decl.generic_type_param>, <decl.generic_type_param usr="{{.*}}"><decl.generic_type_param.name>U</decl.generic_type_param.name></decl.generic_type_param>&gt;</decl.struct>
315315

316316
// RUN: %sourcekitd-test -req=cursor -pos=81:8 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK34
317317
// CHECK34: source.lang.swift.decl.function.method.instance (81:8-81:48)
318318
// CHECK34-NEXT: foo(_:)
319319
// CHECK34-NEXT: s:FV11cursor_info2S23foou0_rFFT_T_FT_T_
320320
// CHECK34-NEXT: <T, U> (S2<T, U>) -> <V, W> (() -> ()) -> () -> ()
321321
// CHECK34-NEXT: <Declaration>func foo&lt;V, W&gt;(closure: () -&gt; ()) -&gt; () -&gt; ()</Declaration>
322-
// CHECK34-NEXT: <decl.function.method.instance><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>foo</decl.name>&lt;<decl.generic_type_param usr="{{.*}}"><decl.name>V</decl.name></decl.generic_type_param>, <decl.generic_type_param usr="{{.*}}"><decl.name>W</decl.name></decl.generic_type_param>&gt;(<decl.var.parameter><decl.var.parameter.name>closure</decl.var.parameter.name>: <decl.var.parameter.type>() -&gt; ()</decl.var.parameter.type></decl.var.parameter>) -&gt; <decl.function.returntype>() -&gt; ()</decl.function.returntype></decl.function.method.instance>
322+
// CHECK34-NEXT: <decl.function.method.instance><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>foo</decl.name>&lt;<decl.generic_type_param usr="{{.*}}"><decl.generic_type_param.name>V</decl.generic_type_param.name></decl.generic_type_param>, <decl.generic_type_param usr="{{.*}}"><decl.generic_type_param.name>W</decl.generic_type_param.name></decl.generic_type_param>&gt;(<decl.var.parameter><decl.var.parameter.name>closure</decl.var.parameter.name>: <decl.var.parameter.type>() -&gt; ()</decl.var.parameter.type></decl.var.parameter>) -&gt; <decl.function.returntype>() -&gt; ()</decl.function.returntype></decl.function.method.instance>
323323

324324
// RUN: %sourcekitd-test -req=cursor -pos=83:7 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK35
325325
// CHECK35: source.lang.swift.decl.class (83:7-83:9)
326326
// CHECK35-NEXT: C4
327327
// CHECK35-NEXT: s:C11cursor_info2C4
328328
// CHECK35-NEXT: C4.Type
329329
// CHECK35-NEXT: <Declaration>class C4&lt;T, U&gt;</Declaration>
330-
// CHECK35-NEXT: <decl.class><syntaxtype.keyword>class</syntaxtype.keyword> <decl.name>C4</decl.name>&lt;<decl.generic_type_param usr="{{.*}}"><decl.name>T</decl.name></decl.generic_type_param>, <decl.generic_type_param usr="{{.*}}"><decl.name>U</decl.name></decl.generic_type_param>&gt;</decl.class>
330+
// CHECK35-NEXT: <decl.class><syntaxtype.keyword>class</syntaxtype.keyword> <decl.name>C4</decl.name>&lt;<decl.generic_type_param usr="{{.*}}"><decl.generic_type_param.name>T</decl.generic_type_param.name></decl.generic_type_param>, <decl.generic_type_param usr="{{.*}}"><decl.generic_type_param.name>U</decl.generic_type_param.name></decl.generic_type_param>&gt;</decl.class>
331331

332332
// RUN: %sourcekitd-test -req=cursor -pos=84:6 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK36
333333
// CHECK36: source.lang.swift.decl.enum (84:6-84:8)
334334
// CHECK36-NEXT: E1
335335
// CHECK36-NEXT: s:O11cursor_info2E1
336336
// CHECK36-NEXT: E1.Type
337337
// CHECK36-NEXT: <Declaration>enum E1&lt;T, U&gt;</Declaration>
338-
// CHECK36-NEXT: <decl.enum><syntaxtype.keyword>enum</syntaxtype.keyword> <decl.name>E1</decl.name>&lt;<decl.generic_type_param usr="{{.*}}"><decl.name>T</decl.name></decl.generic_type_param>, <decl.generic_type_param usr="{{.*}}"><decl.name>U</decl.name></decl.generic_type_param>&gt;</decl.enum>
338+
// CHECK36-NEXT: <decl.enum><syntaxtype.keyword>enum</syntaxtype.keyword> <decl.name>E1</decl.name>&lt;<decl.generic_type_param usr="{{.*}}"><decl.generic_type_param.name>T</decl.generic_type_param.name></decl.generic_type_param>, <decl.generic_type_param usr="{{.*}}"><decl.generic_type_param.name>U</decl.generic_type_param.name></decl.generic_type_param>&gt;</decl.enum>
339339

340340
// RUN: %sourcekitd-test -req=cursor -pos=86:6 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK37
341341
// CHECK37: source.lang.swift.decl.function.free (86:6-86:111)
@@ -407,3 +407,11 @@ func refEnumElements() {
407407
// CHECK46-NEXT: C
408408
// CHECK46: <Declaration>case C</Declaration>
409409
// CHECK46-NEXT: <decl.enumelement><syntaxtype.keyword>case</syntaxtype.keyword> <decl.name>C</decl.name></decl.enumelement>
410+
411+
// RUN: %sourcekitd-test -req=cursor -pos=80:11 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK47
412+
// CHECK47: source.lang.swift.decl.generic_type_param (80:11-80:12)
413+
// CHECK47-NEXT: T
414+
// CHECK47-NEXT: s:tV11cursor_info2S21TMx
415+
// CHECK47-NEXT: T.Type
416+
// CHECK47-NEXT: <Declaration>T</Declaration>
417+
// CHECK47-NEXT: <decl.generic_type_param><decl.generic_type_param.name>T</decl.generic_type_param.name></decl.generic_type_param>

tools/SourceKit/lib/SwiftLang/SwiftSourceDocInfo.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ static StringRef getTagForDecl(const Decl *D, bool isRef) {
6767

6868
static StringRef ExternalParamNameTag = "decl.var.parameter.argument_label";
6969
static StringRef LocalParamNameTag = "decl.var.parameter.name";
70+
static StringRef GenericParamNameTag = "decl.generic_type_param.name";
7071
static StringRef SyntaxKeywordTag = "syntaxtype.keyword";
7172

7273
static StringRef getTagForParameter(PrintParameterKind context) {
@@ -85,6 +86,8 @@ static StringRef getDeclNameTagForDecl(const Decl *D) {
8586
// When we're examining the parameter itself, it is the local name that is
8687
// the name of the variable.
8788
return LocalParamNameTag;
89+
case DeclKind::GenericTypeParam:
90+
return ""; // Handled by printName.
8891
case DeclKind::Constructor:
8992
case DeclKind::Destructor:
9093
case DeclKind::Subscript:
@@ -169,10 +172,14 @@ class FullyAnnotatedDeclarationPrinter final : public XMLEscapingPrinter {
169172
}
170173

171174
void printDeclLoc(const Decl *D) override {
172-
openTag(getDeclNameTagForDecl(D));
175+
auto tag = getDeclNameTagForDecl(D);
176+
if (!tag.empty())
177+
openTag(tag);
173178
}
174179
void printDeclNameEndLoc(const Decl *D) override {
175-
closeTag(getDeclNameTagForDecl(D));
180+
auto tag = getDeclNameTagForDecl(D);
181+
if (!tag.empty())
182+
closeTag(tag);
176183
}
177184

178185
void printTypePre(const TypeLoc &TL) override {
@@ -241,7 +248,7 @@ class FullyAnnotatedDeclarationPrinter final : public XMLEscapingPrinter {
241248
return "";
242249

243250
static StringRef parameterTypeTag = "decl.var.parameter.type";
244-
static StringRef genericParamTypeTag = "decl.generic_type_param.type";
251+
static StringRef genericParamTypeTag = "decl.generic_type_param.constraint";
245252

246253
auto context = contextStack.back();
247254
if (context.is(PrintParameterKind::FunctionParameter))
@@ -277,7 +284,7 @@ class FullyAnnotatedDeclarationPrinter final : public XMLEscapingPrinter {
277284
case PrintNameContext::Keyword:
278285
return SyntaxKeywordTag;
279286
case PrintNameContext::GenericParameter:
280-
return "decl.name"; // FIXME: should this be more specific?
287+
return GenericParamNameTag;
281288
default:
282289
return "";
283290
}

0 commit comments

Comments
 (0)