mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-13 11:42:38 +03:00
JSSpecCompiler: Allow dumping AST after specified passes
This commit is contained in:
parent
350e6c54d7
commit
dbd624e875
Notes:
sideshowbarker
2024-07-17 22:55:25 +09:00
Author: https://github.com/DanShaders Commit: https://github.com/SerenityOS/serenity/commit/dbd624e875 Pull-request: https://github.com/SerenityOS/serenity/pull/21612 Reviewed-by: https://github.com/ADKaster
@ -17,6 +17,11 @@
|
||||
|
||||
using namespace JSSpecCompiler;
|
||||
|
||||
struct CompilationStepWithDumpOptions {
|
||||
OwnPtr<CompilationStep> step;
|
||||
bool dump_ast = false;
|
||||
};
|
||||
|
||||
class CompilationPipeline {
|
||||
public:
|
||||
template<typename T>
|
||||
@ -35,9 +40,9 @@ public:
|
||||
for (auto pass : pass_list.split_view(',')) {
|
||||
if (pass == "all") {
|
||||
for (auto const& step : m_pipeline)
|
||||
selected_steps.set(step->name());
|
||||
selected_steps.set(step.step->name());
|
||||
} else if (pass == "last") {
|
||||
selected_steps.set(m_pipeline.last()->name());
|
||||
selected_steps.set(m_pipeline.last().step->name());
|
||||
} else if (pass.starts_with('-')) {
|
||||
VERIFY(selected_steps.remove(pass.substring_view(1)));
|
||||
} else {
|
||||
@ -46,19 +51,19 @@ public:
|
||||
}
|
||||
|
||||
for (auto& step : m_pipeline)
|
||||
if (selected_steps.contains(step->name()))
|
||||
if (selected_steps.contains(step.step->name()))
|
||||
func(step);
|
||||
}
|
||||
|
||||
void add_step(OwnPtr<CompilationStep>&& step)
|
||||
{
|
||||
m_pipeline.append(move(step));
|
||||
m_pipeline.append({ move(step) });
|
||||
}
|
||||
|
||||
auto const& pipeline() const { return m_pipeline; }
|
||||
|
||||
private:
|
||||
Vector<OwnPtr<CompilationStep>> m_pipeline;
|
||||
Vector<CompilationStepWithDumpOptions> m_pipeline;
|
||||
};
|
||||
|
||||
ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||
@ -82,6 +87,9 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||
},
|
||||
});
|
||||
|
||||
StringView passes_to_dump_ast;
|
||||
args_parser.add_option(passes_to_dump_ast, "Dump AST after specified passes.", "dump-ast", 0, "{all|last|<pass-name>|-<pass-name>[,...]}");
|
||||
|
||||
args_parser.parse(arguments);
|
||||
|
||||
CompilationPipeline pipeline;
|
||||
@ -93,6 +101,10 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||
pipeline.add_compilation_pass<IfBranchMergingPass>();
|
||||
pipeline.add_compilation_pass<ReferenceResolvingPass>();
|
||||
|
||||
pipeline.for_each_step_in(passes_to_dump_ast, [](CompilationStepWithDumpOptions& step) {
|
||||
step.dump_ast = true;
|
||||
});
|
||||
|
||||
TranslationUnit translation_unit;
|
||||
translation_unit.filename = filename;
|
||||
|
||||
@ -108,8 +120,17 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||
functions.set("truncate"sv, make_ref_counted<FunctionPointer>("truncate"sv));
|
||||
functions.set("remainder"sv, make_ref_counted<FunctionPointer>("remainder"sv));
|
||||
|
||||
for (auto const& step : pipeline.pipeline())
|
||||
step->run(&translation_unit);
|
||||
for (auto const& step : pipeline.pipeline()) {
|
||||
step.step->run(&translation_unit);
|
||||
|
||||
if (step.dump_ast) {
|
||||
outln(stderr, "===== AST after {} =====", step.step->name());
|
||||
for (auto const& function : translation_unit.function_definitions) {
|
||||
outln(stderr, "{}():", function->m_name);
|
||||
outln(stderr, "{}", function->m_ast);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user