@@ -139,24 +139,18 @@ llvm::json::Object ReadJson(const fs::path &path) {
139139 return std::move (*parsed->getAsObject ());
140140}
141141
142- unsigned CxxStandard (const std::vector<std::string> &flags) {
143- for (llvm::StringRef flag : flags) {
144- unsigned standard;
145- if (flag.consume_front (" -std=c++" ) && !flag.getAsInteger (10 , standard)) {
146- return standard;
147- }
148- }
149- return 0 ;
150- }
142+ void MergeRules (llvm::json::Object &into, llvm::json::Object &&from);
151143
152- void IndexDir (const fs::path &rule_dir, const std::vector<std::string> &flags,
153- const fs::path &out) {
154- llvm::json::Object rules;
144+ void IndexDir (const fs::path &rule_dir, const fs::path &out) {
155145 auto dir_name = rule_dir.filename ().string ();
156- auto standard = CxxStandard (flags);
157- if (standard == 0 ) {
158- Index (rule_dir / " src.c" , /* is_c=*/ true , dir_name, flags, rules);
159- } else {
146+ llvm::json::Object c_rules;
147+ if (fs::exists (rule_dir / " src.c" )) {
148+ Index (rule_dir / " src.c" , /* is_c=*/ true , dir_name, {}, c_rules);
149+ }
150+ llvm::json::Object cxx_rules;
151+ for (unsigned standard : {11u , 17u , 20u , 23u }) {
152+ llvm::json::Object rules;
153+ std::vector<std::string> flags{std::format (" -std=c++{}" , standard)};
160154 for (const char *name : {" src.c" , " src.cpp" }) {
161155 auto src_path = rule_dir / name;
162156 if (fs::exists (src_path)) {
@@ -168,8 +162,10 @@ void IndexDir(const fs::path &rule_dir, const std::vector<std::string> &flags,
168162 (*entry.getAsObject ())[" standards" ] = llvm::json::Array{standard};
169163 }
170164 }
165+ MergeRules (cxx_rules, std::move (rules));
171166 }
172- WriteJson (out, llvm::json::Object{{" rules" , std::move (rules)}});
167+ WriteJson (out, llvm::json::Object{{" c" , std::move (c_rules)},
168+ {" cpp" , std::move (cxx_rules)}});
173169}
174170
175171void MergeRules (llvm::json::Object &into, llvm::json::Object &&from) {
@@ -201,17 +197,24 @@ void MergeRules(llvm::json::Object &into, llvm::json::Object &&from) {
201197
202198void MergeIndexes (const std::vector<std::string> &parts,
203199 const std::vector<std::string> &common_headers,
204- const fs::path &out) {
205- llvm::json::Object rules;
200+ const fs::path &index_dir) {
201+ llvm::json::Object c_rules;
202+ llvm::json::Object cxx_rules;
206203 for (const auto &part : parts) {
207- MergeRules (rules, std::move (*ReadJson (part).getObject (" rules" )));
204+ auto json = ReadJson (part);
205+ MergeRules (c_rules, std::move (*json.getObject (" c" )));
206+ MergeRules (cxx_rules, std::move (*json.getObject (" cpp" )));
208207 }
209208 std::string common;
210209 for (const auto &header : common_headers) {
211210 common += std::format (" #include \" {}\"\n " , header);
212211 }
213- WriteJson (out, llvm::json::Object{{" common" , std::move (common)},
214- {" rules" , std::move (rules)}});
212+ fs::create_directories (index_dir);
213+ WriteJson (index_dir / " c.json" ,
214+ llvm::json::Object{{" common" , " " }, {" rules" , std::move (c_rules)}});
215+ WriteJson (index_dir / " cpp.json" ,
216+ llvm::json::Object{{" common" , std::move (common)},
217+ {" rules" , std::move (cxx_rules)}});
215218}
216219
217220} // namespace cpp2rust
@@ -224,11 +227,6 @@ llvm::cl::opt<std::string> Dir("dir", llvm::cl::desc("Rule directory to index"),
224227 llvm::cl::value_desc(" rule-dir" ),
225228 llvm::cl::cat(cat));
226229
227- llvm::cl::list<std::string> CXXFlags (" cxxflags" ,
228- llvm::cl::desc (" Additional CXXFLAGS" ),
229- llvm::cl::value_desc(" cxxflags" ),
230- llvm::cl::ZeroOrMore, llvm::cl::cat(cat));
231-
232230llvm::cl::list<std::string> Parts (llvm::cl::Positional,
233231 llvm::cl::desc (" <indexes to merge>" ),
234232 llvm::cl::ZeroOrMore, llvm::cl::cat(cat));
@@ -237,9 +235,10 @@ llvm::cl::list<std::string> CommonHeaders(
237235 " common-header" , llvm::cl::desc(" Header the C++ rules depend on" ),
238236 llvm::cl::value_desc(" header" ), llvm::cl::ZeroOrMore, llvm::cl::cat(cat));
239237
240- llvm::cl::opt<std::string> Out (" o" , llvm::cl::desc(" Output index" ),
241- llvm::cl::value_desc(" index.json" ),
242- llvm::cl::Required, llvm::cl::cat(cat));
238+ llvm::cl::opt<std::string>
239+ Out (" o" ,
240+ llvm::cl::desc (" Output part of a rule directory, or index directory" ),
241+ llvm::cl::value_desc(" path" ), llvm::cl::Required, llvm::cl::cat(cat));
243242
244243} // namespace
245244
@@ -248,8 +247,7 @@ int main(int argc, char *argv[]) {
248247 llvm::cl::ParseCommandLineOptions (argc, argv);
249248
250249 if (!Dir.empty ()) {
251- cpp2rust::IndexDir (Dir.getValue (), {CXXFlags.begin (), CXXFlags.end ()},
252- Out.getValue ());
250+ cpp2rust::IndexDir (Dir.getValue (), Out.getValue ());
253251 } else {
254252 cpp2rust::MergeIndexes ({Parts.begin (), Parts.end ()},
255253 {CommonHeaders.begin (), CommonHeaders.end ()},
0 commit comments