9
9
// Official repository: https://github.com/cppalliance/mrdox
10
10
//
11
11
12
+ #include " Generators.h"
12
13
#include < mrdox/ClangDocContext.hpp>
14
+ #include < clang/Tooling/CommonOptionsParser.h>
13
15
14
16
namespace clang {
15
17
namespace mrdox {
16
18
19
+ namespace {
20
+
21
+ const char * Overview =
22
+ R"( Generates documentation from source code and comments.
23
+
24
+ Example usage for files without flags (default):
25
+
26
+ $ mrdox File1.cpp File2.cpp ... FileN.cpp
27
+
28
+ Example usage for a project using a compile commands database:
29
+
30
+ $ mrdox --executor=all-TUs compile_commands.json
31
+ )" ;
32
+
33
+ static
34
+ llvm::cl::extrahelp
35
+ CommonHelp (
36
+ tooling::CommonOptionsParser::HelpMessage);
37
+
38
+ static
39
+ llvm::cl::OptionCategory
40
+ MrDoxCategory (" mrdox options" );
41
+
42
+ static
43
+ llvm::cl::opt<std::string>
44
+ ProjectName (
45
+ " project-name" ,
46
+ llvm::cl::desc (" Name of project." ),
47
+ llvm::cl::cat(MrDoxCategory));
48
+
49
+ static
50
+ llvm::cl::opt<bool >
51
+ IgnoreMappingFailures (
52
+ " ignore-map-errors" ,
53
+ llvm::cl::desc (" Continue if files are not mapped correctly." ),
54
+ llvm::cl::init(true ),
55
+ llvm::cl::cat(MrDoxCategory));
56
+
57
+ static
58
+ llvm::cl::opt<std::string>
59
+ OutDirectory (
60
+ " output" ,
61
+ llvm::cl::desc (" Directory for outputting generated files." ),
62
+ llvm::cl::init(" docs" ),
63
+ llvm::cl::cat(MrDoxCategory));
64
+
65
+ static
66
+ llvm::cl::opt<bool >
67
+ PublicOnly (
68
+ " public" ,
69
+ llvm::cl::desc (" Document only public declarations." ),
70
+ llvm::cl::init(false ),
71
+ llvm::cl::cat(MrDoxCategory));
72
+
73
+ static
74
+ llvm::cl::opt<bool >
75
+ DoxygenOnly (
76
+ " doxygen" ,
77
+ llvm::cl::desc (" Use only doxygen-style comments to generate docs." ),
78
+ llvm::cl::init(false ),
79
+ llvm::cl::cat(MrDoxCategory));
80
+
81
+ static
82
+ llvm::cl::list<std::string>
83
+ UserStylesheets (
84
+ " stylesheets" ,
85
+ llvm::cl::CommaSeparated,
86
+ llvm::cl::desc (" CSS stylesheets to extend the default styles." ),
87
+ llvm::cl::cat(MrDoxCategory));
88
+
89
+ static
90
+ llvm::cl::opt<std::string>
91
+ SourceRoot (
92
+ " source-root" , llvm::cl::desc(R"(
93
+ Directory where processed files are stored.
94
+ Links to definition locations will only be
95
+ generated if the file is in this dir.)" ),
96
+ llvm::cl::cat(MrDoxCategory));
97
+
98
+ static
99
+ llvm::cl::opt<std::string>
100
+ RepositoryUrl (
101
+ " repository" , llvm::cl::desc(R"(
102
+ URL of repository that hosts code.
103
+ Used for links to definition locations.)" ),
104
+ llvm::cl::cat(MrDoxCategory));
105
+
106
+ enum OutputFormatTy
107
+ {
108
+ adoc,
109
+ xml
110
+ };
111
+
112
+ static
113
+ llvm::cl::opt<OutputFormatTy>
114
+ FormatEnum (
115
+ " format" ,
116
+ llvm::cl::desc (" Format for outputted docs." ),
117
+ llvm::cl::values(
118
+ clEnumValN (OutputFormatTy::adoc, " adoc" ,
119
+ " Documentation in Asciidoc format." ),
120
+ clEnumValN(OutputFormatTy::xml, " xml" ,
121
+ " Documentation in XML format." )),
122
+ llvm::cl::init(OutputFormatTy::adoc), // default value
123
+ llvm::cl::cat(MrDoxCategory));
124
+
125
+ std::string
126
+ getFormatString ()
127
+ {
128
+ switch (FormatEnum)
129
+ {
130
+ case OutputFormatTy::adoc:
131
+ return " adoc" ;
132
+ case OutputFormatTy::xml:
133
+ return " xml" ;
134
+ }
135
+ llvm_unreachable (" Unknown OutputFormatTy" );
136
+ }
137
+
138
+ } // (anon)
139
+
140
+ // ------------------------------------------------
141
+
17
142
ClangDocContext::
18
143
ClangDocContext ()
19
144
{
@@ -22,5 +147,59 @@ ClangDocContext()
22
147
SourceRoot = std::string (SourceRootDir.str ());
23
148
}
24
149
150
+ llvm::Error
151
+ setupContext (
152
+ ClangDocContext& CDCtx,
153
+ int argc, const char ** argv)
154
+ {
155
+ llvm::SmallVector<llvm::StringRef, 16 > args;
156
+ for (int i = 0 ; i < argc; ++i)
157
+ args.push_back (argv[i]);
158
+ return setupContext (CDCtx, args);
159
+ }
160
+
161
+ llvm::Error
162
+ setupContext (
163
+ ClangDocContext& CDCtx,
164
+ llvm::SmallVector<llvm::StringRef, 16 > const & args)
165
+ {
166
+ llvm::SmallVector<char const *> argv;
167
+ for (auto const & s : args)
168
+ argv.push_back (s.data ());
169
+ int argc = argv.size ();
170
+ if (llvm::Error err = clang::tooling::createExecutorFromCommandLineArgs (
171
+ argc,
172
+ argv.begin (),
173
+ MrDoxCategory,
174
+ Overview).moveInto (CDCtx.Executor ))
175
+ {
176
+ return err;
177
+ }
178
+
179
+ // Fail early if an invalid format was provided.
180
+ std::string Format = getFormatString ();
181
+ llvm::outs () << " Emiting docs in " << Format << " format.\n " ;
182
+ if (llvm::Error err =
183
+ mrdox::findGeneratorByName (Format).moveInto (CDCtx.G ))
184
+ return err;
185
+
186
+ if (! DoxygenOnly)
187
+ CDCtx.ArgAdjuster = tooling::combineAdjusters (
188
+ getInsertArgumentAdjuster (
189
+ " -fparse-all-comments" ,
190
+ tooling::ArgumentInsertPosition::END),
191
+ CDCtx.ArgAdjuster );
192
+
193
+ CDCtx.ECtx = CDCtx.Executor ->getExecutionContext (),
194
+ CDCtx.ProjectName = ProjectName;
195
+ CDCtx.PublicOnly = PublicOnly;
196
+ CDCtx.OutDirectory = OutDirectory;
197
+ CDCtx.SourceRoot = SourceRoot;
198
+ CDCtx.RepositoryUrl = RepositoryUrl;
199
+ CDCtx.IgnoreMappingFailures = IgnoreMappingFailures;
200
+ CDCtx.OutDirectory = OutDirectory;
201
+ return llvm::Error::success ();
202
+ }
203
+
25
204
} // mrdox
26
205
} // clang
0 commit comments