From 335081efbefeeed8597e1a098df27adf025a7586 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Wed, 28 Jan 2026 22:08:16 +0000 Subject: [PATCH 1/3] Add mojo fixit support This is experimental but can be enabled with `--@rules_mojo//:experimental_export_fixits --output_groups=+mojo_fixits` and then you can process the produced yaml files with clang-apply-replacements --- BUILD.bazel | 7 +++++++ mojo/private/mojo_binary_test.bzl | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/BUILD.bazel b/BUILD.bazel index b8d3268..ba8a573 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,3 +1,4 @@ +load("@bazel_skylib//rules:common_settings.bzl", "bool_flag") load("//mojo:build_settings.bzl", "repeatable_string_flag") repeatable_string_flag( @@ -21,3 +22,9 @@ toolchain_type( name = "gpu_toolchain_type", visibility = ["//visibility:public"], ) + +bool_flag( + name = "experimental_export_fixits", + build_setting_default = False, + visibility = ["//visibility:public"], +) diff --git a/mojo/private/mojo_binary_test.bzl b/mojo/private/mojo_binary_test.bzl index f1abe07..8a29c06 100644 --- a/mojo/private/mojo_binary_test.bzl +++ b/mojo/private/mojo_binary_test.bzl @@ -52,6 +52,9 @@ This is useful for shared sanitizer libraries which need to have rpaths added by bazel. """, ), + "_export_fixits": attr.label( + default = Label("@rules_mojo//:experimental_export_fixits"), + ), } _TOOLCHAINS = use_cpp_toolchain() + [ @@ -128,11 +131,19 @@ def _mojo_binary_test_implementation(ctx, *, shared_library = False): if ctx.attr.enable_assertions: args.add("-D", "ASSERT=all") + output_group_kwargs = {} + compile_outputs = [object_file] + if ctx.attr._export_fixits[BuildSettingInfo].value: + fixits_file = ctx.actions.declare_file(ctx.label.name + ".mojo_fixits.yaml") + compile_outputs.append(fixits_file) + output_group_kwargs["mojo_fixits"] = depset([fixits_file]) + args.add("--experimental-export-fixit", fixits_file.path) + ctx.actions.run( executable = mojo_toolchain.mojo, tools = mojo_toolchain.all_tools, inputs = depset(ctx.files.srcs + ctx.files.additional_compiler_inputs, transitive = [transitive_mojopkgs]), - outputs = [object_file], + outputs = compile_outputs, arguments = [args], mnemonic = "MojoCompile", progress_message = "%{label} compiling mojo object", @@ -267,6 +278,7 @@ def _mojo_binary_test_implementation(ctx, *, shared_library = False): ]), ), ), + OutputGroupInfo(**output_group_kwargs), ] else: return [ @@ -277,6 +289,7 @@ def _mojo_binary_test_implementation(ctx, *, shared_library = False): RunEnvironmentInfo( environment = runtime_env, ), + OutputGroupInfo(**output_group_kwargs), ] mojo_binary = rule( From 09163e124554d2cb5d6daeeb510b7ca8bee11bc2 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Wed, 28 Jan 2026 22:15:40 +0000 Subject: [PATCH 2/3] mojo_library too --- mojo/mojo_library.bzl | 14 +++++++++++++- mojo/private/mojo_binary_test.bzl | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/mojo/mojo_library.bzl b/mojo/mojo_library.bzl index 27a5c50..1617868 100644 --- a/mojo/mojo_library.bzl +++ b/mojo/mojo_library.bzl @@ -32,13 +32,21 @@ def _mojo_library_implementation(ctx): if not file.dirname.startswith(root_directory): args.add_all([file], map_each = _format_include) + output_group_kwargs = {} + package_outputs = [mojo_package] + if ctx.attr._export_fixits[BuildSettingInfo].value: + fixits_file = ctx.actions.declare_file(ctx.label.name + ".mojo_fixits.yaml") + package_outputs.append(fixits_file) + output_group_kwargs["mojo_fixits"] = depset([fixits_file]) + args.add("--experimental-export-fixit", fixits_file) + file_args.add_all(transitive_mojopkgs, map_each = _format_include) file_args.add(root_directory) ctx.actions.run( executable = mojo_toolchain.mojo, inputs = depset(ctx.files.srcs + ctx.files.additional_compiler_inputs, transitive = [transitive_mojopkgs]), tools = mojo_toolchain.all_tools, - outputs = [mojo_package], + outputs = package_outputs, arguments = [args, file_args], mnemonic = "MojoPackage", progress_message = "%{label} building mojo package", @@ -67,6 +75,7 @@ def _mojo_library_implementation(ctx): import_paths = depset([mojo_package.dirname], transitive = [import_paths]), mojopkgs = depset([mojo_package], transitive = [transitive_mojopkgs]), ), + OutputGroupInfo(**output_group_kwargs), ] mojo_library = rule( @@ -104,6 +113,9 @@ package' since it does not accept many flags. "_mojo_package_copts": attr.label( default = Label("//:mojo_package_copt"), ), + "_export_fixits": attr.label( + default = Label("@rules_mojo//:experimental_export_fixits"), + ), }, toolchains = ["//:toolchain_type"], ) diff --git a/mojo/private/mojo_binary_test.bzl b/mojo/private/mojo_binary_test.bzl index 8a29c06..ab9aeec 100644 --- a/mojo/private/mojo_binary_test.bzl +++ b/mojo/private/mojo_binary_test.bzl @@ -137,7 +137,7 @@ def _mojo_binary_test_implementation(ctx, *, shared_library = False): fixits_file = ctx.actions.declare_file(ctx.label.name + ".mojo_fixits.yaml") compile_outputs.append(fixits_file) output_group_kwargs["mojo_fixits"] = depset([fixits_file]) - args.add("--experimental-export-fixit", fixits_file.path) + args.add("--experimental-export-fixit", fixits_file) ctx.actions.run( executable = mojo_toolchain.mojo, From 85a1d35b08a5c8eddd248cdd2820e3c2e7872edb Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Wed, 28 Jan 2026 22:25:48 +0000 Subject: [PATCH 3/3] fixtures --- tests/fixits/BUILD.bazel | 19 +++++++++++++++++++ tests/fixits/fixits.mojo | 5 +++++ tests/fixits/package/__init__.mojo | 0 tests/fixits/package/package.mojo | 2 ++ 4 files changed, 26 insertions(+) create mode 100644 tests/fixits/BUILD.bazel create mode 100644 tests/fixits/fixits.mojo create mode 100644 tests/fixits/package/__init__.mojo create mode 100644 tests/fixits/package/package.mojo diff --git a/tests/fixits/BUILD.bazel b/tests/fixits/BUILD.bazel new file mode 100644 index 0000000..404167c --- /dev/null +++ b/tests/fixits/BUILD.bazel @@ -0,0 +1,19 @@ +load("//mojo:mojo_binary.bzl", "mojo_binary") +load("//mojo:mojo_library.bzl", "mojo_library") + +# TODO: Find a fixit that doesn't fail the build, verify the output file + +mojo_binary( + name = "fixits", + srcs = ["fixits.mojo"], + tags = ["manual"], +) + +mojo_library( + name = "package", + srcs = [ + "package/__init__.mojo", + "package/package.mojo", + ], + tags = ["manual"], +) diff --git a/tests/fixits/fixits.mojo b/tests/fixits/fixits.mojo new file mode 100644 index 0000000..8412280 --- /dev/null +++ b/tests/fixits/fixits.mojo @@ -0,0 +1,5 @@ +fn old_origin_of[T: AnyType](b: T): + _ = __origin_of(b) + +fn main(): + pass diff --git a/tests/fixits/package/__init__.mojo b/tests/fixits/package/__init__.mojo new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixits/package/package.mojo b/tests/fixits/package/package.mojo new file mode 100644 index 0000000..fb7789b --- /dev/null +++ b/tests/fixits/package/package.mojo @@ -0,0 +1,2 @@ +fn old_origin_of[T: AnyType](b: T): + _ = __origin_of(b)