annotate clang-tools-extra/clang-doc/Representation.h @ 201:a96fbbdf2d0f

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 04 Jun 2021 21:07:06 +0900
parents 0572611fdcc8
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 ///===-- Representation.h - ClangDoc Representation -------------*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file defines the internal representations of different declaration
anatofuz
parents:
diff changeset
10 // types for the clang-doc tool.
anatofuz
parents:
diff changeset
11 //
anatofuz
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_REPRESENTATION_H
anatofuz
parents:
diff changeset
15 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_REPRESENTATION_H
anatofuz
parents:
diff changeset
16
anatofuz
parents:
diff changeset
17 #include "clang/AST/Type.h"
anatofuz
parents:
diff changeset
18 #include "clang/Basic/Specifiers.h"
anatofuz
parents:
diff changeset
19 #include "clang/Tooling/StandaloneExecution.h"
anatofuz
parents:
diff changeset
20 #include "llvm/ADT/Optional.h"
anatofuz
parents:
diff changeset
21 #include "llvm/ADT/SmallVector.h"
anatofuz
parents:
diff changeset
22 #include "llvm/ADT/StringExtras.h"
anatofuz
parents:
diff changeset
23 #include <array>
anatofuz
parents:
diff changeset
24 #include <string>
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 namespace clang {
anatofuz
parents:
diff changeset
27 namespace doc {
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 // SHA1'd hash of a USR.
anatofuz
parents:
diff changeset
30 using SymbolID = std::array<uint8_t, 20>;
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 struct Info;
anatofuz
parents:
diff changeset
33 struct FunctionInfo;
anatofuz
parents:
diff changeset
34 struct EnumInfo;
anatofuz
parents:
diff changeset
35 struct BaseRecordInfo;
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37 enum class InfoType {
anatofuz
parents:
diff changeset
38 IT_default,
anatofuz
parents:
diff changeset
39 IT_namespace,
anatofuz
parents:
diff changeset
40 IT_record,
anatofuz
parents:
diff changeset
41 IT_function,
anatofuz
parents:
diff changeset
42 IT_enum
anatofuz
parents:
diff changeset
43 };
anatofuz
parents:
diff changeset
44
anatofuz
parents:
diff changeset
45 // A representation of a parsed comment.
anatofuz
parents:
diff changeset
46 struct CommentInfo {
anatofuz
parents:
diff changeset
47 CommentInfo() = default;
anatofuz
parents:
diff changeset
48 CommentInfo(CommentInfo &Other) = delete;
anatofuz
parents:
diff changeset
49 CommentInfo(CommentInfo &&Other) = default;
anatofuz
parents:
diff changeset
50 CommentInfo &operator=(CommentInfo &&Other) = default;
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 bool operator==(const CommentInfo &Other) const {
anatofuz
parents:
diff changeset
53 auto FirstCI = std::tie(Kind, Text, Name, Direction, ParamName, CloseName,
anatofuz
parents:
diff changeset
54 SelfClosing, Explicit, AttrKeys, AttrValues, Args);
anatofuz
parents:
diff changeset
55 auto SecondCI =
anatofuz
parents:
diff changeset
56 std::tie(Other.Kind, Other.Text, Other.Name, Other.Direction,
anatofuz
parents:
diff changeset
57 Other.ParamName, Other.CloseName, Other.SelfClosing,
anatofuz
parents:
diff changeset
58 Other.Explicit, Other.AttrKeys, Other.AttrValues, Other.Args);
anatofuz
parents:
diff changeset
59
anatofuz
parents:
diff changeset
60 if (FirstCI != SecondCI || Children.size() != Other.Children.size())
anatofuz
parents:
diff changeset
61 return false;
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 return std::equal(Children.begin(), Children.end(), Other.Children.begin(),
anatofuz
parents:
diff changeset
64 llvm::deref<std::equal_to<>>{});
anatofuz
parents:
diff changeset
65 }
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 // This operator is used to sort a vector of CommentInfos.
anatofuz
parents:
diff changeset
68 // No specific order (attributes more important than others) is required. Any
anatofuz
parents:
diff changeset
69 // sort is enough, the order is only needed to call std::unique after sorting
anatofuz
parents:
diff changeset
70 // the vector.
anatofuz
parents:
diff changeset
71 bool operator<(const CommentInfo &Other) const {
anatofuz
parents:
diff changeset
72 auto FirstCI = std::tie(Kind, Text, Name, Direction, ParamName, CloseName,
anatofuz
parents:
diff changeset
73 SelfClosing, Explicit, AttrKeys, AttrValues, Args);
anatofuz
parents:
diff changeset
74 auto SecondCI =
anatofuz
parents:
diff changeset
75 std::tie(Other.Kind, Other.Text, Other.Name, Other.Direction,
anatofuz
parents:
diff changeset
76 Other.ParamName, Other.CloseName, Other.SelfClosing,
anatofuz
parents:
diff changeset
77 Other.Explicit, Other.AttrKeys, Other.AttrValues, Other.Args);
anatofuz
parents:
diff changeset
78
anatofuz
parents:
diff changeset
79 if (FirstCI < SecondCI)
anatofuz
parents:
diff changeset
80 return true;
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 if (FirstCI == SecondCI) {
anatofuz
parents:
diff changeset
83 return std::lexicographical_compare(
anatofuz
parents:
diff changeset
84 Children.begin(), Children.end(), Other.Children.begin(),
anatofuz
parents:
diff changeset
85 Other.Children.end(), llvm::deref<std::less<>>());
anatofuz
parents:
diff changeset
86 }
anatofuz
parents:
diff changeset
87
anatofuz
parents:
diff changeset
88 return false;
anatofuz
parents:
diff changeset
89 }
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 SmallString<16>
anatofuz
parents:
diff changeset
92 Kind; // Kind of comment (FullComment, ParagraphComment, TextComment,
anatofuz
parents:
diff changeset
93 // InlineCommandComment, HTMLStartTagComment, HTMLEndTagComment,
anatofuz
parents:
diff changeset
94 // BlockCommandComment, ParamCommandComment,
anatofuz
parents:
diff changeset
95 // TParamCommandComment, VerbatimBlockComment,
anatofuz
parents:
diff changeset
96 // VerbatimBlockLineComment, VerbatimLineComment).
anatofuz
parents:
diff changeset
97 SmallString<64> Text; // Text of the comment.
anatofuz
parents:
diff changeset
98 SmallString<16> Name; // Name of the comment (for Verbatim and HTML).
anatofuz
parents:
diff changeset
99 SmallString<8> Direction; // Parameter direction (for (T)ParamCommand).
anatofuz
parents:
diff changeset
100 SmallString<16> ParamName; // Parameter name (for (T)ParamCommand).
anatofuz
parents:
diff changeset
101 SmallString<16> CloseName; // Closing tag name (for VerbatimBlock).
anatofuz
parents:
diff changeset
102 bool SelfClosing = false; // Indicates if tag is self-closing (for HTML).
anatofuz
parents:
diff changeset
103 bool Explicit = false; // Indicates if the direction of a param is explicit
anatofuz
parents:
diff changeset
104 // (for (T)ParamCommand).
anatofuz
parents:
diff changeset
105 llvm::SmallVector<SmallString<16>, 4>
anatofuz
parents:
diff changeset
106 AttrKeys; // List of attribute keys (for HTML).
anatofuz
parents:
diff changeset
107 llvm::SmallVector<SmallString<16>, 4>
anatofuz
parents:
diff changeset
108 AttrValues; // List of attribute values for each key (for HTML).
anatofuz
parents:
diff changeset
109 llvm::SmallVector<SmallString<16>, 4>
anatofuz
parents:
diff changeset
110 Args; // List of arguments to commands (for InlineCommand).
anatofuz
parents:
diff changeset
111 std::vector<std::unique_ptr<CommentInfo>>
anatofuz
parents:
diff changeset
112 Children; // List of child comments for this CommentInfo.
anatofuz
parents:
diff changeset
113 };
anatofuz
parents:
diff changeset
114
anatofuz
parents:
diff changeset
115 struct Reference {
anatofuz
parents:
diff changeset
116 Reference() = default;
anatofuz
parents:
diff changeset
117 Reference(llvm::StringRef Name) : Name(Name) {}
anatofuz
parents:
diff changeset
118 // An empty path means the info is in the global namespace because the path is
anatofuz
parents:
diff changeset
119 // a composite of the parent namespaces.
anatofuz
parents:
diff changeset
120 Reference(llvm::StringRef Name, StringRef Path)
anatofuz
parents:
diff changeset
121 : Name(Name), Path(Path), IsInGlobalNamespace(Path.empty()) {}
anatofuz
parents:
diff changeset
122 Reference(SymbolID USR, StringRef Name, InfoType IT)
anatofuz
parents:
diff changeset
123 : USR(USR), Name(Name), RefType(IT) {}
anatofuz
parents:
diff changeset
124 // An empty path means the info is in the global namespace because the path is
anatofuz
parents:
diff changeset
125 // a composite of the parent namespaces.
anatofuz
parents:
diff changeset
126 Reference(SymbolID USR, StringRef Name, InfoType IT, StringRef Path)
anatofuz
parents:
diff changeset
127 : USR(USR), Name(Name), RefType(IT), Path(Path),
anatofuz
parents:
diff changeset
128 IsInGlobalNamespace(Path.empty()) {}
anatofuz
parents:
diff changeset
129
anatofuz
parents:
diff changeset
130 bool operator==(const Reference &Other) const {
anatofuz
parents:
diff changeset
131 return std::tie(USR, Name, RefType) ==
anatofuz
parents:
diff changeset
132 std::tie(Other.USR, Other.Name, Other.RefType);
anatofuz
parents:
diff changeset
133 }
anatofuz
parents:
diff changeset
134
anatofuz
parents:
diff changeset
135 bool mergeable(const Reference &Other);
anatofuz
parents:
diff changeset
136 void merge(Reference &&I);
anatofuz
parents:
diff changeset
137
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
138 /// Returns the path for this Reference relative to CurrentPath.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
139 llvm::SmallString<64> getRelativeFilePath(const StringRef &CurrentPath) const;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
140
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
141 /// Returns the basename that should be used for this Reference.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
142 llvm::SmallString<16> getFileBaseName() const;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
143
150
anatofuz
parents:
diff changeset
144 SymbolID USR = SymbolID(); // Unique identifier for referenced decl
anatofuz
parents:
diff changeset
145 SmallString<16> Name; // Name of type (possibly unresolved).
anatofuz
parents:
diff changeset
146 InfoType RefType = InfoType::IT_default; // Indicates the type of this
anatofuz
parents:
diff changeset
147 // Reference (namespace, record,
anatofuz
parents:
diff changeset
148 // function, enum, default).
anatofuz
parents:
diff changeset
149 // Path of directory where the clang-doc generated file will be saved
anatofuz
parents:
diff changeset
150 // (possibly unresolved)
anatofuz
parents:
diff changeset
151 llvm::SmallString<128> Path;
anatofuz
parents:
diff changeset
152 // Indicates if the info's parent is the global namespace, or if the info is
anatofuz
parents:
diff changeset
153 // the global namespace
anatofuz
parents:
diff changeset
154 bool IsInGlobalNamespace = false;
anatofuz
parents:
diff changeset
155 };
anatofuz
parents:
diff changeset
156
anatofuz
parents:
diff changeset
157 // A base struct for TypeInfos
anatofuz
parents:
diff changeset
158 struct TypeInfo {
anatofuz
parents:
diff changeset
159 TypeInfo() = default;
anatofuz
parents:
diff changeset
160 TypeInfo(SymbolID Type, StringRef Field, InfoType IT)
anatofuz
parents:
diff changeset
161 : Type(Type, Field, IT) {}
anatofuz
parents:
diff changeset
162 TypeInfo(SymbolID Type, StringRef Field, InfoType IT, StringRef Path)
anatofuz
parents:
diff changeset
163 : Type(Type, Field, IT, Path) {}
anatofuz
parents:
diff changeset
164 TypeInfo(llvm::StringRef RefName) : Type(RefName) {}
anatofuz
parents:
diff changeset
165 TypeInfo(llvm::StringRef RefName, StringRef Path) : Type(RefName, Path) {}
anatofuz
parents:
diff changeset
166
anatofuz
parents:
diff changeset
167 bool operator==(const TypeInfo &Other) const { return Type == Other.Type; }
anatofuz
parents:
diff changeset
168
anatofuz
parents:
diff changeset
169 Reference Type; // Referenced type in this info.
anatofuz
parents:
diff changeset
170 };
anatofuz
parents:
diff changeset
171
anatofuz
parents:
diff changeset
172 // Info for field types.
anatofuz
parents:
diff changeset
173 struct FieldTypeInfo : public TypeInfo {
anatofuz
parents:
diff changeset
174 FieldTypeInfo() = default;
anatofuz
parents:
diff changeset
175 FieldTypeInfo(SymbolID Type, StringRef Field, InfoType IT, StringRef Path,
anatofuz
parents:
diff changeset
176 llvm::StringRef Name)
anatofuz
parents:
diff changeset
177 : TypeInfo(Type, Field, IT, Path), Name(Name) {}
anatofuz
parents:
diff changeset
178 FieldTypeInfo(llvm::StringRef RefName, llvm::StringRef Name)
anatofuz
parents:
diff changeset
179 : TypeInfo(RefName), Name(Name) {}
anatofuz
parents:
diff changeset
180 FieldTypeInfo(llvm::StringRef RefName, StringRef Path, llvm::StringRef Name)
anatofuz
parents:
diff changeset
181 : TypeInfo(RefName, Path), Name(Name) {}
anatofuz
parents:
diff changeset
182
anatofuz
parents:
diff changeset
183 bool operator==(const FieldTypeInfo &Other) const {
anatofuz
parents:
diff changeset
184 return std::tie(Type, Name) == std::tie(Other.Type, Other.Name);
anatofuz
parents:
diff changeset
185 }
anatofuz
parents:
diff changeset
186
anatofuz
parents:
diff changeset
187 SmallString<16> Name; // Name associated with this info.
anatofuz
parents:
diff changeset
188 };
anatofuz
parents:
diff changeset
189
anatofuz
parents:
diff changeset
190 // Info for member types.
anatofuz
parents:
diff changeset
191 struct MemberTypeInfo : public FieldTypeInfo {
anatofuz
parents:
diff changeset
192 MemberTypeInfo() = default;
anatofuz
parents:
diff changeset
193 MemberTypeInfo(SymbolID Type, StringRef Field, InfoType IT, StringRef Path,
anatofuz
parents:
diff changeset
194 llvm::StringRef Name, AccessSpecifier Access)
anatofuz
parents:
diff changeset
195 : FieldTypeInfo(Type, Field, IT, Path, Name), Access(Access) {}
anatofuz
parents:
diff changeset
196 MemberTypeInfo(llvm::StringRef RefName, llvm::StringRef Name,
anatofuz
parents:
diff changeset
197 AccessSpecifier Access)
anatofuz
parents:
diff changeset
198 : FieldTypeInfo(RefName, Name), Access(Access) {}
anatofuz
parents:
diff changeset
199 MemberTypeInfo(llvm::StringRef RefName, StringRef Path, llvm::StringRef Name,
anatofuz
parents:
diff changeset
200 AccessSpecifier Access)
anatofuz
parents:
diff changeset
201 : FieldTypeInfo(RefName, Path, Name), Access(Access) {}
anatofuz
parents:
diff changeset
202
anatofuz
parents:
diff changeset
203 bool operator==(const MemberTypeInfo &Other) const {
anatofuz
parents:
diff changeset
204 return std::tie(Type, Name, Access) ==
anatofuz
parents:
diff changeset
205 std::tie(Other.Type, Other.Name, Other.Access);
anatofuz
parents:
diff changeset
206 }
anatofuz
parents:
diff changeset
207
anatofuz
parents:
diff changeset
208 // Access level associated with this info (public, protected, private, none).
anatofuz
parents:
diff changeset
209 // AS_public is set as default because the bitcode writer requires the enum
anatofuz
parents:
diff changeset
210 // with value 0 to be used as the default.
anatofuz
parents:
diff changeset
211 // (AS_public = 0, AS_protected = 1, AS_private = 2, AS_none = 3)
anatofuz
parents:
diff changeset
212 AccessSpecifier Access = AccessSpecifier::AS_public;
anatofuz
parents:
diff changeset
213 };
anatofuz
parents:
diff changeset
214
anatofuz
parents:
diff changeset
215 struct Location {
anatofuz
parents:
diff changeset
216 Location() = default;
anatofuz
parents:
diff changeset
217 Location(int LineNumber, SmallString<16> Filename)
anatofuz
parents:
diff changeset
218 : LineNumber(LineNumber), Filename(std::move(Filename)) {}
anatofuz
parents:
diff changeset
219 Location(int LineNumber, SmallString<16> Filename, bool IsFileInRootDir)
anatofuz
parents:
diff changeset
220 : LineNumber(LineNumber), Filename(std::move(Filename)),
anatofuz
parents:
diff changeset
221 IsFileInRootDir(IsFileInRootDir) {}
anatofuz
parents:
diff changeset
222
anatofuz
parents:
diff changeset
223 bool operator==(const Location &Other) const {
anatofuz
parents:
diff changeset
224 return std::tie(LineNumber, Filename) ==
anatofuz
parents:
diff changeset
225 std::tie(Other.LineNumber, Other.Filename);
anatofuz
parents:
diff changeset
226 }
anatofuz
parents:
diff changeset
227
anatofuz
parents:
diff changeset
228 // This operator is used to sort a vector of Locations.
anatofuz
parents:
diff changeset
229 // No specific order (attributes more important than others) is required. Any
anatofuz
parents:
diff changeset
230 // sort is enough, the order is only needed to call std::unique after sorting
anatofuz
parents:
diff changeset
231 // the vector.
anatofuz
parents:
diff changeset
232 bool operator<(const Location &Other) const {
anatofuz
parents:
diff changeset
233 return std::tie(LineNumber, Filename) <
anatofuz
parents:
diff changeset
234 std::tie(Other.LineNumber, Other.Filename);
anatofuz
parents:
diff changeset
235 }
anatofuz
parents:
diff changeset
236
anatofuz
parents:
diff changeset
237 int LineNumber; // Line number of this Location.
anatofuz
parents:
diff changeset
238 SmallString<32> Filename; // File for this Location.
anatofuz
parents:
diff changeset
239 bool IsFileInRootDir = false; // Indicates if file is inside root directory
anatofuz
parents:
diff changeset
240 };
anatofuz
parents:
diff changeset
241
anatofuz
parents:
diff changeset
242 /// A base struct for Infos.
anatofuz
parents:
diff changeset
243 struct Info {
anatofuz
parents:
diff changeset
244 Info() = default;
anatofuz
parents:
diff changeset
245 Info(InfoType IT) : IT(IT) {}
anatofuz
parents:
diff changeset
246 Info(InfoType IT, SymbolID USR) : USR(USR), IT(IT) {}
anatofuz
parents:
diff changeset
247 Info(InfoType IT, SymbolID USR, StringRef Name)
anatofuz
parents:
diff changeset
248 : USR(USR), IT(IT), Name(Name) {}
anatofuz
parents:
diff changeset
249 Info(InfoType IT, SymbolID USR, StringRef Name, StringRef Path)
anatofuz
parents:
diff changeset
250 : USR(USR), IT(IT), Name(Name), Path(Path) {}
anatofuz
parents:
diff changeset
251 Info(const Info &Other) = delete;
anatofuz
parents:
diff changeset
252 Info(Info &&Other) = default;
anatofuz
parents:
diff changeset
253
anatofuz
parents:
diff changeset
254 virtual ~Info() = default;
anatofuz
parents:
diff changeset
255
anatofuz
parents:
diff changeset
256 SymbolID USR =
anatofuz
parents:
diff changeset
257 SymbolID(); // Unique identifier for the decl described by this Info.
anatofuz
parents:
diff changeset
258 const InfoType IT = InfoType::IT_default; // InfoType of this particular Info.
anatofuz
parents:
diff changeset
259 SmallString<16> Name; // Unqualified name of the decl.
anatofuz
parents:
diff changeset
260 llvm::SmallVector<Reference, 4>
anatofuz
parents:
diff changeset
261 Namespace; // List of parent namespaces for this decl.
anatofuz
parents:
diff changeset
262 std::vector<CommentInfo> Description; // Comment description of this decl.
anatofuz
parents:
diff changeset
263 llvm::SmallString<128> Path; // Path of directory where the clang-doc
anatofuz
parents:
diff changeset
264 // generated file will be saved
anatofuz
parents:
diff changeset
265
anatofuz
parents:
diff changeset
266 void mergeBase(Info &&I);
anatofuz
parents:
diff changeset
267 bool mergeable(const Info &Other);
anatofuz
parents:
diff changeset
268
anatofuz
parents:
diff changeset
269 llvm::SmallString<16> extractName() const;
anatofuz
parents:
diff changeset
270
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
271 /// Returns the file path for this Info relative to CurrentPath.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
272 llvm::SmallString<64> getRelativeFilePath(const StringRef &CurrentPath) const;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
273
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
274 /// Returns the basename that should be used for this Info.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
275 llvm::SmallString<16> getFileBaseName() const;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
276
150
anatofuz
parents:
diff changeset
277 // Returns a reference to the parent scope (that is, the immediate parent
anatofuz
parents:
diff changeset
278 // namespace or class in which this decl resides).
anatofuz
parents:
diff changeset
279 llvm::Expected<Reference> getEnclosingScope();
anatofuz
parents:
diff changeset
280 };
anatofuz
parents:
diff changeset
281
anatofuz
parents:
diff changeset
282 // Info for namespaces.
anatofuz
parents:
diff changeset
283 struct NamespaceInfo : public Info {
anatofuz
parents:
diff changeset
284 NamespaceInfo() : Info(InfoType::IT_namespace) {}
anatofuz
parents:
diff changeset
285 NamespaceInfo(SymbolID USR) : Info(InfoType::IT_namespace, USR) {}
anatofuz
parents:
diff changeset
286 NamespaceInfo(SymbolID USR, StringRef Name)
anatofuz
parents:
diff changeset
287 : Info(InfoType::IT_namespace, USR, Name) {}
anatofuz
parents:
diff changeset
288 NamespaceInfo(SymbolID USR, StringRef Name, StringRef Path)
anatofuz
parents:
diff changeset
289 : Info(InfoType::IT_namespace, USR, Name, Path) {}
anatofuz
parents:
diff changeset
290
anatofuz
parents:
diff changeset
291 void merge(NamespaceInfo &&I);
anatofuz
parents:
diff changeset
292
anatofuz
parents:
diff changeset
293 // Namespaces and Records are references because they will be properly
anatofuz
parents:
diff changeset
294 // documented in their own info, while the entirety of Functions and Enums are
anatofuz
parents:
diff changeset
295 // included here because they should not have separate documentation from
anatofuz
parents:
diff changeset
296 // their scope.
anatofuz
parents:
diff changeset
297 std::vector<Reference> ChildNamespaces;
anatofuz
parents:
diff changeset
298 std::vector<Reference> ChildRecords;
anatofuz
parents:
diff changeset
299 std::vector<FunctionInfo> ChildFunctions;
anatofuz
parents:
diff changeset
300 std::vector<EnumInfo> ChildEnums;
anatofuz
parents:
diff changeset
301 };
anatofuz
parents:
diff changeset
302
anatofuz
parents:
diff changeset
303 // Info for symbols.
anatofuz
parents:
diff changeset
304 struct SymbolInfo : public Info {
anatofuz
parents:
diff changeset
305 SymbolInfo(InfoType IT) : Info(IT) {}
anatofuz
parents:
diff changeset
306 SymbolInfo(InfoType IT, SymbolID USR) : Info(IT, USR) {}
anatofuz
parents:
diff changeset
307 SymbolInfo(InfoType IT, SymbolID USR, StringRef Name) : Info(IT, USR, Name) {}
anatofuz
parents:
diff changeset
308 SymbolInfo(InfoType IT, SymbolID USR, StringRef Name, StringRef Path)
anatofuz
parents:
diff changeset
309 : Info(IT, USR, Name, Path) {}
anatofuz
parents:
diff changeset
310
anatofuz
parents:
diff changeset
311 void merge(SymbolInfo &&I);
anatofuz
parents:
diff changeset
312
anatofuz
parents:
diff changeset
313 llvm::Optional<Location> DefLoc; // Location where this decl is defined.
anatofuz
parents:
diff changeset
314 llvm::SmallVector<Location, 2> Loc; // Locations where this decl is declared.
anatofuz
parents:
diff changeset
315 };
anatofuz
parents:
diff changeset
316
anatofuz
parents:
diff changeset
317 // TODO: Expand to allow for documenting templating and default args.
anatofuz
parents:
diff changeset
318 // Info for functions.
anatofuz
parents:
diff changeset
319 struct FunctionInfo : public SymbolInfo {
anatofuz
parents:
diff changeset
320 FunctionInfo() : SymbolInfo(InfoType::IT_function) {}
anatofuz
parents:
diff changeset
321 FunctionInfo(SymbolID USR) : SymbolInfo(InfoType::IT_function, USR) {}
anatofuz
parents:
diff changeset
322
anatofuz
parents:
diff changeset
323 void merge(FunctionInfo &&I);
anatofuz
parents:
diff changeset
324
anatofuz
parents:
diff changeset
325 bool IsMethod = false; // Indicates whether this function is a class method.
anatofuz
parents:
diff changeset
326 Reference Parent; // Reference to the parent class decl for this method.
anatofuz
parents:
diff changeset
327 TypeInfo ReturnType; // Info about the return type of this function.
anatofuz
parents:
diff changeset
328 llvm::SmallVector<FieldTypeInfo, 4> Params; // List of parameters.
anatofuz
parents:
diff changeset
329 // Access level for this method (public, private, protected, none).
anatofuz
parents:
diff changeset
330 // AS_public is set as default because the bitcode writer requires the enum
anatofuz
parents:
diff changeset
331 // with value 0 to be used as the default.
anatofuz
parents:
diff changeset
332 // (AS_public = 0, AS_protected = 1, AS_private = 2, AS_none = 3)
anatofuz
parents:
diff changeset
333 AccessSpecifier Access = AccessSpecifier::AS_public;
anatofuz
parents:
diff changeset
334 };
anatofuz
parents:
diff changeset
335
anatofuz
parents:
diff changeset
336 // TODO: Expand to allow for documenting templating, inheritance access,
anatofuz
parents:
diff changeset
337 // friend classes
anatofuz
parents:
diff changeset
338 // Info for types.
anatofuz
parents:
diff changeset
339 struct RecordInfo : public SymbolInfo {
anatofuz
parents:
diff changeset
340 RecordInfo() : SymbolInfo(InfoType::IT_record) {}
anatofuz
parents:
diff changeset
341 RecordInfo(SymbolID USR) : SymbolInfo(InfoType::IT_record, USR) {}
anatofuz
parents:
diff changeset
342 RecordInfo(SymbolID USR, StringRef Name)
anatofuz
parents:
diff changeset
343 : SymbolInfo(InfoType::IT_record, USR, Name) {}
anatofuz
parents:
diff changeset
344 RecordInfo(SymbolID USR, StringRef Name, StringRef Path)
anatofuz
parents:
diff changeset
345 : SymbolInfo(InfoType::IT_record, USR, Name, Path) {}
anatofuz
parents:
diff changeset
346
anatofuz
parents:
diff changeset
347 void merge(RecordInfo &&I);
anatofuz
parents:
diff changeset
348
anatofuz
parents:
diff changeset
349 TagTypeKind TagType = TagTypeKind::TTK_Struct; // Type of this record
anatofuz
parents:
diff changeset
350 // (struct, class, union,
anatofuz
parents:
diff changeset
351 // interface).
anatofuz
parents:
diff changeset
352 bool IsTypeDef = false; // Indicates if record was declared using typedef
anatofuz
parents:
diff changeset
353 llvm::SmallVector<MemberTypeInfo, 4>
anatofuz
parents:
diff changeset
354 Members; // List of info about record members.
anatofuz
parents:
diff changeset
355 llvm::SmallVector<Reference, 4> Parents; // List of base/parent records
anatofuz
parents:
diff changeset
356 // (does not include virtual
anatofuz
parents:
diff changeset
357 // parents).
anatofuz
parents:
diff changeset
358 llvm::SmallVector<Reference, 4>
anatofuz
parents:
diff changeset
359 VirtualParents; // List of virtual base/parent records.
anatofuz
parents:
diff changeset
360
anatofuz
parents:
diff changeset
361 std::vector<BaseRecordInfo>
anatofuz
parents:
diff changeset
362 Bases; // List of base/parent records; this includes inherited methods and
anatofuz
parents:
diff changeset
363 // attributes
anatofuz
parents:
diff changeset
364
anatofuz
parents:
diff changeset
365 // Records are references because they will be properly documented in their
anatofuz
parents:
diff changeset
366 // own info, while the entirety of Functions and Enums are included here
anatofuz
parents:
diff changeset
367 // because they should not have separate documentation from their scope.
anatofuz
parents:
diff changeset
368 std::vector<Reference> ChildRecords;
anatofuz
parents:
diff changeset
369 std::vector<FunctionInfo> ChildFunctions;
anatofuz
parents:
diff changeset
370 std::vector<EnumInfo> ChildEnums;
anatofuz
parents:
diff changeset
371 };
anatofuz
parents:
diff changeset
372
anatofuz
parents:
diff changeset
373 struct BaseRecordInfo : public RecordInfo {
anatofuz
parents:
diff changeset
374 BaseRecordInfo() : RecordInfo() {}
anatofuz
parents:
diff changeset
375 BaseRecordInfo(SymbolID USR, StringRef Name, StringRef Path, bool IsVirtual,
anatofuz
parents:
diff changeset
376 AccessSpecifier Access, bool IsParent)
anatofuz
parents:
diff changeset
377 : RecordInfo(USR, Name, Path), IsVirtual(IsVirtual), Access(Access),
anatofuz
parents:
diff changeset
378 IsParent(IsParent) {}
anatofuz
parents:
diff changeset
379
anatofuz
parents:
diff changeset
380 // Indicates if base corresponds to a virtual inheritance
anatofuz
parents:
diff changeset
381 bool IsVirtual = false;
anatofuz
parents:
diff changeset
382 // Access level associated with this inherited info (public, protected,
anatofuz
parents:
diff changeset
383 // private).
anatofuz
parents:
diff changeset
384 AccessSpecifier Access = AccessSpecifier::AS_public;
anatofuz
parents:
diff changeset
385 bool IsParent = false; // Indicates if this base is a direct parent
anatofuz
parents:
diff changeset
386 };
anatofuz
parents:
diff changeset
387
anatofuz
parents:
diff changeset
388 // TODO: Expand to allow for documenting templating.
anatofuz
parents:
diff changeset
389 // Info for types.
anatofuz
parents:
diff changeset
390 struct EnumInfo : public SymbolInfo {
anatofuz
parents:
diff changeset
391 EnumInfo() : SymbolInfo(InfoType::IT_enum) {}
anatofuz
parents:
diff changeset
392 EnumInfo(SymbolID USR) : SymbolInfo(InfoType::IT_enum, USR) {}
anatofuz
parents:
diff changeset
393
anatofuz
parents:
diff changeset
394 void merge(EnumInfo &&I);
anatofuz
parents:
diff changeset
395
anatofuz
parents:
diff changeset
396 bool Scoped =
anatofuz
parents:
diff changeset
397 false; // Indicates whether this enum is scoped (e.g. enum class).
anatofuz
parents:
diff changeset
398 llvm::SmallVector<SmallString<16>, 4> Members; // List of enum members.
anatofuz
parents:
diff changeset
399 };
anatofuz
parents:
diff changeset
400
anatofuz
parents:
diff changeset
401 struct Index : public Reference {
anatofuz
parents:
diff changeset
402 Index() = default;
anatofuz
parents:
diff changeset
403 Index(StringRef Name) : Reference(Name) {}
anatofuz
parents:
diff changeset
404 Index(StringRef Name, StringRef JumpToSection)
anatofuz
parents:
diff changeset
405 : Reference(Name), JumpToSection(JumpToSection) {}
anatofuz
parents:
diff changeset
406 Index(SymbolID USR, StringRef Name, InfoType IT, StringRef Path)
anatofuz
parents:
diff changeset
407 : Reference(USR, Name, IT, Path) {}
anatofuz
parents:
diff changeset
408 // This is used to look for a USR in a vector of Indexes using std::find
anatofuz
parents:
diff changeset
409 bool operator==(const SymbolID &Other) const { return USR == Other; }
anatofuz
parents:
diff changeset
410 bool operator<(const Index &Other) const;
anatofuz
parents:
diff changeset
411
anatofuz
parents:
diff changeset
412 llvm::Optional<SmallString<16>> JumpToSection;
anatofuz
parents:
diff changeset
413 std::vector<Index> Children;
anatofuz
parents:
diff changeset
414
anatofuz
parents:
diff changeset
415 void sort();
anatofuz
parents:
diff changeset
416 };
anatofuz
parents:
diff changeset
417
anatofuz
parents:
diff changeset
418 // TODO: Add functionality to include separate markdown pages.
anatofuz
parents:
diff changeset
419
anatofuz
parents:
diff changeset
420 // A standalone function to call to merge a vector of infos into one.
anatofuz
parents:
diff changeset
421 // This assumes that all infos in the vector are of the same type, and will fail
anatofuz
parents:
diff changeset
422 // if they are different.
anatofuz
parents:
diff changeset
423 llvm::Expected<std::unique_ptr<Info>>
anatofuz
parents:
diff changeset
424 mergeInfos(std::vector<std::unique_ptr<Info>> &Values);
anatofuz
parents:
diff changeset
425
anatofuz
parents:
diff changeset
426 struct ClangDocContext {
anatofuz
parents:
diff changeset
427 ClangDocContext() = default;
anatofuz
parents:
diff changeset
428 ClangDocContext(tooling::ExecutionContext *ECtx, StringRef ProjectName,
anatofuz
parents:
diff changeset
429 bool PublicOnly, StringRef OutDirectory, StringRef SourceRoot,
anatofuz
parents:
diff changeset
430 StringRef RepositoryUrl,
anatofuz
parents:
diff changeset
431 std::vector<std::string> UserStylesheets,
anatofuz
parents:
diff changeset
432 std::vector<std::string> JsScripts);
anatofuz
parents:
diff changeset
433 tooling::ExecutionContext *ECtx;
anatofuz
parents:
diff changeset
434 std::string ProjectName; // Name of project clang-doc is documenting.
anatofuz
parents:
diff changeset
435 bool PublicOnly; // Indicates if only public declarations are documented.
anatofuz
parents:
diff changeset
436 std::string OutDirectory; // Directory for outputting generated files.
anatofuz
parents:
diff changeset
437 std::string SourceRoot; // Directory where processed files are stored. Links
anatofuz
parents:
diff changeset
438 // to definition locations will only be generated if
anatofuz
parents:
diff changeset
439 // the file is in this dir.
anatofuz
parents:
diff changeset
440 // URL of repository that hosts code used for links to definition locations.
anatofuz
parents:
diff changeset
441 llvm::Optional<std::string> RepositoryUrl;
anatofuz
parents:
diff changeset
442 // Path of CSS stylesheets that will be copied to OutDirectory and used to
anatofuz
parents:
diff changeset
443 // style all HTML files.
anatofuz
parents:
diff changeset
444 std::vector<std::string> UserStylesheets;
anatofuz
parents:
diff changeset
445 // JavaScript files that will be imported in allHTML file.
anatofuz
parents:
diff changeset
446 std::vector<std::string> JsScripts;
anatofuz
parents:
diff changeset
447 // Other files that should be copied to OutDirectory, besides UserStylesheets.
anatofuz
parents:
diff changeset
448 std::vector<std::string> FilesToCopy;
anatofuz
parents:
diff changeset
449 Index Idx;
anatofuz
parents:
diff changeset
450 };
anatofuz
parents:
diff changeset
451
anatofuz
parents:
diff changeset
452 } // namespace doc
anatofuz
parents:
diff changeset
453 } // namespace clang
anatofuz
parents:
diff changeset
454
anatofuz
parents:
diff changeset
455 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_REPRESENTATION_H