diff --git a/dmd/json.d b/dmd/json.d index 913ca2f170..e1efe6c73f 100644 --- a/dmd/json.d +++ b/dmd/json.d @@ -955,7 +955,8 @@ Params: Returns: JsonFieldFlags.none on error, otherwise the JsonFieldFlags value corresponding to the given fieldName. */ -JsonFieldFlags tryParseJsonField(const(char)* fieldName) +// IN_LLVM: was `JsonField tryParseJsonField(const(char)* fieldName)` +extern (C++) uint tryParseJsonField(const(char)* fieldName) { auto fieldNameString = fieldName[0 .. strlen(fieldName)]; foreach (idx, enumName; __traits(allMembers, JsonFieldFlags)) diff --git a/dmd/json.h b/dmd/json.h index f52dfd4d57..f345628ae2 100644 --- a/dmd/json.h +++ b/dmd/json.h @@ -21,5 +21,9 @@ struct OutBuffer; void json_generate(OutBuffer *, Modules *); +#ifdef IN_LLVM +unsigned tryParseJsonField(const char *fieldName); +#endif + #endif /* DMD_JSON_H */ diff --git a/driver/cl_options.cpp b/driver/cl_options.cpp index 6a05e86bb7..8082b45b46 100644 --- a/driver/cl_options.cpp +++ b/driver/cl_options.cpp @@ -195,6 +195,9 @@ cl::opt jsonFile("Xf", cl::desc("Write JSON file to "), cl::value_desc("filename"), cl::Prefix, cl::ZeroOrMore); +// supported by DMD, but still undocumented +cl::list jsonFields("Xi", cl::ReallyHidden, cl::value_desc("field")); + // Header generation options static cl::opt doHdrGen("H", cl::desc("Generate 'header' file"), cl::ZeroOrMore, diff --git a/driver/cl_options.h b/driver/cl_options.h index 0471ad4f6e..f4d0583fb1 100644 --- a/driver/cl_options.h +++ b/driver/cl_options.h @@ -59,6 +59,7 @@ extern cl::opt output_o; extern cl::opt ddocDir; extern cl::opt ddocFile; extern cl::opt jsonFile; +extern cl::list jsonFields; extern cl::opt hdrDir; extern cl::opt hdrFile; extern cl::opt hdrKeepAllBodies; diff --git a/driver/main.cpp b/driver/main.cpp index 9d032cb407..76ce9ef527 100644 --- a/driver/main.cpp +++ b/driver/main.cpp @@ -423,6 +423,15 @@ void parseCommandLine(int argc, char **argv, Strings &sourceFiles, toWinPaths(global.params.fileImppath); #endif + for (const auto &field : jsonFields) { + const unsigned flag = tryParseJsonField(field.c_str()); + if (flag == 0) { + error(Loc(), "unknown JSON field `-Xi=%s`", field.c_str()); + } else { + global.params.jsonFieldFlags |= flag; + } + } + includeImports = !opts::includeModulePatterns.empty(); for (const auto &pattern : opts::includeModulePatterns) { // a value-less `-i` only enables `includeImports`