Skip to content

Commit 40b054b

Browse files
marcelofabrinkcsgexi
authored andcommitted
[SourceKit] Add local variables to structure (SR-5057) (#11431)
1 parent 273dd87 commit 40b054b

File tree

8 files changed

+100
-43
lines changed

8 files changed

+100
-43
lines changed

include/swift/IDE/SyntaxModel.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ enum class SyntaxStructureKind : uint8_t {
9090
InstanceVariable,
9191
StaticVariable,
9292
ClassVariable,
93+
LocalVariable,
9394
EnumCase,
9495
EnumElement,
9596
TypeAlias,
@@ -146,6 +147,7 @@ struct SyntaxStructureNode {
146147
case SyntaxStructureKind::InstanceVariable:
147148
case SyntaxStructureKind::StaticVariable:
148149
case SyntaxStructureKind::ClassVariable:
150+
case SyntaxStructureKind::LocalVariable:
149151
case SyntaxStructureKind::Parameter:
150152
case SyntaxStructureKind::Subscript:
151153
return true;

lib/IDE/SyntaxModel.cpp

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -813,41 +813,41 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
813813
pushStructureNode(SN, PD);
814814
} else if (auto *VD = dyn_cast<VarDecl>(D)) {
815815
const DeclContext *DC = VD->getDeclContext();
816-
if (DC->isTypeContext() || DC->isModuleScopeContext()) {
817-
SyntaxStructureNode SN;
818-
setDecl(SN, D);
819-
SourceRange SR;
820-
if (auto *PBD = VD->getParentPatternBinding())
821-
SR = PBD->getSourceRange();
822-
else
823-
SR = VD->getSourceRange();
824-
SN.Range = charSourceRangeFromSourceRange(SM, SR);
825-
if (VD->hasAccessorFunctions())
826-
SN.BodyRange = innerCharSourceRangeFromSourceRange(SM,
827-
VD->getBracesRange());
828-
SourceLoc NRStart = VD->getNameLoc();
829-
SourceLoc NREnd = NRStart.getAdvancedLoc(VD->getName().getLength());
830-
SN.NameRange = CharSourceRange(SM, NRStart, NREnd);
831-
SN.TypeRange = charSourceRangeFromSourceRange(SM,
816+
SyntaxStructureNode SN;
817+
setDecl(SN, D);
818+
SourceRange SR;
819+
if (auto *PBD = VD->getParentPatternBinding())
820+
SR = PBD->getSourceRange();
821+
else
822+
SR = VD->getSourceRange();
823+
SN.Range = charSourceRangeFromSourceRange(SM, SR);
824+
if (VD->hasAccessorFunctions())
825+
SN.BodyRange = innerCharSourceRangeFromSourceRange(SM,
826+
VD->getBracesRange());
827+
SourceLoc NRStart = VD->getNameLoc();
828+
SourceLoc NREnd = NRStart.getAdvancedLoc(VD->getName().getLength());
829+
SN.NameRange = CharSourceRange(SM, NRStart, NREnd);
830+
SN.TypeRange = charSourceRangeFromSourceRange(SM,
832831
VD->getTypeSourceRangeForDiagnostics());
833832

834-
if (DC->isTypeContext()) {
835-
if (VD->isStatic()) {
836-
StaticSpellingKind Spell = StaticSpellingKind::KeywordStatic;
837-
if (auto *PBD = VD->getParentPatternBinding())
838-
Spell = PBD->getStaticSpelling();
839-
if (Spell == StaticSpellingKind::KeywordClass)
840-
SN.Kind = SyntaxStructureKind::ClassVariable;
841-
else
842-
SN.Kind = SyntaxStructureKind::StaticVariable;
843-
} else {
844-
SN.Kind = SyntaxStructureKind::InstanceVariable;
845-
}
833+
if (DC->isLocalContext()) {
834+
SN.Kind = SyntaxStructureKind::LocalVariable;
835+
} else if (DC->isTypeContext()) {
836+
if (VD->isStatic()) {
837+
StaticSpellingKind Spell = StaticSpellingKind::KeywordStatic;
838+
if (auto *PBD = VD->getParentPatternBinding())
839+
Spell = PBD->getStaticSpelling();
840+
if (Spell == StaticSpellingKind::KeywordClass)
841+
SN.Kind = SyntaxStructureKind::ClassVariable;
842+
else
843+
SN.Kind = SyntaxStructureKind::StaticVariable;
846844
} else {
847-
SN.Kind = SyntaxStructureKind::GlobalVariable;
845+
SN.Kind = SyntaxStructureKind::InstanceVariable;
848846
}
849-
pushStructureNode(SN, VD);
847+
} else {
848+
SN.Kind = SyntaxStructureKind::GlobalVariable;
850849
}
850+
pushStructureNode(SN, VD);
851851

852852
} else if (auto *ConfigD = dyn_cast<IfConfigDecl>(D)) {
853853
for (auto &Clause : ConfigD->getClauses()) {

test/IDE/structure.swift

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class MyCls : OtherClass {
1010
class var cbar : Int = 0
1111

1212
// CHECK: <ifunc>func <name>foo(<param>_ arg1: Int</param>, <param><name>name</name>: String</param>, <param><name>param</name> par: String</param>)</name> {
13-
// CHECK: var abc
13+
// CHECK: <lvar>var <name>abc</name></lvar>
1414
// CHECK: <if>if <elem-condexpr>1</elem-condexpr> <brace>{
1515
// CHECK: <call><name>foo</name>(<arg>1</arg>, <arg><name>name</name>:"test"</arg>, <arg><name>param</name>:"test2"</arg>)</call>
1616
// CHECK: }</brace>
@@ -64,29 +64,24 @@ var gvar : Int = 0
6464
// CHECK: <ffunc>func <name>ffoo()</name> {}</ffunc>
6565
func ffoo() {}
6666

67-
// CHECK: <foreach>for <elem-id>i</elem-id> in <elem-expr>0...5</elem-expr> <brace>{}</brace></foreach>
67+
// CHECK: <foreach>for <elem-id><lvar><name>i</name></lvar></elem-id> in <elem-expr>0...5</elem-expr> <brace>{}</brace></foreach>
6868
for i in 0...5 {}
69-
// CHECK: <foreach>for <elem-id>var (i, j)</elem-id> in <elem-expr>array</elem-expr> <brace>{}</brace></foreach>
69+
// CHECK: <foreach>for <elem-id>var (<lvar><name>i</name></lvar>, <lvar><name>j</name></lvar>)</elem-id> in <elem-expr>array</elem-expr> <brace>{}</brace></foreach>
7070
for var (i, j) in array {}
71-
// CHECK: <foreach>for <elem-id>var i</elem-id> = 0, i2 = 1; i == 0; ++i <brace>{}</brace></foreach>
72-
for var i = 0, i2 = 1; i == 0; ++i {}
73-
// CHECK: <foreach>for <elem-id>var (i,i2)</elem-id> = (0,0), i3 = 1; i == 0; ++i <brace>{}</brace></foreach>
74-
for var (i,i2) = (0,0), i3 = 1; i == 0; ++i {}
7571

76-
for i = 0; i == 0; ++i {}
77-
// CHECK: <while>while <elem-condexpr>var v = o, z = o where v > z</elem-condexpr> <brace>{}</brace></while>
72+
// CHECK: <while>while <elem-condexpr>var <lvar><name>v</name></lvar> = o, <lvar><name>z</name></lvar> = o where v > z</elem-condexpr> <brace>{}</brace></while>
7873
while var v = o, z = o where v > z {}
7974
// CHECK: <while>while <elem-condexpr>v == 0</elem-condexpr> <brace>{}</brace></while>
8075
while v == 0 {}
8176
// CHECK: <repeat-while>repeat <brace>{}</brace> while <elem-expr>v == 0</elem-expr></repeat-while>
8277
repeat {} while v == 0
83-
// CHECK: <if>if <elem-condexpr>var v = o, z = o where v > z</elem-condexpr> <brace>{}</brace></if>
78+
// CHECK: <if>if <elem-condexpr>var <lvar><name>v</name></lvar> = o, <lvar><name>z</name></lvar> = o where v > z</elem-condexpr> <brace>{}</brace></if>
8479
if var v = o, z = o where v > z {}
8580

8681
// CHECK: <switch>switch <elem-expr>v</elem-expr> {
8782
// CHECK: <case>case <elem-pattern>1</elem-pattern>: break;</case>
8883
// CHECK: <case>case <elem-pattern>2</elem-pattern>, <elem-pattern>3</elem-pattern>: break;</case>
89-
// CHECK: <case>case <elem-pattern><call><name>Foo</name>(<arg>var x</arg>, <arg>var y</arg>)</call> where x < y</elem-pattern>: break;</case>
84+
// CHECK: <case>case <elem-pattern><call><name>Foo</name>(<arg>var <lvar><name>x</name></lvar></arg>, <arg>var <lvar><name>y</name></lvar></arg>)</call> where x < y</elem-pattern>: break;</case>
9085
// CHECK: <case>case <elem-pattern>2 where <call><name>foo</name>()</call></elem-pattern>, <elem-pattern>3 where <call><name>bar</name>()</call></elem-pattern>: break;</case>
9186
// CHECK: <case><elem-pattern>default</elem-pattern>: break;</case>
9287
// CHECK: }</switch>
@@ -114,7 +109,7 @@ for {}
114109
class <#MyCls#> : <#OtherClass#> {}
115110

116111
// CHECK: <ffunc>func <name><#test1#> ()</name> {
117-
// CHECK: <foreach>for <elem-id><#name#></elem-id> in <elem-expr><#items#></elem-expr> <brace>{}</brace></foreach>
112+
// CHECK: <foreach>for <elem-id><lvar><name><#name#></name></lvar></elem-id> in <elem-expr><#items#></elem-expr> <brace>{}</brace></foreach>
118113
// CHECK: }</ffunc>
119114
func <#test1#> () {
120115
for <#name#> in <#items#> {}

test/SourceKit/DocumentStructure/structure.swift.placeholders.response

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@
5757
}
5858
],
5959
key.substructure: [
60+
{
61+
key.kind: source.lang.swift.decl.var.local,
62+
key.name: "<#name#>",
63+
key.offset: 63,
64+
key.length: 8,
65+
key.nameoffset: 63,
66+
key.namelength: 8
67+
},
6068
{
6169
key.kind: source.lang.swift.stmt.brace,
6270
key.offset: 85,

test/SourceKit/DocumentStructure/structure.swift.response

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,14 @@
612612
}
613613
],
614614
key.substructure: [
615+
{
616+
key.kind: source.lang.swift.decl.var.local,
617+
key.name: "i",
618+
key.offset: 1118,
619+
key.length: 1,
620+
key.nameoffset: 1118,
621+
key.namelength: 1
622+
},
615623
{
616624
key.kind: source.lang.swift.stmt.brace,
617625
key.offset: 1129,
@@ -637,6 +645,14 @@
637645
}
638646
],
639647
key.substructure: [
648+
{
649+
key.kind: source.lang.swift.decl.var.local,
650+
key.name: "i",
651+
key.offset: 1140,
652+
key.length: 1,
653+
key.nameoffset: 1140,
654+
key.namelength: 1
655+
},
640656
{
641657
key.kind: source.lang.swift.stmt.brace,
642658
key.offset: 1167,
@@ -662,6 +678,22 @@
662678
}
663679
],
664680
key.substructure: [
681+
{
682+
key.kind: source.lang.swift.decl.var.local,
683+
key.name: "v",
684+
key.offset: 1180,
685+
key.length: 1,
686+
key.nameoffset: 1180,
687+
key.namelength: 1
688+
},
689+
{
690+
key.kind: source.lang.swift.decl.var.local,
691+
key.name: "z",
692+
key.offset: 1191,
693+
key.length: 1,
694+
key.nameoffset: 1191,
695+
key.namelength: 1
696+
},
665697
{
666698
key.kind: source.lang.swift.stmt.brace,
667699
key.offset: 1204,
@@ -712,6 +744,22 @@
712744
}
713745
],
714746
key.substructure: [
747+
{
748+
key.kind: source.lang.swift.decl.var.local,
749+
key.name: "v",
750+
key.offset: 1237,
751+
key.length: 1,
752+
key.nameoffset: 1237,
753+
key.namelength: 1
754+
},
755+
{
756+
key.kind: source.lang.swift.decl.var.local,
757+
key.name: "z",
758+
key.offset: 1248,
759+
key.length: 1,
760+
key.nameoffset: 1248,
761+
key.namelength: 1
762+
},
715763
{
716764
key.kind: source.lang.swift.stmt.brace,
717765
key.offset: 1261,

tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1039,7 +1039,8 @@ class SwiftDocumentStructureWalker: public ide::SyntaxModelWalker {
10391039
UIdent Kind = SwiftLangSupport::getUIDForSyntaxStructureKind(Node.Kind);
10401040
UIdent AccessLevel;
10411041
UIdent SetterAccessLevel;
1042-
if (Node.Kind != SyntaxStructureKind::Parameter) {
1042+
if (Node.Kind != SyntaxStructureKind::Parameter &&
1043+
Node.Kind != SyntaxStructureKind::LocalVariable) {
10431044
if (auto *VD = dyn_cast_or_null<ValueDecl>(Node.Dcl)) {
10441045
AccessLevel = getAccessibilityUID(inferAccessibility(VD));
10451046
} else if (auto *ED = dyn_cast_or_null<ExtensionDecl>(Node.Dcl)) {

tools/SourceKit/lib/SwiftLang/SwiftLangSupport.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,8 @@ UIdent SwiftLangSupport::getUIDForSyntaxStructureKind(
371371
return KindDeclVarStatic;
372372
case SyntaxStructureKind::ClassVariable:
373373
return KindDeclVarClass;
374+
case SyntaxStructureKind::LocalVariable:
375+
return KindDeclVarLocal;
374376
case SyntaxStructureKind::EnumCase:
375377
return KindDeclEnumCase;
376378
case SyntaxStructureKind::EnumElement:

tools/swift-ide-test/swift-ide-test.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,7 @@ class StructureAnnotator : public ide::SyntaxModelWalker {
10671067
case SyntaxStructureKind::InstanceVariable: return "property";
10681068
case SyntaxStructureKind::StaticVariable: return "svar";
10691069
case SyntaxStructureKind::ClassVariable: return "cvar";
1070+
case SyntaxStructureKind::LocalVariable: return "lvar";
10701071
case SyntaxStructureKind::EnumCase: return "enum-case";
10711072
case SyntaxStructureKind::EnumElement: return "enum-elem";
10721073
case SyntaxStructureKind::TypeAlias: return "typealias";

0 commit comments

Comments
 (0)