@@ -57,18 +57,119 @@ 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 (), " setupTemplateValue is unimplemented" );
125
+ }
126
+
66
127
Error MustacheHTMLGenerator::generateDocForInfo (Info *I, raw_ostream &OS,
67
128
const ClangDocContext &CDCtx) {
129
+ switch (I->IT ) {
130
+ case InfoType::IT_namespace: {
131
+ json::Value V =
132
+ extractValue (*static_cast <clang::doc::NamespaceInfo *>(I), CDCtx);
133
+ if (auto Err = setupTemplateValue (CDCtx, V, I))
134
+ return Err;
135
+ NamespaceTemplate->render (V, OS);
136
+ break ;
137
+ }
138
+ case InfoType::IT_record: {
139
+ json::Value V =
140
+ extractValue (*static_cast <clang::doc::RecordInfo *>(I), CDCtx);
141
+ if (auto Err = setupTemplateValue (CDCtx, V, I))
142
+ return Err;
143
+ // Serialize the JSON value to the output stream in a readable format.
144
+ outs () << " Visit: " << I->Name << " \n " ;
145
+ // outs() << formatv("{0:2}", V) << "\n";
146
+ RecordTemplate->render (V, outs ());
147
+ break ;
148
+ }
149
+ case InfoType::IT_enum:
150
+ outs () << " IT_enum\n " ;
151
+ break ;
152
+ case InfoType::IT_function:
153
+ outs () << " IT_Function\n " ;
154
+ break ;
155
+ case InfoType::IT_typedef:
156
+ outs () << " IT_typedef\n " ;
157
+ break ;
158
+ case InfoType::IT_default:
159
+ return createStringError (inconvertibleErrorCode (), " unexpected InfoType" );
160
+ }
68
161
return Error::success ();
69
162
}
70
163
71
164
Error MustacheHTMLGenerator::createResources (ClangDocContext &CDCtx) {
165
+ for (const auto &FilePath : CDCtx.UserStylesheets ) {
166
+ if (Error Err = copyFile (FilePath, CDCtx.OutDirectory ))
167
+ return Err;
168
+ }
169
+ for (const auto &FilePath : CDCtx.JsScripts ) {
170
+ if (Error Err = copyFile (FilePath, CDCtx.OutDirectory ))
171
+ return Err;
172
+ }
72
173
return Error::success ();
73
174
}
74
175
0 commit comments