Skip to content

Commit 8b4bc18

Browse files
committed
[SourceKit] Add documentation range in structure (SR-2487)
This PR adds the “key.docoffset” and “key.doclength” keys for declaration structures.
1 parent 4ff0707 commit 8b4bc18

File tree

16 files changed

+174
-49
lines changed

16 files changed

+174
-49
lines changed

include/swift/IDE/SyntaxModel.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ struct SyntaxStructureNode {
137137
CharSourceRange BodyRange;
138138
CharSourceRange NameRange;
139139
CharSourceRange TypeRange;
140+
CharSourceRange DocRange;
140141
std::vector<CharSourceRange> InheritedTypeRanges;
141142
std::vector<SyntaxStructureElement> Elements;
142143

lib/IDE/SyntaxModel.cpp

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,21 @@ CharSourceRange parameterNameRangeOfCallArg(const TupleExpr *TE,
418418
return CharSourceRange();
419419
}
420420

421+
static CharSourceRange findDocCommentRange(DeclAttributes Attrs) {
422+
for (auto Attr : Attrs) {
423+
if (auto DocAttr = dyn_cast_or_null<RawDocCommentAttr>(Attr)) {
424+
return DocAttr->getCommentRange();
425+
}
426+
}
427+
return CharSourceRange();
428+
}
429+
430+
static void setDecl(SyntaxStructureNode &N, Decl *D) {
431+
N.Dcl = D;
432+
N.Attrs = D->getAttrs();
433+
N.DocRange = findDocCommentRange(D->getAttrs());
434+
}
435+
421436
} // anonymous namespace
422437

423438
bool SyntaxModelContext::walk(SyntaxModelWalker &Walker) {
@@ -753,7 +768,7 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
753768
} else {
754769
// Pass Function / Method structure node.
755770
SyntaxStructureNode SN;
756-
SN.Dcl = D;
771+
setDecl(SN, D);
757772
const DeclContext *DC = AFD->getDeclContext();
758773
if (DC->isTypeContext()) {
759774
if (FD && FD->isStatic()) {
@@ -772,12 +787,11 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
772787
AFD->getBodySourceRange());
773788
SN.NameRange = charSourceRangeFromSourceRange(SM,
774789
AFD->getSignatureSourceRange());
775-
SN.Attrs = AFD->getAttrs();
776790
pushStructureNode(SN, AFD);
777791
}
778792
} else if (auto *NTD = dyn_cast<NominalTypeDecl>(D)) {
779793
SyntaxStructureNode SN;
780-
SN.Dcl = D;
794+
setDecl(SN, D);
781795
SN.Kind = syntaxStructureKindFromNominalTypeDecl(NTD);
782796
SN.Range = charSourceRangeFromSourceRange(SM, NTD->getSourceRange());
783797
SN.BodyRange = innerCharSourceRangeFromSourceRange(SM, NTD->getBraces());
@@ -792,12 +806,11 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
792806
SN.Elements.emplace_back(SyntaxStructureElementKind::TypeRef, TR);
793807
}
794808

795-
SN.Attrs = NTD->getAttrs();
796809
pushStructureNode(SN, NTD);
797810

798811
} else if (auto *ED = dyn_cast<ExtensionDecl>(D)) {
799812
SyntaxStructureNode SN;
800-
SN.Dcl = D;
813+
setDecl(SN, D);
801814
SN.Kind = SyntaxStructureKind::Extension;
802815
SN.Range = charSourceRangeFromSourceRange(SM, ED->getSourceRange());
803816
SN.BodyRange = innerCharSourceRangeFromSourceRange(SM, ED->getBraces());
@@ -811,7 +824,6 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
811824
SN.Elements.emplace_back(SyntaxStructureElementKind::TypeRef, TR);
812825
}
813826

814-
SN.Attrs = ED->getAttrs();
815827
pushStructureNode(SN, ED);
816828

817829
} else if (auto *PD = dyn_cast<ParamDecl>(D)) {
@@ -832,7 +844,7 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
832844
const DeclContext *DC = VD->getDeclContext();
833845
if (DC->isTypeContext() || DC->isModuleScopeContext()) {
834846
SyntaxStructureNode SN;
835-
SN.Dcl = D;
847+
setDecl(SN, D);
836848
SourceRange SR;
837849
if (auto *PBD = VD->getParentPatternBinding())
838850
SR = PBD->getSourceRange();
@@ -863,7 +875,6 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
863875
} else {
864876
SN.Kind = SyntaxStructureKind::GlobalVariable;
865877
}
866-
SN.Attrs = VD->getAttrs();
867878
pushStructureNode(SN, VD);
868879
}
869880

@@ -915,7 +926,7 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
915926

916927
} else if (auto *EnumCaseD = dyn_cast<EnumCaseDecl>(D)) {
917928
SyntaxStructureNode SN;
918-
SN.Dcl = D;
929+
setDecl(SN, D);
919930
SN.Kind = SyntaxStructureKind::EnumCase;
920931
SN.Range = charSourceRangeFromSourceRange(SM, D->getSourceRange());
921932

@@ -939,7 +950,7 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
939950
if (EnumElemD->getName().empty())
940951
continue;
941952
SyntaxStructureNode SN;
942-
SN.Dcl = EnumElemD;
953+
setDecl(SN, EnumElemD);
943954
SN.Kind = SyntaxStructureKind::EnumElement;
944955
SN.Range = charSourceRangeFromSourceRange(SM,
945956
EnumElemD->getSourceRange());
@@ -956,23 +967,21 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
956967
}
957968
} else if (auto *TypeAliasD = dyn_cast<TypeAliasDecl>(D)) {
958969
SyntaxStructureNode SN;
959-
SN.Dcl = TypeAliasD;
970+
setDecl(SN, D);
960971
SN.Kind = SyntaxStructureKind::TypeAlias;
961972
SN.Range = charSourceRangeFromSourceRange(SM,
962973
TypeAliasD->getSourceRange());
963974
SN.NameRange = CharSourceRange(TypeAliasD->getNameLoc(),
964975
TypeAliasD->getName().getLength());
965-
SN.Attrs = TypeAliasD->getAttrs();
966976
pushStructureNode(SN, TypeAliasD);
967977
} else if (auto *SubscriptD = dyn_cast<SubscriptDecl>(D)) {
968978
SyntaxStructureNode SN;
969-
SN.Dcl = SubscriptD;
979+
setDecl(SN, D);
970980
SN.Kind = SyntaxStructureKind::Subscript;
971981
SN.Range = charSourceRangeFromSourceRange(SM,
972982
SubscriptD->getSourceRange());
973983
SN.BodyRange = innerCharSourceRangeFromSourceRange(SM,
974984
SubscriptD->getBracesRange());
975-
SN.Attrs = SubscriptD->getAttrs();
976985
pushStructureNode(SN, SubscriptD);
977986
}
978987

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@
7777
key.offset: 225,
7878
key.length: 36,
7979
key.nameoffset: 229,
80-
key.namelength: 7
80+
key.namelength: 7,
81+
key.docoffset: 91,
82+
key.doclength: 133
8183
},
8284
{
8385
key.kind: source.lang.swift.expr.array,

test/SourceKit/DocumentStructure/structure.swift.response

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,8 @@
397397
key.namelength: 11,
398398
key.bodyoffset: 703,
399399
key.bodylength: 186,
400+
key.docoffset: 663,
401+
key.doclength: 19,
400402
key.substructure: [
401403
{
402404
key.kind: source.lang.swift.syntaxtype.comment.mark,
@@ -415,6 +417,8 @@
415417
key.namelength: 16,
416418
key.bodyoffset: 762,
417419
key.bodylength: 125,
420+
key.docoffset: 708,
421+
key.doclength: 19,
418422
key.substructure: [
419423
{
420424
key.kind: source.lang.swift.decl.var.parameter,
@@ -557,7 +561,9 @@
557561
key.offset: 1079,
558562
key.length: 15,
559563
key.nameoffset: 1089,
560-
key.namelength: 4
564+
key.namelength: 4,
565+
key.docoffset: 1059,
566+
key.doclength: 18
561567
},
562568
{
563569
key.kind: source.lang.swift.decl.function.free,
@@ -892,6 +898,8 @@
892898
key.namelength: 13,
893899
key.bodyoffset: 1444,
894900
key.bodylength: 27,
901+
key.docoffset: 1387,
902+
key.doclength: 18,
895903
key.inheritedtypes: [
896904
{
897905
key.name: "NSObject"

test/SourceKit/DocumentStructure/structure_object_literals.swift.response

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
key.length: 65,
1212
key.typename: "S",
1313
key.nameoffset: 148,
14-
key.namelength: 5
14+
key.namelength: 5,
15+
key.docoffset: 0,
16+
key.doclength: 142
1517
},
1618
{
1719
key.kind: source.lang.swift.expr.object_literal,

0 commit comments

Comments
 (0)