main: Print the available transforms when mistyped Declare the list of transforms once, and use this for the usage message and when a transform does not match. Simplifies adding new transforms to the command line tool. Change-Id: I57ec433d8a570dae465d1837f5a4c1d89b8cff05 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/79280 Reviewed-by: Antonio Maiorano <amaiorano@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/samples/main.cc b/samples/main.cc index 0ea1225..f329711 100644 --- a/samples/main.cc +++ b/samples/main.cc
@@ -30,6 +30,7 @@ #endif // TINT_BUILD_SPV_READER #include "src/utils/io/command.h" +#include "src/utils/string.h" #include "src/val/val.h" #include "tint/tint.h" @@ -103,10 +104,7 @@ -o <name> -- Output file name. Use "-" for standard output --transform <name list> -- Runs transforms, name list is comma separated Available transforms: - first_index_offset - fold_trivial_single_use_lets - renamer - robustness +${transforms} --parse-only -- Stop after parsing the input --disable-workgroup-init -- Disable workgroup memory zero initialization. --demangle -- Preserve original source names. Demangle them. @@ -909,8 +907,43 @@ return 1; } + struct TransformFactory { + const char* name; + std::function<void(tint::transform::Manager& manager, + tint::transform::DataMap& inputs)> + make; + }; + std::vector<TransformFactory> transforms = { + {"first_index_offset", + [](tint::transform::Manager& m, tint::transform::DataMap& i) { + i.Add<tint::transform::FirstIndexOffset::BindingPoint>(0, 0); + m.Add<tint::transform::FirstIndexOffset>(); + }}, + {"fold_trivial_single_use_lets", + [](tint::transform::Manager& m, tint::transform::DataMap&) { + m.Add<tint::transform::FoldTrivialSingleUseLets>(); + }}, + {"renamer", + [](tint::transform::Manager& m, tint::transform::DataMap&) { + m.Add<tint::transform::Renamer>(); + }}, + {"robustness", + [](tint::transform::Manager& m, tint::transform::DataMap&) { + m.Add<tint::transform::Robustness>(); + }}, + }; + auto transform_names = [&] { + std::stringstream names; + for (auto& t : transforms) { + names << " " << t.name << std::endl; + } + return names.str(); + }; + if (options.show_help) { - std::cout << kUsage << std::endl; + std::string usage = + tint::utils::ReplaceAll(kUsage, "${transforms}", transform_names()); + std::cout << usage << std::endl; return 0; } @@ -1043,18 +1076,17 @@ // be run that needs user input. Should we find a way to support that here // maybe through a provided file? - if (name == "first_index_offset") { - transform_inputs.Add<tint::transform::FirstIndexOffset::BindingPoint>(0, - 0); - transform_manager.Add<tint::transform::FirstIndexOffset>(); - } else if (name == "fold_trivial_single_use_lets") { - transform_manager.Add<tint::transform::FoldTrivialSingleUseLets>(); - } else if (name == "renamer") { - transform_manager.Add<tint::transform::Renamer>(); - } else if (name == "robustness") { - transform_manager.Add<tint::transform::Robustness>(); - } else { - std::cerr << "Unknown transform name: " << name << std::endl; + bool found = false; + for (auto& t : transforms) { + if (t.name == name) { + t.make(transform_manager, transform_inputs); + found = true; + break; + } + } + if (!found) { + std::cerr << "Unknown transform: " << name << std::endl; + std::cerr << "Available transforms: " << std::endl << transform_names(); return 1; } }