Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SourceKit] Add documentation range in structure (SR-2487) #11264

Merged
merged 3 commits into from
Aug 2, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/swift/AST/RawComment.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ struct RawComment {
bool isEmpty() const {
return Comments.empty();
}

CharSourceRange getCharSourceRange();
};

struct CommentInfo {
Expand Down
1 change: 1 addition & 0 deletions include/swift/IDE/SyntaxModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ struct SyntaxStructureNode {
CharSourceRange BodyRange;
CharSourceRange NameRange;
CharSourceRange TypeRange;
CharSourceRange DocRange;
std::vector<CharSourceRange> InheritedTypeRanges;
std::vector<SyntaxStructureElement> Elements;

Expand Down
15 changes: 15 additions & 0 deletions lib/AST/RawComment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,3 +247,18 @@ StringRef Decl::getBriefComment() const {
Context.setBriefComment(this, Result);
return Result;
}

CharSourceRange RawComment::getCharSourceRange() {
if (this->isEmpty()) {
return CharSourceRange();
}

auto Start = this->Comments.front().Range.getStart();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we have an early return if Start is invalid? cause the doc comment may come from a deserialized module file.

if (Start.isInvalid()) {
return CharSourceRange();
}
auto End = this->Comments.back().Range.getEnd();
auto Length = (char *)End.getOpaquePointerValue() -
(char* )Start.getOpaquePointerValue();
return CharSourceRange(Start, Length);
}
28 changes: 14 additions & 14 deletions lib/IDE/SyntaxModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,12 @@ CharSourceRange parameterNameRangeOfCallArg(const TupleExpr *TE,
return CharSourceRange();
}

static void setDecl(SyntaxStructureNode &N, Decl *D) {
N.Dcl = D;
N.Attrs = D->getAttrs();
N.DocRange = D->getRawComment().getCharSourceRange();
}

} // anonymous namespace

bool SyntaxModelContext::walk(SyntaxModelWalker &Walker) {
Expand Down Expand Up @@ -753,7 +759,7 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
} else {
// Pass Function / Method structure node.
SyntaxStructureNode SN;
SN.Dcl = D;
setDecl(SN, D);
const DeclContext *DC = AFD->getDeclContext();
if (DC->isTypeContext()) {
if (FD && FD->isStatic()) {
Expand All @@ -772,12 +778,11 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
AFD->getBodySourceRange());
SN.NameRange = charSourceRangeFromSourceRange(SM,
AFD->getSignatureSourceRange());
SN.Attrs = AFD->getAttrs();
pushStructureNode(SN, AFD);
}
} else if (auto *NTD = dyn_cast<NominalTypeDecl>(D)) {
SyntaxStructureNode SN;
SN.Dcl = D;
setDecl(SN, D);
SN.Kind = syntaxStructureKindFromNominalTypeDecl(NTD);
SN.Range = charSourceRangeFromSourceRange(SM, NTD->getSourceRange());
SN.BodyRange = innerCharSourceRangeFromSourceRange(SM, NTD->getBraces());
Expand All @@ -792,12 +797,11 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
SN.Elements.emplace_back(SyntaxStructureElementKind::TypeRef, TR);
}

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

} else if (auto *ED = dyn_cast<ExtensionDecl>(D)) {
SyntaxStructureNode SN;
SN.Dcl = D;
setDecl(SN, D);
SN.Kind = SyntaxStructureKind::Extension;
SN.Range = charSourceRangeFromSourceRange(SM, ED->getSourceRange());
SN.BodyRange = innerCharSourceRangeFromSourceRange(SM, ED->getBraces());
Expand All @@ -811,7 +815,6 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
SN.Elements.emplace_back(SyntaxStructureElementKind::TypeRef, TR);
}

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

} else if (auto *PD = dyn_cast<ParamDecl>(D)) {
Expand All @@ -832,7 +835,7 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
const DeclContext *DC = VD->getDeclContext();
if (DC->isTypeContext() || DC->isModuleScopeContext()) {
SyntaxStructureNode SN;
SN.Dcl = D;
setDecl(SN, D);
SourceRange SR;
if (auto *PBD = VD->getParentPatternBinding())
SR = PBD->getSourceRange();
Expand Down Expand Up @@ -863,7 +866,6 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
} else {
SN.Kind = SyntaxStructureKind::GlobalVariable;
}
SN.Attrs = VD->getAttrs();
pushStructureNode(SN, VD);
}

Expand Down Expand Up @@ -915,7 +917,7 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {

} else if (auto *EnumCaseD = dyn_cast<EnumCaseDecl>(D)) {
SyntaxStructureNode SN;
SN.Dcl = D;
setDecl(SN, D);
SN.Kind = SyntaxStructureKind::EnumCase;
SN.Range = charSourceRangeFromSourceRange(SM, D->getSourceRange());

Expand All @@ -939,7 +941,7 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
if (EnumElemD->getName().empty())
continue;
SyntaxStructureNode SN;
SN.Dcl = EnumElemD;
setDecl(SN, EnumElemD);
SN.Kind = SyntaxStructureKind::EnumElement;
SN.Range = charSourceRangeFromSourceRange(SM,
EnumElemD->getSourceRange());
Expand All @@ -956,23 +958,21 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
}
} else if (auto *TypeAliasD = dyn_cast<TypeAliasDecl>(D)) {
SyntaxStructureNode SN;
SN.Dcl = TypeAliasD;
setDecl(SN, D);
SN.Kind = SyntaxStructureKind::TypeAlias;
SN.Range = charSourceRangeFromSourceRange(SM,
TypeAliasD->getSourceRange());
SN.NameRange = CharSourceRange(TypeAliasD->getNameLoc(),
TypeAliasD->getName().getLength());
SN.Attrs = TypeAliasD->getAttrs();
pushStructureNode(SN, TypeAliasD);
} else if (auto *SubscriptD = dyn_cast<SubscriptDecl>(D)) {
SyntaxStructureNode SN;
SN.Dcl = SubscriptD;
setDecl(SN, D);
SN.Kind = SyntaxStructureKind::Subscript;
SN.Range = charSourceRangeFromSourceRange(SM,
SubscriptD->getSourceRange());
SN.BodyRange = innerCharSourceRangeFromSourceRange(SM,
SubscriptD->getBracesRange());
SN.Attrs = SubscriptD->getAttrs();
pushStructureNode(SN, SubscriptD);
}

Expand Down
54 changes: 44 additions & 10 deletions test/SourceKit/InterfaceGen/gen_clang_module.swift.response
Original file line number Diff line number Diff line change
Expand Up @@ -4116,6 +4116,8 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.namelength: 8,
key.bodyoffset: 237,
key.bodylength: 106,
key.docoffset: 157,
key.doclength: 26,
key.inheritedtypes: [
{
key.name: "RawRepresentable"
Expand Down Expand Up @@ -4199,7 +4201,9 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.length: 31,
key.typename: "FooEnum1",
key.nameoffset: 384,
key.namelength: 9
key.namelength: 9,
key.docoffset: 346,
key.doclength: 27
},
{
key.kind: source.lang.swift.decl.struct,
Expand Down Expand Up @@ -4423,6 +4427,8 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.namelength: 19,
key.bodyoffset: 970,
key.bodylength: 133,
key.docoffset: 894,
key.doclength: 37,
key.inheritedtypes: [
{
key.name: "Int"
Expand Down Expand Up @@ -4502,6 +4508,8 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.namelength: 17,
key.bodyoffset: 1186,
key.bodylength: 210,
key.docoffset: 1106,
key.doclength: 35,
key.inheritedtypes: [
{
key.name: "OptionSet"
Expand Down Expand Up @@ -4803,7 +4811,9 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.offset: 1974,
key.length: 29,
key.nameoffset: 1984,
key.namelength: 11
key.namelength: 11,
key.docoffset: 1938,
key.doclength: 29
},
{
key.kind: source.lang.swift.decl.var.global,
Expand All @@ -4814,7 +4824,9 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.length: 20,
key.typename: "Int32",
key.nameoffset: 2043,
key.namelength: 9
key.namelength: 9,
key.docoffset: 2005,
key.doclength: 27
},
{
key.kind: source.lang.swift.decl.function.free,
Expand All @@ -4824,6 +4836,8 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.length: 34,
key.nameoffset: 2099,
key.namelength: 20,
key.docoffset: 2061,
key.doclength: 26,
key.substructure: [
{
key.kind: source.lang.swift.decl.var.parameter,
Expand Down Expand Up @@ -4967,7 +4981,9 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.offset: 2627,
key.length: 26,
key.nameoffset: 2632,
key.namelength: 21
key.namelength: 21,
key.docoffset: 2557,
key.doclength: 62
},
{
key.kind: source.lang.swift.decl.function.free,
Expand All @@ -4985,7 +5001,9 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.offset: 2800,
key.length: 26,
key.nameoffset: 2805,
key.namelength: 21
key.namelength: 21,
key.docoffset: 2733,
key.doclength: 59
},
{
key.kind: source.lang.swift.decl.function.free,
Expand All @@ -4994,7 +5012,9 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.offset: 2888,
key.length: 26,
key.nameoffset: 2893,
key.namelength: 21
key.namelength: 21,
key.docoffset: 2828,
key.doclength: 53
},
{
key.kind: source.lang.swift.decl.function.free,
Expand All @@ -5003,7 +5023,9 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.offset: 2982,
key.length: 26,
key.nameoffset: 2987,
key.namelength: 21
key.namelength: 21,
key.docoffset: 2916,
key.doclength: 59
},
{
key.kind: source.lang.swift.decl.function.free,
Expand All @@ -5013,6 +5035,8 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.length: 58,
key.nameoffset: 3072,
key.namelength: 44,
key.docoffset: 3010,
key.doclength: 50,
key.substructure: [
{
key.kind: source.lang.swift.decl.var.parameter,
Expand All @@ -5036,6 +5060,8 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.namelength: 15,
key.bodyoffset: 3193,
key.bodylength: 545,
key.docoffset: 3127,
key.doclength: 33,
key.substructure: [
{
key.kind: source.lang.swift.decl.function.method.instance,
Expand All @@ -5044,7 +5070,9 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.offset: 3258,
key.length: 19,
key.nameoffset: 3263,
key.namelength: 14
key.namelength: 14,
key.docoffset: 3204,
key.doclength: 43
},
{
key.kind: source.lang.swift.decl.function.method.instance,
Expand All @@ -5053,7 +5081,9 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.offset: 3363,
key.length: 40,
key.nameoffset: 3368,
key.namelength: 35
key.namelength: 35,
key.docoffset: 3288,
key.doclength: 64
},
{
key.kind: source.lang.swift.decl.function.method.instance,
Expand All @@ -5062,7 +5092,9 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.offset: 3503,
key.length: 40,
key.nameoffset: 3508,
key.namelength: 35
key.namelength: 35,
key.docoffset: 3414,
key.doclength: 77
},
{
key.kind: source.lang.swift.decl.function.method.static,
Expand Down Expand Up @@ -5243,6 +5275,8 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
key.namelength: 15,
key.bodyoffset: 4192,
key.bodylength: 422,
key.docoffset: 4096,
key.doclength: 33,
key.inheritedtypes: [
{
key.name: "FooClassBase"
Expand Down
4 changes: 3 additions & 1 deletion test/SourceKit/InterfaceGen/gen_header.swift.response
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,9 @@ public protocol SameNameProtocol {
key.nameoffset: 179,
key.namelength: 8,
key.bodyoffset: 189,
key.bodylength: 1
key.bodylength: 1,
key.docoffset: 106,
key.doclength: 62
},
{
key.kind: source.lang.swift.decl.protocol,
Expand Down
10 changes: 8 additions & 2 deletions test/SourceKit/InterfaceGen/gen_swift_source.swift.response
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,8 @@ internal enum Colors {
key.namelength: 19,
key.bodyoffset: 200,
key.bodylength: 51,
key.docoffset: 139,
key.doclength: 27,
key.substructure: [
{
key.kind: source.lang.swift.decl.function.method.instance,
Expand Down Expand Up @@ -498,7 +500,9 @@ internal enum Colors {
key.length: 13,
key.typename: "Int",
key.nameoffset: 512,
key.namelength: 4
key.namelength: 4,
key.docoffset: 473,
key.doclength: 22
},
{
key.kind: source.lang.swift.decl.var.instance,
Expand All @@ -509,7 +513,9 @@ internal enum Colors {
key.length: 24,
key.typename: "(Int, Int)",
key.nameoffset: 564,
key.namelength: 2
key.namelength: 2,
key.docoffset: 527,
key.doclength: 19
}
]
},
Expand Down
2 changes: 2 additions & 0 deletions tools/SourceKit/include/SourceKit/Core/LangSupport.h
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,8 @@ class EditorConsumer {
unsigned NameLength,
unsigned BodyOffset,
unsigned BodyLength,
unsigned DocOffset,
unsigned DocLength,
StringRef DisplayName,
StringRef TypeName,
StringRef RuntimeName,
Expand Down
2 changes: 2 additions & 0 deletions tools/SourceKit/include/SourceKit/Core/ProtocolUIDs.def
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ KEY(BodyOffset, "key.bodyoffset")
KEY(BodyLength, "key.bodylength")
KEY(ThrowOffset, "key.throwoffset")
KEY(ThrowLength, "key.throwlength")
KEY(DocOffset, "key.docoffset")
KEY(DocLength, "key.doclength")
KEY(IsLocal, "key.is_local")
KEY(InheritedTypes, "key.inheritedtypes")
KEY(Attributes, "key.attributes")
Expand Down
Loading