@@ -139,27 +139,49 @@ llvm::json::Object ReadJson(const fs::path &path) {
139139 return std::move (*parsed->getAsObject ());
140140}
141141
142- void MergeRules (llvm::json::Object &into, llvm::json::Object &&from);
142+ unsigned SinceStandard (const fs::path &src_path) {
143+ auto stem_string = src_path.stem ().string ();
144+ llvm::StringRef stem = stem_string;
145+ unsigned standard = 11 ;
146+ if (stem.consume_front (" src_cxx" ) && stem.getAsInteger (10 , standard)) {
147+ llvm::errs () << " ERROR: unexpected rule file " << src_path.string () << ' \n ' ;
148+ std::exit (EXIT_FAILURE );
149+ }
150+ return standard;
151+ }
152+
153+ void MergeRules (llvm::json::Object &into, llvm::json::Object &&from) {
154+ for (auto &[key, entries] : from) {
155+ for (auto &entry : *entries.getAsArray ()) {
156+ AddRule (into, key.str (), std::move (entry));
157+ }
158+ }
159+ }
143160
144161void IndexDir (const fs::path &rule_dir, const fs::path &out) {
145162 auto dir_name = rule_dir.filename ().string ();
146163 llvm::json::Object c_rules;
147164 if (fs::exists (rule_dir / " src.c" )) {
148165 Index (rule_dir / " src.c" , /* is_c=*/ true , dir_name, {}, c_rules);
149166 }
167+ std::vector<fs::path> cxx_srcs;
168+ for (const auto &entry : fs::directory_iterator (rule_dir)) {
169+ auto name = entry.path ().filename ().string ();
170+ if (name == " src.c" || name == " src.cpp" ||
171+ (name.starts_with (" src_cxx" ) && name.ends_with (" .cpp" ))) {
172+ cxx_srcs.push_back (entry.path ());
173+ }
174+ }
175+ std::ranges::sort (cxx_srcs);
150176 llvm::json::Object cxx_rules;
151- for (unsigned standard : {11u , 17u , 20u , 23u }) {
177+ for (const auto &src_path : cxx_srcs) {
178+ auto standard = SinceStandard (src_path);
152179 llvm::json::Object rules;
153- std::vector<std::string> flags{std::format (" -std=c++{}" , standard)};
154- for (const char *name : {" src.c" , " src.cpp" }) {
155- auto src_path = rule_dir / name;
156- if (fs::exists (src_path)) {
157- Index (src_path, /* is_c=*/ false , dir_name, flags, rules);
158- }
159- }
180+ Index (src_path, /* is_c=*/ false , dir_name,
181+ {std::format (" -std=c++{}" , standard)}, rules);
160182 for (auto &[key, entries] : rules) {
161183 for (auto &entry : *entries.getAsArray ()) {
162- (*entry.getAsObject ())[" standards " ] = llvm::json::Array{ standard} ;
184+ (*entry.getAsObject ())[" since " ] = standard;
163185 }
164186 }
165187 MergeRules (cxx_rules, std::move (rules));
@@ -168,33 +190,6 @@ void IndexDir(const fs::path &rule_dir, const fs::path &out) {
168190 {" cpp" , std::move (cxx_rules)}});
169191}
170192
171- void MergeRules (llvm::json::Object &into, llvm::json::Object &&from) {
172- for (auto &[key, entries] : from) {
173- auto &slot = into[key];
174- if (!slot.getAsArray ()) {
175- slot = llvm::json::Array ();
176- }
177- auto merged = slot.getAsArray ();
178- for (auto &entry : *entries.getAsArray ()) {
179- auto rule = entry.getAsObject ();
180- auto standards = rule->getArray (" standards" );
181- auto same = llvm::find_if (*merged, [&](const llvm::json::Value &value) {
182- auto other = value.getAsObject ();
183- return standards &&
184- *other->getString (" dir" ) == *rule->getString (" dir" ) &&
185- *other->getString (" text" ) == *rule->getString (" text" );
186- });
187- if (same == merged->end ()) {
188- merged->push_back (std::move (*rule));
189- continue ;
190- }
191- auto into_standards = same->getAsObject ()->getArray (" standards" );
192- into_standards->insert (into_standards->end (), standards->begin (),
193- standards->end ());
194- }
195- }
196- }
197-
198193void MergeIndexes (const std::vector<std::string> &parts,
199194 const std::vector<std::string> &common_headers,
200195 const fs::path &index_dir) {
0 commit comments