From a8a473fd3687a8e5ce90203a2bfefaafd4fcfe5a Mon Sep 17 00:00:00 2001 From: Googler Date: Fri, 19 Apr 2024 06:09:53 -0700 Subject: [PATCH] Support Bazel rules_kotlin's toolchain without legacy providers This is a prerequisite to finally turn down legacy struct providers. The last such instance is used in rules_kotlin. And it's used to serve as integration with IntelliJ. After this change, PR https://github.com/bazelbuild/rules_kotlin/pull/1157 may be merged, keeping rules_kotlin working with IntelliJ. Legacy struct providers have been deprecated by Bazel. Replacing them with modern providers, will make it possible to simplify and remove legacy handling from Bazel. More info on: https://bazel.build/extending/rules#migrating_from_legacy_providers Issue: bazelbuild/bazel#19467 PiperOrigin-RevId: 626344394 --- aspect/intellij_info_impl.bzl | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/aspect/intellij_info_impl.bzl b/aspect/intellij_info_impl.bzl index d6f796c10d7..f8ef04f642a 100644 --- a/aspect/intellij_info_impl.bzl +++ b/aspect/intellij_info_impl.bzl @@ -42,6 +42,7 @@ DEPS = [ "test_app", # android_instrumentation_test "instruments", # android_instrumentation_test "tests", # From test_suite + "_toolchain", # From rules_kotlin ] # Run-time dependency attributes, grouped by type. @@ -994,13 +995,15 @@ def collect_java_toolchain_info(target, ide_info, ide_info_file, output_groups): def artifact_to_path(artifact): return artifact.root_execution_path_fragment + "/" + artifact.relative_path -def collect_kotlin_toolchain_info(target, ide_info, ide_info_file, output_groups): +def collect_kotlin_toolchain_info(target, ctx, ide_info, ide_info_file, output_groups): """Updates kotlin_toolchain-relevant output groups, returns false if not a kotlin_toolchain target.""" - if not hasattr(target, "kt"): - return False - kt = target.kt - if not hasattr(kt, "language_version"): + if ctx.rule.kind == "_kt_toolchain" and platform_common.ToolchainInfo in target: + kt = target[platform_common.ToolchainInfo] + elif hasattr(target, "kt") and hasattr(target.kt, "language_version"): + kt = target.kt # Legacy struct provider mechanism + else: return False + ide_info["kt_toolchain_ide_info"] = struct( language_version = kt.language_version, ) @@ -1160,7 +1163,7 @@ def intellij_info_aspect_impl(target, ctx, semantics): handled = collect_java_info(target, ctx, semantics, ide_info, ide_info_file, output_groups) or handled handled = collect_java_toolchain_info(target, ide_info, ide_info_file, output_groups) or handled handled = collect_android_info(target, ctx, semantics, ide_info, ide_info_file, output_groups) or handled - handled = collect_kotlin_toolchain_info(target, ide_info, ide_info_file, output_groups) or handled + handled = collect_kotlin_toolchain_info(target, ctx, ide_info, ide_info_file, output_groups) or handled # Any extra ide info if hasattr(semantics, "extra_ide_info"):