[yaml2obj] Add a `-E` flag to preprocess only.

If you're having trouble getting a yaml2obj macro expansion to do what
you want, it's useful to be able to print the output of the
preprocessing to see what your macros expanded to //before// going
into the YAML processing phase.

yaml2obj has its own preprocessing system which isn't the same as any
other well-known thing like cpp. So there's no way to do this macro
expansion via another tool: yaml2obj will have to do it itself.

In this commit I add an `-E` flag to yaml2obj to do that.

Differential Revision: https://reviews.llvm.org/D130981
This commit is contained in:
Simon Tatham 2022-08-02 10:24:30 +01:00
parent bb2832410e
commit 07e6eb6e75
2 changed files with 28 additions and 4 deletions

View File

@ -0,0 +1,16 @@
# RUN: yaml2obj -E -Dfoo=wibble %s | FileCheck %s
This is a test of yaml2obj's pure preprocessing mode, so it doesn't
have to contain valid YAML, or any YAML at all. But we do have to be
careful with the FileCheck CHECK directives, because they'll be
emitted into the preprocessed output, and risk matching themselves!
For that reason, each one matches only at the start of a line.
Expand a macro:
[[foo]] # CHECK: {{^wibble}}
Expand an undefined macro:
[[bar]] # CHECK: {{^\[\[bar\]\]}}
Expand an undefined macro where we provided a default value:
[[baz=123]] # CHECK: {{^123}}

View File

@ -40,6 +40,9 @@ cl::list<std::string>
"definition. The syntax is <macro>=<definition>"),
cl::cat(Cat));
cl::opt<bool> PreprocessOnly("E", cl::desc("Just print the preprocessed file"),
cl::cat(Cat));
cl::opt<unsigned>
DocNum("docnum", cl::init(1),
cl::desc("Read specified document from input (default = 1)"),
@ -133,11 +136,16 @@ int main(int argc, char **argv) {
Optional<std::string> Buffer = preprocess(Buf.get()->getBuffer(), ErrHandler);
if (!Buffer)
return 1;
yaml::Input YIn(*Buffer);
if (!convertYAML(YIn, Out->os(), ErrHandler, DocNum,
MaxSize == 0 ? UINT64_MAX : MaxSize))
return 1;
if (PreprocessOnly) {
Out->os() << Buffer;
} else {
yaml::Input YIn(*Buffer);
if (!convertYAML(YIn, Out->os(), ErrHandler, DocNum,
MaxSize == 0 ? UINT64_MAX : MaxSize))
return 1;
}
Out->keep();
Out->os().flush();