@@ -418,6 +418,21 @@ CharSourceRange parameterNameRangeOfCallArg(const TupleExpr *TE,
418
418
return CharSourceRange ();
419
419
}
420
420
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
+
421
436
} // anonymous namespace
422
437
423
438
bool SyntaxModelContext::walk (SyntaxModelWalker &Walker) {
@@ -753,7 +768,7 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
753
768
} else {
754
769
// Pass Function / Method structure node.
755
770
SyntaxStructureNode SN;
756
- SN. Dcl = D ;
771
+ setDecl (SN, D) ;
757
772
const DeclContext *DC = AFD->getDeclContext ();
758
773
if (DC->isTypeContext ()) {
759
774
if (FD && FD->isStatic ()) {
@@ -772,12 +787,11 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
772
787
AFD->getBodySourceRange ());
773
788
SN.NameRange = charSourceRangeFromSourceRange (SM,
774
789
AFD->getSignatureSourceRange ());
775
- SN.Attrs = AFD->getAttrs ();
776
790
pushStructureNode (SN, AFD);
777
791
}
778
792
} else if (auto *NTD = dyn_cast<NominalTypeDecl>(D)) {
779
793
SyntaxStructureNode SN;
780
- SN. Dcl = D ;
794
+ setDecl (SN, D) ;
781
795
SN.Kind = syntaxStructureKindFromNominalTypeDecl (NTD);
782
796
SN.Range = charSourceRangeFromSourceRange (SM, NTD->getSourceRange ());
783
797
SN.BodyRange = innerCharSourceRangeFromSourceRange (SM, NTD->getBraces ());
@@ -792,12 +806,11 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
792
806
SN.Elements .emplace_back (SyntaxStructureElementKind::TypeRef, TR);
793
807
}
794
808
795
- SN.Attrs = NTD->getAttrs ();
796
809
pushStructureNode (SN, NTD);
797
810
798
811
} else if (auto *ED = dyn_cast<ExtensionDecl>(D)) {
799
812
SyntaxStructureNode SN;
800
- SN. Dcl = D ;
813
+ setDecl (SN, D) ;
801
814
SN.Kind = SyntaxStructureKind::Extension;
802
815
SN.Range = charSourceRangeFromSourceRange (SM, ED->getSourceRange ());
803
816
SN.BodyRange = innerCharSourceRangeFromSourceRange (SM, ED->getBraces ());
@@ -811,7 +824,6 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
811
824
SN.Elements .emplace_back (SyntaxStructureElementKind::TypeRef, TR);
812
825
}
813
826
814
- SN.Attrs = ED->getAttrs ();
815
827
pushStructureNode (SN, ED);
816
828
817
829
} else if (auto *PD = dyn_cast<ParamDecl>(D)) {
@@ -832,7 +844,7 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
832
844
const DeclContext *DC = VD->getDeclContext ();
833
845
if (DC->isTypeContext () || DC->isModuleScopeContext ()) {
834
846
SyntaxStructureNode SN;
835
- SN. Dcl = D ;
847
+ setDecl (SN, D) ;
836
848
SourceRange SR;
837
849
if (auto *PBD = VD->getParentPatternBinding ())
838
850
SR = PBD->getSourceRange ();
@@ -863,7 +875,6 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
863
875
} else {
864
876
SN.Kind = SyntaxStructureKind::GlobalVariable;
865
877
}
866
- SN.Attrs = VD->getAttrs ();
867
878
pushStructureNode (SN, VD);
868
879
}
869
880
@@ -915,7 +926,7 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
915
926
916
927
} else if (auto *EnumCaseD = dyn_cast<EnumCaseDecl>(D)) {
917
928
SyntaxStructureNode SN;
918
- SN. Dcl = D ;
929
+ setDecl (SN, D) ;
919
930
SN.Kind = SyntaxStructureKind::EnumCase;
920
931
SN.Range = charSourceRangeFromSourceRange (SM, D->getSourceRange ());
921
932
@@ -939,7 +950,7 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
939
950
if (EnumElemD->getName ().empty ())
940
951
continue ;
941
952
SyntaxStructureNode SN;
942
- SN. Dcl = EnumElemD;
953
+ setDecl (SN, EnumElemD) ;
943
954
SN.Kind = SyntaxStructureKind::EnumElement;
944
955
SN.Range = charSourceRangeFromSourceRange (SM,
945
956
EnumElemD->getSourceRange ());
@@ -956,23 +967,21 @@ bool ModelASTWalker::walkToDeclPre(Decl *D) {
956
967
}
957
968
} else if (auto *TypeAliasD = dyn_cast<TypeAliasDecl>(D)) {
958
969
SyntaxStructureNode SN;
959
- SN. Dcl = TypeAliasD ;
970
+ setDecl (SN, D) ;
960
971
SN.Kind = SyntaxStructureKind::TypeAlias;
961
972
SN.Range = charSourceRangeFromSourceRange (SM,
962
973
TypeAliasD->getSourceRange ());
963
974
SN.NameRange = CharSourceRange (TypeAliasD->getNameLoc (),
964
975
TypeAliasD->getName ().getLength ());
965
- SN.Attrs = TypeAliasD->getAttrs ();
966
976
pushStructureNode (SN, TypeAliasD);
967
977
} else if (auto *SubscriptD = dyn_cast<SubscriptDecl>(D)) {
968
978
SyntaxStructureNode SN;
969
- SN. Dcl = SubscriptD ;
979
+ setDecl (SN, D) ;
970
980
SN.Kind = SyntaxStructureKind::Subscript;
971
981
SN.Range = charSourceRangeFromSourceRange (SM,
972
982
SubscriptD->getSourceRange ());
973
983
SN.BodyRange = innerCharSourceRangeFromSourceRange (SM,
974
984
SubscriptD->getBracesRange ());
975
- SN.Attrs = SubscriptD->getAttrs ();
976
985
pushStructureNode (SN, SubscriptD);
977
986
}
978
987
0 commit comments