@@ -42,38 +42,112 @@ static json::Object serializeLocation(const Location &Loc,
4242 return LocationObj;
4343}
4444
45- static json::Value serializeComment (const CommentInfo &Comment) {
46- assert ((Comment.Kind == " BlockCommandComment" ||
47- Comment.Kind == " FullComment" || Comment.Kind == " ParagraphComment" ||
48- Comment.Kind == " TextComment" ) &&
49- " Unknown Comment type in CommentInfo." );
50-
45+ static json::Value serializeComment (const CommentInfo &I) {
46+ // taken from PR #142273
5147 Object Obj = Object ();
52- json::Value Child = Object ();
5348
54- // TextComment has no children, so return it.
55- if (Comment.Kind == " TextComment" ) {
56- Obj[" TextComment" ] = Comment.Text ;
57- return Obj;
58- }
49+ json::Value ChildVal = Object ();
50+ Object &Child = *ChildVal.getAsObject ();
5951
60- // BlockCommandComment needs to generate a Command key.
61- if (Comment.Kind == " BlockCommandComment" )
62- Child.getAsObject ()->insert ({" Command" , Comment.Name });
63-
64- // Use the same handling for everything else.
65- // Only valid for:
66- // - BlockCommandComment
67- // - FullComment
68- // - ParagraphComment
6952 json::Value ChildArr = Array ();
7053 auto &CARef = *ChildArr.getAsArray ();
71- CARef.reserve (Comment .Children .size ());
72- for (const auto &C : Comment .Children )
54+ CARef.reserve (I .Children .size ());
55+ for (const auto &C : I .Children )
7356 CARef.emplace_back (serializeComment (*C));
74- Child.getAsObject ()->insert ({" Children" , ChildArr});
75- Obj.insert ({Comment.Kind , Child});
76- return Obj;
57+
58+ switch (I.Kind ) {
59+ case CommentKind::CK_TextComment: {
60+ Obj.insert ({commentKindToString (I.Kind ), I.Text });
61+ return Obj;
62+ }
63+
64+ case CommentKind::CK_BlockCommandComment: {
65+ Child.insert ({" Command" , I.Name });
66+ Child.insert ({" Children" , ChildArr});
67+ Obj.insert ({commentKindToString (I.Kind ), ChildVal});
68+ return Obj;
69+ }
70+
71+ case CommentKind::CK_InlineCommandComment: {
72+ json::Value ArgsArr = Array ();
73+ auto &ARef = *ArgsArr.getAsArray ();
74+ ARef.reserve (I.Args .size ());
75+ for (const auto &Arg : I.Args )
76+ ARef.emplace_back (Arg);
77+ Child.insert ({" Command" , I.Name });
78+ Child.insert ({" Args" , ArgsArr});
79+ Child.insert ({" Children" , ChildArr});
80+ Obj.insert ({commentKindToString (I.Kind ), ChildVal});
81+ return Obj;
82+ }
83+
84+ case CommentKind::CK_ParamCommandComment:
85+ case CommentKind::CK_TParamCommandComment: {
86+ Child.insert ({" ParamName" , I.ParamName });
87+ Child.insert ({" Direction" , I.Direction });
88+ Child.insert ({" Explicit" , I.Explicit });
89+ Child.insert ({" Children" , ChildArr});
90+ Obj.insert ({commentKindToString (I.Kind ), ChildVal});
91+ return Obj;
92+ }
93+
94+ case CommentKind::CK_VerbatimBlockComment: {
95+ Child.insert ({" Text" , I.Text });
96+ if (!I.CloseName .empty ())
97+ Child.insert ({" CloseName" , I.CloseName });
98+ Child.insert ({" Children" , ChildArr});
99+ Obj.insert ({commentKindToString (I.Kind ), ChildVal});
100+ return Obj;
101+ }
102+
103+ case CommentKind::CK_VerbatimBlockLineComment:
104+ case CommentKind::CK_VerbatimLineComment: {
105+ Child.insert ({" Text" , I.Text });
106+ Child.insert ({" Children" , ChildArr});
107+ Obj.insert ({commentKindToString (I.Kind ), ChildVal});
108+ return Obj;
109+ }
110+
111+ case CommentKind::CK_HTMLStartTagComment: {
112+ json::Value AttrKeysArray = json::Array ();
113+ json::Value AttrValuesArray = json::Array ();
114+ auto &KeyArr = *AttrKeysArray.getAsArray ();
115+ auto &ValArr = *AttrValuesArray.getAsArray ();
116+ KeyArr.reserve (I.AttrKeys .size ());
117+ ValArr.reserve (I.AttrValues .size ());
118+ for (const auto &K : I.AttrKeys )
119+ KeyArr.emplace_back (K);
120+ for (const auto &V : I.AttrValues )
121+ ValArr.emplace_back (V);
122+ Child.insert ({" Name" , I.Name });
123+ Child.insert ({" SelfClosing" , I.SelfClosing });
124+ Child.insert ({" AttrKeys" , AttrKeysArray});
125+ Child.insert ({" AttrValues" , AttrValuesArray});
126+ Child.insert ({" Children" , ChildArr});
127+ Obj.insert ({commentKindToString (I.Kind ), ChildVal});
128+ return Obj;
129+ }
130+
131+ case CommentKind::CK_HTMLEndTagComment: {
132+ Child.insert ({" Name" , I.Name });
133+ Child.insert ({" Children" , ChildArr});
134+ Obj.insert ({commentKindToString (I.Kind ), ChildVal});
135+ return Obj;
136+ }
137+
138+ case CommentKind::CK_FullComment:
139+ case CommentKind::CK_ParagraphComment: {
140+ Child.insert ({" Children" , ChildArr});
141+ Obj.insert ({commentKindToString (I.Kind ), ChildVal});
142+ return Obj;
143+ }
144+
145+ case CommentKind::CK_Unknown: {
146+ Obj.insert ({commentKindToString (I.Kind ), I.Text });
147+ return Obj;
148+ }
149+ }
150+ llvm_unreachable (" Unknown comment kind encountered." );
77151}
78152
79153static void serializeCommonAttributes (const Info &I, json::Object &Obj,
@@ -108,12 +182,8 @@ static void serializeCommonAttributes(const Info &I, json::Object &Obj,
108182 }
109183}
110184
111- static void serializeReference (const Reference &Ref, Object &ReferenceObj,
112- SmallString<64 > CurrentDirectory) {
113- SmallString<64 > Path = Ref.getRelativeFilePath (CurrentDirectory);
114- sys::path::append (Path, Ref.getFileBaseName () + " .json" );
115- sys::path::native (Path, sys::path::Style::posix);
116- ReferenceObj[" Link" ] = Path;
185+ static void serializeReference (const Reference &Ref, Object &ReferenceObj) {
186+ ReferenceObj[" Path" ] = Ref.Path ;
117187 ReferenceObj[" Name" ] = Ref.Name ;
118188 ReferenceObj[" QualName" ] = Ref.QualName ;
119189 ReferenceObj[" USR" ] = toHex (toStringRef (Ref.USR ));
@@ -127,8 +197,7 @@ static void serializeReference(const SmallVector<Reference, 4> &References,
127197 for (const auto &Reference : References) {
128198 json::Value ReferenceVal = Object ();
129199 auto &ReferenceObj = *ReferenceVal.getAsObject ();
130- auto BasePath = Reference.getRelativeFilePath (" " );
131- serializeReference (Reference, ReferenceObj, BasePath);
200+ serializeReference (Reference, ReferenceObj);
132201 ReferencesArrayRef.push_back (ReferenceVal);
133202 }
134203 Obj[Key] = ReferencesArray;
@@ -172,8 +241,7 @@ static void serializeCommonChildren(const ScopeChildren &Children,
172241 for (const auto &Record : Children.Records ) {
173242 json::Value RecordVal = Object ();
174243 auto &RecordObj = *RecordVal.getAsObject ();
175- SmallString<64 > BasePath = Record.getRelativeFilePath (" " );
176- serializeReference (Record, RecordObj, BasePath);
244+ serializeReference (Record, RecordObj);
177245 RecordsArrayRef.push_back (RecordVal);
178246 }
179247 Obj[" Records" ] = RecordsArray;
0 commit comments