@@ -57,18 +57,120 @@ class MustacheTemplateFile : public Template {
57
57
MustacheTemplateFile (StringRef TemplateStr) : Template(TemplateStr) {}
58
58
};
59
59
60
+ static std::unique_ptr<MustacheTemplateFile> NamespaceTemplate = nullptr ;
61
+
62
+ static std::unique_ptr<MustacheTemplateFile> RecordTemplate = nullptr ;
63
+
64
+ static Error setupTemplateFiles (const clang::doc::ClangDocContext &CDCtx) {
65
+ return Error::success ();
66
+ }
67
+
60
68
Error MustacheHTMLGenerator::generateDocs (
61
69
StringRef RootDir, StringMap<std::unique_ptr<doc::Info>> Infos,
62
70
const clang::doc::ClangDocContext &CDCtx) {
71
+ if (auto Err = setupTemplateFiles (CDCtx))
72
+ return Err;
73
+ // Track which directories we already tried to create.
74
+ StringSet<> CreatedDirs;
75
+ // Collect all output by file name and create the necessary directories.
76
+ StringMap<std::vector<doc::Info *>> FileToInfos;
77
+ for (const auto &Group : Infos) {
78
+ doc::Info *Info = Group.getValue ().get ();
79
+
80
+ SmallString<128 > Path;
81
+ sys::path::native (RootDir, Path);
82
+ sys::path::append (Path, Info->getRelativeFilePath (" " ));
83
+ if (!CreatedDirs.contains (Path)) {
84
+ if (std::error_code Err = sys::fs::create_directories (Path);
85
+ Err != std::error_code ())
86
+ return createStringError (Err, " Failed to create directory '%s'." ,
87
+ Path.c_str ());
88
+ CreatedDirs.insert (Path);
89
+ }
90
+
91
+ sys::path::append (Path, Info->getFileBaseName () + " .html" );
92
+ FileToInfos[Path].push_back (Info);
93
+ }
94
+
95
+ for (const auto &Group : FileToInfos) {
96
+ std::error_code FileErr;
97
+ raw_fd_ostream InfoOS (Group.getKey (), FileErr, sys::fs::OF_None);
98
+ if (FileErr)
99
+ return createStringError (FileErr, " Error opening file '%s'" ,
100
+ Group.getKey ().data ());
101
+
102
+ for (const auto &Info : Group.getValue ()) {
103
+ if (Error Err = generateDocForInfo (Info, InfoOS, CDCtx))
104
+ return Err;
105
+ }
106
+ }
63
107
return Error::success ();
64
108
}
65
109
110
+ static json::Value extractValue (const NamespaceInfo &I,
111
+ const ClangDocContext &CDCtx) {
112
+ Object NamespaceValue = Object ();
113
+ return NamespaceValue;
114
+ }
115
+
116
+ static json::Value extractValue (const RecordInfo &I,
117
+ const ClangDocContext &CDCtx) {
118
+ Object RecordValue = Object ();
119
+ return RecordValue;
120
+ }
121
+
122
+ static Error setupTemplateValue (const ClangDocContext &CDCtx, json::Value &V,
123
+ Info *I) {
124
+ return createStringError (inconvertibleErrorCode (),
125
+ " setupTemplateValue is unimplemented" );
126
+ }
127
+
66
128
Error MustacheHTMLGenerator::generateDocForInfo (Info *I, raw_ostream &OS,
67
129
const ClangDocContext &CDCtx) {
130
+ switch (I->IT ) {
131
+ case InfoType::IT_namespace: {
132
+ json::Value V =
133
+ extractValue (*static_cast <clang::doc::NamespaceInfo *>(I), CDCtx);
134
+ if (auto Err = setupTemplateValue (CDCtx, V, I))
135
+ return Err;
136
+ NamespaceTemplate->render (V, OS);
137
+ break ;
138
+ }
139
+ case InfoType::IT_record: {
140
+ json::Value V =
141
+ extractValue (*static_cast <clang::doc::RecordInfo *>(I), CDCtx);
142
+ if (auto Err = setupTemplateValue (CDCtx, V, I))
143
+ return Err;
144
+ // Serialize the JSON value to the output stream in a readable format.
145
+ outs () << " Visit: " << I->Name << " \n " ;
146
+ // outs() << formatv("{0:2}", V) << "\n";
147
+ RecordTemplate->render (V, outs ());
148
+ break ;
149
+ }
150
+ case InfoType::IT_enum:
151
+ outs () << " IT_enum\n " ;
152
+ break ;
153
+ case InfoType::IT_function:
154
+ outs () << " IT_Function\n " ;
155
+ break ;
156
+ case InfoType::IT_typedef:
157
+ outs () << " IT_typedef\n " ;
158
+ break ;
159
+ case InfoType::IT_default:
160
+ return createStringError (inconvertibleErrorCode (), " unexpected InfoType" );
161
+ }
68
162
return Error::success ();
69
163
}
70
164
71
165
Error MustacheHTMLGenerator::createResources (ClangDocContext &CDCtx) {
166
+ for (const auto &FilePath : CDCtx.UserStylesheets ) {
167
+ if (Error Err = copyFile (FilePath, CDCtx.OutDirectory ))
168
+ return Err;
169
+ }
170
+ for (const auto &FilePath : CDCtx.JsScripts ) {
171
+ if (Error Err = copyFile (FilePath, CDCtx.OutDirectory ))
172
+ return Err;
173
+ }
72
174
return Error::success ();
73
175
}
74
176
0 commit comments