Revert "[kt_compiler_plugin] Add kt_plugin_cfg for reusable and composable op…"
This reverts commit b9380cd1ce3a2c7ae337531c455c425fac38302c.
diff --git a/MODULE.bazel b/MODULE.bazel
index 0e492cc..9cfc80f 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -27,7 +27,6 @@
"//src/main/starlark/core/repositories:bzlmod_bootstrap.bzl",
"rules_kotlin_bootstrap_extensions",
)
-
use_repo(
rules_kotlin_bootstrap_extensions,
"kt_java_stub_template",
@@ -42,7 +41,6 @@
# TODO(bencodes) We should be able to remove this once rules_android has rolled out official Bzlmod support
remote_android_extensions = use_extension("@bazel_tools//tools/android:android_extensions.bzl", "remote_android_tools_extensions")
-
use_repo(remote_android_extensions, "android_gmaven_r8", "android_tools")
# Development dependencies
@@ -86,11 +84,8 @@
"https://repo1.maven.org/maven2",
],
)
-
use_repo(maven, "kotlin_rules_maven")
bazel_dep(name = "rules_pkg", version = "0.7.0")
bazel_dep(name = "stardoc", version = "0.5.6", repo_name = "io_bazel_stardoc")
bazel_dep(name = "rules_proto", version = "5.3.0-21.7")
-
-bazel_dep(name = "rules_testing", version = "0.5.0", dev_dependency = True)
diff --git a/examples/ksp/BUILD b/examples/ksp/BUILD
index 6722c96..0c4a5ac 100644
--- a/examples/ksp/BUILD
+++ b/examples/ksp/BUILD
@@ -14,7 +14,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-load("@rules_kotlin//kotlin:core.bzl", "define_kt_toolchain", "kt_compiler_plugin", "kt_ksp_plugin", "kt_plugin_cfg")
+load("@rules_kotlin//kotlin:core.bzl", "define_kt_toolchain", "kt_ksp_plugin")
load("@rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library")
package(default_visibility = ["//visibility:public"])
@@ -81,73 +81,3 @@
"//:coffee_app_deploy.jar",
],
)
-
-kt_compiler_plugin(
- name = "ksp",
- compile_phase = True,
- id = "com.google.devtools.ksp.symbol-processing",
- options = {
- "apclasspath": "{classpath}",
- # projectBaseDir shouldn't matter because incremental is disabled
- "projectBaseDir": "{temp}",
- # Disable incremental mode
- "incremental": "false",
- # Directory where class files are written to. Files written to this directory are class
- # files being written directly from the annotation processor, not Kotlinc
- "classOutputDir": "{generatedClasses}",
- # Directory where generated Java sources files are written to
- "javaOutputDir": "{generatedSources}",
- # Directory where generated Kotlin sources files are written to
- "kotlinOutputDir": "{generatedSources}",
- # Directory where META-INF data is written to. This might not be the most ideal place to
- # write this. Maybe just directly to the classes directory?
- "resourceOutputDir": "{generatedSources}",
- # TODO(bencodes) Not sure what this directory is yet.
- "kspOutputDir": "{temp}",
- # Directory to write KSP caches. Shouldn't matter because incremental is disabled
- "cachesDir": "{temp}",
- # Include in compilation as an example. This should be processed in the stubs phase.
- "withCompilation": "true",
- # Set returnOkOnError to false because we want to fail the build if there are any errors
- "returnOkOnError": "false",
- "allWarningsAsErrors": "false",
- },
- deps = [
- "@rules_kotlin//kotlin/compiler:symbol-processing-api",
- "@rules_kotlin//kotlin/compiler:symbol-processing-cmdline",
- ],
-)
-
-kt_plugin_cfg(
- name = "ksp_moshi",
- options = {
- },
- plugin = ":ksp",
- deps = [
- "@maven//:com_squareup_moshi_moshi",
- "@maven//:com_squareup_moshi_moshi_kotlin",
- "@maven//:com_squareup_moshi_moshi_kotlin_codegen",
- ],
-)
-
-kt_jvm_library(
- name = "raw_ksp_coffee_app_lib",
- srcs = ["CoffeeAppModel.kt"],
- plugins = [
- "//:ksp",
- "//:ksp_moshi",
- ],
- deps = [
- "@maven//:com_google_auto_service_auto_service_annotations",
- "@maven//:com_google_auto_value_auto_value_annotations",
- "@maven//:com_squareup_moshi_moshi",
- "@maven//:com_squareup_moshi_moshi_kotlin",
- ],
-)
-
-build_test(
- name = "raw_ksp_lib_test",
- targets = [
- "//:raw_ksp_coffee_app_lib",
- ],
-)
diff --git a/examples/ksp/MODULE.bazel b/examples/ksp/MODULE.bazel
deleted file mode 100644
index 00bb183..0000000
--- a/examples/ksp/MODULE.bazel
+++ /dev/null
@@ -1,6 +0,0 @@
-###############################################################################
-# Bazel now uses Bzlmod by default to manage external dependencies.
-# Please consider migrating your external dependencies from WORKSPACE to MODULE.bazel.
-#
-# For more details, please check https://github.com/bazelbuild/bazel/issues/18958
-###############################################################################
diff --git a/kotlin/core.bzl b/kotlin/core.bzl
index 3b9dd46..a43a3eb 100644
--- a/kotlin/core.bzl
+++ b/kotlin/core.bzl
@@ -12,7 +12,6 @@
"//kotlin/internal/jvm:jvm.bzl",
_kt_compiler_plugin = "kt_compiler_plugin",
_kt_ksp_plugin = "kt_ksp_plugin",
- _kt_plugin_cfg = "kt_plugin_cfg",
)
define_kt_toolchain = _define_kt_toolchain
@@ -21,4 +20,3 @@
kt_kotlinc_options = _kt_kotlinc_options
kt_compiler_plugin = _kt_compiler_plugin
kt_ksp_plugin = _kt_ksp_plugin
-kt_plugin_cfg = _kt_plugin_cfg
diff --git a/kotlin/internal/compiler_plugins.bzl b/kotlin/internal/compiler_plugins.bzl
new file mode 100644
index 0000000..4306a0d
--- /dev/null
+++ b/kotlin/internal/compiler_plugins.bzl
@@ -0,0 +1,21 @@
+load(
+ "//kotlin/internal:defs.bzl",
+ _KtCompilerPluginInfo = "KtCompilerPluginInfo",
+)
+
+def plugins_to_classpaths(providers_list):
+ flattened_files = []
+ for providers in providers_list:
+ if _KtCompilerPluginInfo in providers:
+ provider = providers[_KtCompilerPluginInfo]
+ for e in provider.classpath:
+ flattened_files.append(e)
+ return flattened_files
+
+def plugins_to_options(providers_list):
+ kt_compiler_plugin_providers = [providers[_KtCompilerPluginInfo] for providers in providers_list if _KtCompilerPluginInfo in providers]
+ flattened_options = []
+ for provider in kt_compiler_plugin_providers:
+ for option in provider.options:
+ flattened_options.append("%s:%s" % (option.id, option.value))
+ return flattened_options
diff --git a/kotlin/internal/defs.bzl b/kotlin/internal/defs.bzl
index 7981fe4..498ce06 100644
--- a/kotlin/internal/defs.bzl
+++ b/kotlin/internal/defs.bzl
@@ -11,13 +11,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.#
-load(
- "//src/main/starlark/core/plugin:providers.bzl",
- _KspPluginInfo = "KspPluginInfo",
- _KtCompilerPluginInfo = "KtCompilerPluginInfo",
- _KtCompilerPluginOption = "KtCompilerPluginOption",
- _KtPluginConfiguration = "KtPluginConfiguration",
-)
# The Kotlin Toolchain type.
TOOLCHAIN_TYPE = "%s" % Label("//kotlin/internal:kt_toolchain_type")
@@ -57,10 +50,18 @@
},
)
-KtCompilerPluginInfo = _KtCompilerPluginInfo
+KtCompilerPluginInfo = provider(
+ fields = {
+ "plugin_jars": "List of plugin jars.",
+ "classpath": "The kotlin compiler plugin classpath.",
+ "stubs": "Run this plugin during kapt stub generation.",
+ "compile": "Run this plugin during koltinc compilation.",
+ "options": "List of plugin options, represented as structs with an id and a value field, to be passed to the compiler",
+ },
+)
-KspPluginInfo = _KspPluginInfo
-
-KtCompilerPluginOption = _KtCompilerPluginOption
-
-KtPluginConfiguration = _KtPluginConfiguration
+KspPluginInfo = provider(
+ fields = {
+ "plugins": "List of JavaPLuginInfo providers for the plugins to run with KSP",
+ },
+)
diff --git a/kotlin/internal/jvm/compile.bzl b/kotlin/internal/jvm/compile.bzl
index c32ed24..5b1df20 100644
--- a/kotlin/internal/jvm/compile.bzl
+++ b/kotlin/internal/jvm/compile.bzl
@@ -1,3 +1,9 @@
+load(
+ "@bazel_tools//tools/jdk:toolchain_utils.bzl",
+ "find_java_runtime_toolchain",
+ "find_java_toolchain",
+)
+
# Copyright 2018 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -11,21 +17,11 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-load(
- "@bazel_tools//tools/jdk:toolchain_utils.bzl",
- "find_java_runtime_toolchain",
- "find_java_toolchain",
-)
-load(
- "@rules_java//java:defs.bzl",
- "JavaInfo",
- "java_common",
-)
+load("@rules_java//java:defs.bzl", "JavaInfo", "java_common")
load(
"//kotlin/internal:defs.bzl",
_KtCompilerPluginInfo = "KtCompilerPluginInfo",
_KtJvmInfo = "KtJvmInfo",
- _KtPluginConfiguration = "KtPluginConfiguration",
_TOOLCHAIN_TYPE = "TOOLCHAIN_TYPE",
)
load(
@@ -182,83 +178,9 @@
else:
return _adjust_resources_path_by_default_prefixes(path)
-def _format_compile_plugin_options(o):
- """Format compiler option into id:value for cmd line."""
- return [
- "%s:%s" % (o.id, o.value),
- ]
-
-def _new_plugins_from(targets):
- """Returns a struct containing the plugin metadata for the given targets.
-
- Args:
- targets: A list of targets.
- Returns:
- A struct containing the plugins for the given targets in the format:
- {
- stubs_phase = {
- classpath = depset,
- options= List[KtCompilerPluginOption],
- ),
- compile = {
- classpath = depset,
- options = List[KtCompilerPluginOption],
- },
- }
- """
-
- all_plugins = {}
- plugins_without_phase = []
- for t in targets:
- if _KtCompilerPluginInfo not in t:
- continue
- plugin = t[_KtCompilerPluginInfo]
- if not (plugin.stubs or plugin.compile):
- plugins_without_phase.append("%s: %s" % (t.label, plugin.id))
- if plugin.id in all_plugins:
- # This need a more robust error messaging.
- fail("has multiple plugins with the same id: %s." % plugin.id)
- all_plugins[plugin.id] = plugin
-
- if plugins_without_phase:
- fail("has plugin without a phase defined: %s" % cfgs_without_plugin)
-
- all_plugin_cfgs = {}
- cfgs_without_plugin = []
- for t in targets:
- if _KtPluginConfiguration not in t:
- continue
- cfg = t[_KtPluginConfiguration]
- if cfg.id not in all_plugins:
- cfgs_without_plugin.append("%s: %s" % (t.label, cfg.id))
- all_plugin_cfgs[cfg.id] = cfg
-
- if cfgs_without_plugin:
- fail("has plugin configurations without corresponding plugins: %s" % cfgs_without_plugin)
-
- return struct(
- stubs_phase = _new_plugin_from(all_plugin_cfgs, [p for p in all_plugins.values() if p.stubs]),
- compile_phase = _new_plugin_from(all_plugin_cfgs, [p for p in all_plugins.values() if p.compile]),
- )
-
-def _new_plugin_from(all_cfgs, plugins_for_phase):
- classpath = []
- data = []
- options = []
- for p in plugins_for_phase:
- classpath.append(p.classpath)
- options.extend(p.options)
- if p.id in all_cfgs:
- cfg = all_cfgs[p.id]
- classpath.append(cfg.classpath)
- data.append(cfg.data)
- options.extend(cfg.options)
-
- return struct(
- classpath = depset(transitive = classpath),
- data = depset(transitive = data),
- options = options,
- )
+def _format_compile_plugin_options(options):
+ """Format options into id:value for cmd line."""
+ return ["%s:%s" % (o.id, o.value) for o in options]
# INTERNAL ACTIONS #####################################################################################################
def _fold_jars_action(ctx, rule_kind, toolchains, output_jar, input_jars, action_type = ""):
@@ -503,28 +425,49 @@
uniquify = True,
)
+ compiler_plugins = [
+ p[_KtCompilerPluginInfo]
+ for p in plugins
+ if _KtCompilerPluginInfo in p and p[_KtCompilerPluginInfo]
+ ]
+
+ stubs_compiler_plugins = [
+ kcp
+ for kcp in compiler_plugins
+ if kcp.stubs
+ ]
+
+ compiler_compiler_plugins = [
+ ccp
+ for ccp in compiler_plugins
+ if ccp.compile
+ ]
+
+ if compiler_plugins and not (stubs_compiler_plugins or compiler_compiler_plugins):
+ fail("plugins but no phase plugins: %s" % compiler_plugins)
+
args.add_all(
"--stubs_plugin_classpath",
- plugins.stubs_phase.classpath,
+ depset(transitive = [p.classpath for p in stubs_compiler_plugins]),
omit_if_empty = True,
)
args.add_all(
"--stubs_plugin_options",
- plugins.stubs_phase.options,
+ [p.options for p in stubs_compiler_plugins],
map_each = _format_compile_plugin_options,
omit_if_empty = True,
)
args.add_all(
"--compiler_plugin_classpath",
- plugins.compile_phase.classpath,
+ depset(transitive = [p.classpath for p in compiler_compiler_plugins]),
omit_if_empty = True,
)
args.add_all(
"--compiler_plugin_options",
- plugins.compile_phase.options,
+ [p.options for p in compiler_compiler_plugins],
map_each = _format_compile_plugin_options,
omit_if_empty = True,
)
@@ -550,13 +493,7 @@
mnemonic = mnemonic,
inputs = depset(
srcs.all_srcs + srcs.src_jars + generated_src_jars,
- transitive = [
- compile_deps.compile_jars,
- transitive_runtime_jars,
- deps_artifacts,
- plugins.stubs_phase.classpath,
- plugins.compile_phase.classpath,
- ],
+ transitive = [compile_deps.compile_jars, transitive_runtime_jars, deps_artifacts] + [p.classpath for p in compiler_plugins],
),
tools = tools,
input_manifests = input_manifests,
@@ -596,12 +533,10 @@
deps = ctx.attr.deps,
runtime_deps = ctx.attr.runtime_deps,
)
-
annotation_processors = _plugin_mappers.targets_to_annotation_processors(ctx.attr.plugins + ctx.attr.deps)
ksp_annotation_processors = _plugin_mappers.targets_to_ksp_annotation_processors(ctx.attr.plugins + ctx.attr.deps)
transitive_runtime_jars = _plugin_mappers.targets_to_transitive_runtime_jars(ctx.attr.plugins + ctx.attr.deps)
- plugins = _new_plugins_from(ctx.attr.plugins + _exported_plugins(deps = ctx.attr.deps))
-
+ plugins = ctx.attr.plugins + _exported_plugins(deps = ctx.attr.deps)
deps_artifacts = _deps_artifacts(toolchains, ctx.attr.deps + associates.targets)
generated_src_jars = []
diff --git a/kotlin/internal/jvm/impl.bzl b/kotlin/internal/jvm/impl.bzl
index 393d449..4c65698 100644
--- a/kotlin/internal/jvm/impl.bzl
+++ b/kotlin/internal/jvm/impl.bzl
@@ -1,3 +1,12 @@
+load("@rules_java//java:defs.bzl", "JavaInfo", "JavaPluginInfo", "java_common")
+load(
+ "//kotlin/internal:defs.bzl",
+ _KspPluginInfo = "KspPluginInfo",
+ _KtCompilerPluginInfo = "KtCompilerPluginInfo",
+ _KtJvmInfo = "KtJvmInfo",
+ _TOOLCHAIN_TYPE = "TOOLCHAIN_TYPE",
+)
+
# Copyright 2018 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -11,17 +20,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-
-load("@rules_java//java:defs.bzl", "JavaInfo", "JavaPluginInfo", "java_common")
-load(
- "//kotlin/internal:defs.bzl",
- "KtCompilerPluginOption",
- "KtPluginConfiguration",
- _KspPluginInfo = "KspPluginInfo",
- _KtCompilerPluginInfo = "KtCompilerPluginInfo",
- _KtJvmInfo = "KtJvmInfo",
- _TOOLCHAIN_TYPE = "TOOLCHAIN_TYPE",
-)
load(
"//kotlin/internal/jvm:compile.bzl",
"export_only_providers",
@@ -385,39 +383,16 @@
],
)
-def _resolve_plugin_options(id, string_list_dict, expand_location):
- """
- Resolves plugin options from a string dict to a dict of strings.
-
- Args:
- id: the plugin id
- string_list_dict: a dict of list[string].
- Returns:
- a dict of strings
- """
- options = []
- for (k, vs) in string_list_dict.items():
- for v in vs:
- if "=" in k:
- fail("kotlin compiler option keys cannot contain the = symbol")
- value = k + "=" + expand_location(v) if v else k
- options.append(KtCompilerPluginOption(id = id, value = value))
- return options
-
-# This is naive reference implementation for resolving configurations.
-# A more complicated plugin will need to provide its own implementation.
-def _resolve_plugin_cfg(info, options, deps, expand_location):
- ji = java_common.merge([dep[JavaInfo] for dep in deps if JavaInfo in dep])
- classpath = depset(ji.runtime_output_jars, transitive = [ji.transitive_runtime_jars])
- return KtPluginConfiguration(
- id = info.id,
- options = _resolve_plugin_options(info.id, options, expand_location),
- classpath = classpath,
- data = depset(),
- )
-
def kt_compiler_plugin_impl(ctx):
plugin_id = ctx.attr.id
+ options = []
+ for (k, v) in ctx.attr.options.items():
+ if "=" in k:
+ fail("kt_compiler_plugin options keys cannot contain the = symbol")
+ options.append(struct(id = plugin_id, value = "%s=%s" % (k, v)))
+
+ if not (ctx.attr.compile_phase or ctx.attr.stubs_phase):
+ fail("Plugin must execute during in one or more phases: stubs_phase, compile_phase")
deps = ctx.attr.deps
info = None
@@ -436,25 +411,16 @@
classpath = depset(info.runtime_output_jars, transitive = [info.transitive_runtime_jars])
- # TODO(1035): Migrate kt_compiler_plugin.options to string_list_dict
- options = _resolve_plugin_options(plugin_id, {k: [v] for (k, v) in ctx.attr.options.items()}, ctx.expand_location)
-
return [
DefaultInfo(files = classpath),
_KtCompilerPluginInfo(
- id = plugin_id,
classpath = classpath,
options = options,
stubs = ctx.attr.stubs_phase,
compile = ctx.attr.compile_phase,
- resolve_cfg = _resolve_plugin_cfg,
),
]
-def kt_plugin_cfg_impl(ctx):
- plugin = ctx.attr.plugin[_KtCompilerPluginInfo]
- return plugin.resolve_cfg(plugin, ctx.attr.options, ctx.attr.deps, ctx.expand_location)
-
def kt_ksp_plugin_impl(ctx):
info = java_common.merge([dep[JavaInfo] for dep in ctx.attr.deps])
classpath = depset(info.runtime_output_jars, transitive = [info.transitive_runtime_jars])
diff --git a/kotlin/internal/jvm/jvm.bzl b/kotlin/internal/jvm/jvm.bzl
index d709903..bef495e 100644
--- a/kotlin/internal/jvm/jvm.bzl
+++ b/kotlin/internal/jvm/jvm.bzl
@@ -95,7 +95,6 @@
load("@rules_java//java:defs.bzl", "JavaInfo")
load(
"//kotlin/internal:defs.bzl",
- "KtPluginConfiguration",
_JAVA_RUNTIME_TOOLCHAIN_TYPE = "JAVA_RUNTIME_TOOLCHAIN_TYPE",
_JAVA_TOOLCHAIN_TYPE = "JAVA_TOOLCHAIN_TYPE",
_KspPluginInfo = "KspPluginInfo",
@@ -110,7 +109,6 @@
)
load(
"//kotlin/internal/jvm:impl.bzl",
- "kt_plugin_cfg_impl",
_kt_compiler_deps_aspect_impl = "kt_compiler_deps_aspect_impl",
_kt_compiler_plugin_impl = "kt_compiler_plugin_impl",
_kt_jvm_binary_impl = "kt_jvm_binary_impl",
@@ -174,7 +172,6 @@
[Attributes common to all build rules](https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes).""",
providers = [
[JavaInfo],
- [_KtJvmInfo],
],
allow_files = False,
),
@@ -214,12 +211,6 @@
"plugins": attr.label_list(
default = [],
cfg = "exec",
- providers = [
- [JavaPluginInfo],
- [_KtJvmInfo],
- [KtPluginConfiguration],
- [_KtCompilerPluginInfo],
- ],
),
"module_name": attr.string(
doc = """The name of the module, if not provided the module name is derived from the label. --e.g.,
@@ -262,7 +253,7 @@
of any targets that directly depend on this target. Unlike `java_plugin`s exported_plugins,
this is not transitive""",
default = [],
- providers = [[_KtCompilerPluginInfo], [KtPluginConfiguration]],
+ providers = [_KtCompilerPluginInfo],
),
"neverlink": attr.bool(
doc = """If true only use this library for compilation and not at runtime.""",
@@ -461,7 +452,7 @@
attribute of any targets that directly depend on this target. Unlike java_plugins'
exported_plugins, this is not transitive""",
default = [],
- providers = [[_KtCompilerPluginInfo], [KtPluginConfiguration]],
+ providers = [_KtCompilerPluginInfo],
),
"neverlink": attr.bool(
doc = """If true only use this library for compilation and not at runtime.""",
@@ -541,7 +532,6 @@
- `{generatedClasses}`: directory for generated class output
- `{temp}`: temporary directory, discarded between invocations
- `{generatedSources}`: directory for generated source output
-- `{classpath}` : replaced with a list of jars separated by the filesystem appropriate separator.
""",
default = {},
),
@@ -611,30 +601,3 @@
implementation = _kt_ksp_plugin_impl,
provides = [_KspPluginInfo],
)
-
-kt_plugin_cfg = rule(
- implementation = kt_plugin_cfg_impl,
- doc = """
- Configurations for kt_compiler_plugin, ksp_plugin, and java_plugin.
-
- This allows setting options and dependencies independently from the initial plugin definition.
- """,
- attrs = {
- "plugin": attr.label(
- doc = "The plugin to associate with this configuration",
- providers = [_KtCompilerPluginInfo],
- mandatory = True,
- ),
- "options": attr.string_list_dict(
- doc = "A dictionary of flag to values to be used as plugin configuration options.",
- ),
- "deps": attr.label_list(
- doc = "Dependencies for this configuration.",
- providers = [
- [_KspPluginInfo],
- [JavaInfo],
- [JavaPluginInfo],
- ],
- ),
- },
-)
diff --git a/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/CompilationTask.kt b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/CompilationTask.kt
index a5b0ff2..9f8dbf3 100644
--- a/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/CompilationTask.kt
+++ b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/CompilationTask.kt
@@ -97,15 +97,13 @@
xFlag("plugin", it)
}
- val optionTokens = mapOf(
+ val dirTokens = mapOf(
"{generatedClasses}" to directories.generatedClasses,
"{stubs}" to directories.stubs,
- "{temp}" to directories.temp,
"{generatedSources}" to directories.generatedSources,
- "{classpath}" to classpath.joinToString(File.pathSeparator)
)
options.forEach { opt ->
- val formatted = optionTokens.entries.fold(opt) { formatting, (token, value) ->
+ val formatted = dirTokens.entries.fold(opt) { formatting, (token, value) ->
formatting.replace(token, value)
}
flag("-P", "plugin:$formatted")
diff --git a/src/main/starlark/core/BUILD.bazel b/src/main/starlark/core/BUILD.bazel
index ce8674d..7cb934b 100644
--- a/src/main/starlark/core/BUILD.bazel
+++ b/src/main/starlark/core/BUILD.bazel
@@ -11,7 +11,6 @@
},
deps = [
"//src/main/starlark/core/options:pkg",
- "//src/main/starlark/core/plugin:pkg",
"//src/main/starlark/core/repositories:pkg",
],
)
@@ -21,7 +20,7 @@
srcs = glob(["*.bzl"]),
visibility = ["//:__subpackages__"],
deps = [
- "//src/main/starlark/core/plugin",
+ "//src/main/starlark/core/options",
"//src/main/starlark/core/repositories",
],
)
diff --git a/src/main/starlark/core/options/BUILD.bazel b/src/main/starlark/core/options/BUILD.bazel
index 17fa671..6512aeb 100644
--- a/src/main/starlark/core/options/BUILD.bazel
+++ b/src/main/starlark/core/options/BUILD.bazel
@@ -11,11 +11,10 @@
},
)
-#bzl_library(
-# name = "options",
-# srcs = glob(["*.bzl"]),
-# visibility = ["//:__subpackages__"],
-# deps = [
-# "@com_github_jetbrains_kotlin//:capabilities",
-# ],
-#)
+bzl_library(
+ name = "options",
+ srcs = glob(["*.bzl"]) + [
+ "@com_github_jetbrains_kotlin//:capabilities.bzl",
+ ],
+ visibility = ["//:__subpackages__"],
+)
diff --git a/src/main/starlark/core/plugin/BUILD.bazel b/src/main/starlark/core/plugin/BUILD.bazel
deleted file mode 100644
index 3a04b6e..0000000
--- a/src/main/starlark/core/plugin/BUILD.bazel
+++ /dev/null
@@ -1,18 +0,0 @@
-load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
-load("//src/main/starlark/release:packager.bzl", "release_archive")
-
-release_archive(
- name = "pkg",
- srcs = glob(
- ["*.bzl"],
- ),
- src_map = {
- "BUILD.release.bazel": "BUILD.bazel",
- },
-)
-
-bzl_library(
- name = "plugin",
- srcs = glob(["*.bzl"]),
- visibility = ["//:__subpackages__"],
-)
diff --git a/src/main/starlark/core/plugin/BUILD.release.bazel b/src/main/starlark/core/plugin/BUILD.release.bazel
deleted file mode 100644
index 79697e7..0000000
--- a/src/main/starlark/core/plugin/BUILD.release.bazel
+++ /dev/null
@@ -1,7 +0,0 @@
-load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
-
-bzl_library(
- name = "plugin",
- srcs = glob(["*.bzl"]),
- visibility = ["//:__subpackages__"],
-)
diff --git a/src/main/starlark/core/plugin/providers.bzl b/src/main/starlark/core/plugin/providers.bzl
deleted file mode 100644
index 93c610b..0000000
--- a/src/main/starlark/core/plugin/providers.bzl
+++ /dev/null
@@ -1,34 +0,0 @@
-KtCompilerPluginOption = provider(
- fields = {
- "id": "The id of the option.",
- "value": "The value of the option.",
- },
-)
-
-KtCompilerPluginInfo = provider(
- fields = {
- "id": "The id of the plugin.",
- "plugin_jars": "List of plugin jars.",
- "classpath": "The kotlin compiler plugin classpath.",
- "stubs": "Run this plugin during kapt stub generation.",
- "compile": "Run this plugin during koltinc compilation.",
- "options": "List of plugin options, represented as KtCompilerPluginOption, to be passed to the compiler",
- "resolve_cfg": "A Callable[[KtCompilerPluginInfo, Dict[str,str], List[Target], KtPluginConfiguration]" +
- " that resolves an associated plugin configuration.",
- },
-)
-
-KtPluginConfiguration = provider(
- fields = {
- "id": "The id of the compiler plugin associated with this configuration.",
- "options": "List of plugin options, represented KtCompilerPluginOption",
- "classpath": "Depset of jars to add to the classpath when running the plugin.",
- "data": "Depset of files to pass to the plugin as data.",
- },
-)
-
-KspPluginInfo = provider(
- fields = {
- "plugins": "List of JavaPluginInfo providers for the plugins to run with KSP",
- },
-)
diff --git a/src/main/starlark/core/repositories/BUILD.com_github_jetbrains_kotlin.bazel b/src/main/starlark/core/repositories/BUILD.com_github_jetbrains_kotlin.bazel
index d343f85..782b6e8 100644
--- a/src/main/starlark/core/repositories/BUILD.com_github_jetbrains_kotlin.bazel
+++ b/src/main/starlark/core/repositories/BUILD.com_github_jetbrains_kotlin.bazel
@@ -13,15 +13,8 @@
# limitations under the License.
package(default_visibility = ["//visibility:public"])
-load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
-
# Kotlin home filegroup containing everything that is needed.
filegroup(
name = "home",
srcs = glob(["**"]),
)
-
-bzl_library(
- name = "capabilities",
- srcs = ["capabilities.bzl"],
-)
diff --git a/src/main/starlark/core/repositories/versions.bzl b/src/main/starlark/core/repositories/versions.bzl
index b9c7bc6..383546f 100644
--- a/src/main/starlark/core/repositories/versions.bzl
+++ b/src/main/starlark/core/repositories/versions.bzl
@@ -125,12 +125,5 @@
],
sha256 = None,
),
- RULES_TESTING = version(
- version = "0.5.0",
- url_templates = [
- "https://github.com/bazelbuild/rules_testing/releases/download/v{version}/rules_testing-v{version}.tar.gz",
- ],
- sha256 = "b84ed8546f1969d700ead4546de9f7637e0f058d835e47e865dcbb13c4210aed",
- ),
use_repository = _use_repository,
)
diff --git a/src/test/starlark/case.bzl b/src/test/starlark/case.bzl
deleted file mode 100644
index 38b1932..0000000
--- a/src/test/starlark/case.bzl
+++ /dev/null
@@ -1,34 +0,0 @@
-load("@rules_testing//lib:util.bzl", "util")
-load("@rules_testing//lib:test_suite.bzl", "test_suite")
-
-def _prepend(rule, name, **kwargs):
- util.helper_target(
- rule,
- name = name,
- **kwargs
- )
- return ":" + name
-
-def case(namespace):
- return struct(
- name = namespace,
- have = lambda rule, name, **kwargs: _prepend(rule, namespace + "_" + name, **kwargs),
- artifact = lambda name, **kwargs: util.empty_file(
- name = namespace + "_" + name,
- **kwargs
- ),
- got = lambda rule, name, **kwargs: _prepend(rule, namespace + "_" + name, **kwargs),
- ref = lambda name: ":" + namespace + "_" + name,
- )
-
-def suite(name, *tests):
- test_targets = []
- for test in tests:
- test_name = str(test).split(" ")[1]
- test_targets.append(":" + test_name)
- test(case(test_name))
-
- native.test_suite(
- name = name,
- tests = test_targets,
- )
diff --git a/src/test/starlark/core/plugin/BUILD.bazel b/src/test/starlark/core/plugin/BUILD.bazel
deleted file mode 100644
index 9a78d31..0000000
--- a/src/test/starlark/core/plugin/BUILD.bazel
+++ /dev/null
@@ -1,5 +0,0 @@
-load(":test.bzl", "test_suite")
-
-test_suite(
- name = "plugin",
-)
diff --git a/src/test/starlark/core/plugin/subjects.bzl b/src/test/starlark/core/plugin/subjects.bzl
deleted file mode 100644
index 06541b3..0000000
--- a/src/test/starlark/core/plugin/subjects.bzl
+++ /dev/null
@@ -1,37 +0,0 @@
-load("@rules_testing//lib:truth.bzl", "subjects")
-
-def plugin_option_subject_factory(value, meta):
- return subjects.struct(
- value,
- meta = meta.derive("option"),
- attrs = {
- "id": subjects.str,
- "value": subjects.str,
- },
- )
-
-def plugin_subject_factory(value, meta):
- return subjects.struct(
- value,
- meta = meta,
- attrs = {
- "id": subjects.str,
- "plugin_jars": subjects.collection,
- "classpath": subjects.collection,
- "stubs": subjects.bool,
- "compile": subjects.bool,
- "options": subjects.collection,
- },
- )
-
-def plugin_configuration_subject_factory(value, meta):
- return subjects.struct(
- value,
- meta = meta,
- attrs = {
- "id": subjects.str,
- "options": subjects.collection,
- "classpath": subjects.collection,
- "data": subjects.collection,
- },
- )
diff --git a/src/test/starlark/core/plugin/test.bzl b/src/test/starlark/core/plugin/test.bzl
deleted file mode 100644
index 9716afc..0000000
--- a/src/test/starlark/core/plugin/test.bzl
+++ /dev/null
@@ -1,382 +0,0 @@
-load("//src/main/starlark/core/plugin:providers.bzl", "KspPluginInfo", "KtCompilerPluginInfo", "KtPluginConfiguration")
-load("@rules_testing//lib:analysis_test.bzl", "analysis_test")
-load("@rules_testing//lib:util.bzl", "util")
-load("//kotlin:core.bzl", "kt_compiler_plugin", "kt_plugin_cfg")
-load("//kotlin:jvm.bzl", "kt_jvm_import", "kt_jvm_library")
-load("@rules_testing//lib:truth.bzl", "subjects")
-load("//src/test/starlark:case.bzl", "suite")
-load("//src/test/starlark:truth.bzl", "fail_messages_in", "flags_and_values_of")
-load(":subjects.bzl", "plugin_configuration_subject_factory")
-
-def _provider_test_impl(env, target):
- want_options = env.ctx.attr.want_options
- got_target = env.expect.that_target(target)
- got_target.has_provider(KtPluginConfiguration)
- got_provider = got_target.provider(KtPluginConfiguration, plugin_configuration_subject_factory)
- got_provider.options().transform(desc = "option.value", map_each = lambda o: o.value).contains_at_least(want_options)
- got_provider.id().equals(env.ctx.attr.want_plugin[KtCompilerPluginInfo].id)
-
-def _action_test_impl(env, target):
- action = env.expect.that_target(target).action_named(env.ctx.attr.on_action_mnemonic)
- action.inputs().contains_at_least([f.short_path for f in env.ctx.files.want_inputs])
- flags_and_values_of(action).contains_at_least(env.ctx.attr.want_flags.items())
-
-def _expect_failure(env, target):
- fail_messages_in(env.expect.that_target(target)).contains_at_least(env.ctx.attr.want_failures)
-
-def plugin_for(test, name, deps = [], id = None, **kwargs):
- plugin_jar = test.artifact(
- name = name + ".jar",
- )
-
- deps = deps + [
- test.have(
- kt_jvm_import,
- name = name + "_plugin_jar",
- jars = [
- plugin_jar,
- ],
- ),
- ]
-
- plugin = test.have(
- kt_compiler_plugin,
- id = id if id else "plugin." + name,
- name = name,
- deps = deps,
- **kwargs
- )
- return (plugin, plugin_jar)
-
-def _test_kt_plugin_cfg(test):
- plugin = test.have(
- kt_compiler_plugin,
- name = "plugin",
- id = "test.stub",
- options = {
- "annotation": "plugin.StubForTesting",
- },
- deps = [
- test.have(
- kt_jvm_library,
- name = "plugin_dep",
- srcs = [
- test.artifact(
- name = "plugin.kt",
- ),
- ],
- ),
- ],
- )
- cfg_dep = test.have(
- kt_jvm_library,
- name = "cfg_dep",
- srcs = [
- test.artifact(
- name = "dependency.kt",
- ),
- ],
- )
-
- cfg = test.got(
- kt_plugin_cfg,
- name = "got",
- plugin = plugin,
- options = {
- "extra": "annotation",
- },
- deps = [
- cfg_dep,
- ],
- )
-
- analysis_test(
- name = test.name,
- impl = _provider_test_impl,
- target = cfg,
- attr_values = {
- "want_plugin": plugin,
- "want_deps": [cfg_dep],
- "want_options": [
- "extra=annotation",
- ],
- },
- attrs = {
- "want_plugin": attr.label(providers = [KtCompilerPluginInfo]),
- "want_options": attr.string_list(),
- "want_deps": attr.label_list(providers = [JavaInfo]),
- },
- )
-
-def _test_compile_configuration(test):
- plugin_jar = test.artifact(
- name = "plugin.jar",
- )
-
- plugin = test.have(
- kt_compiler_plugin,
- name = "plugin",
- id = "test.stub",
- options = {
- "annotation": "plugin.StubForTesting",
- },
- deps = [
- test.have(
- kt_jvm_import,
- name = "plugin_jar",
- jars = [
- plugin_jar,
- ],
- ),
- ],
- )
-
- dep_jar = test.artifact(
- name = "dep.jar",
- )
-
- cfg = test.have(
- kt_plugin_cfg,
- name = "cfg",
- plugin = plugin,
- options = {
- "-Dop": "koo",
- },
- deps = [
- test.have(
- kt_jvm_import,
- name = "dep_jar",
- jars = [
- dep_jar,
- ],
- ),
- ],
- )
-
- got = test.got(
- kt_jvm_library,
- name = "got_library",
- srcs = [
- test.artifact(
- name = "got_library.kt",
- ),
- ],
- plugins = [
- plugin,
- cfg,
- ],
- )
-
- analysis_test(
- name = test.name,
- impl = _action_test_impl,
- target = got,
- attr_values = {
- "on_action_mnemonic": "KotlinCompile",
- "want_flags": {
- "--compiler_plugin_options": ["test.stub:annotation=plugin.StubForTesting", "test.stub:-Dop=koo"],
- "--stubs_plugin_options": ["test.stub:annotation=plugin.StubForTesting", "test.stub:-Dop=koo"],
- },
- "want_inputs": [
- plugin_jar,
- dep_jar,
- ],
- },
- attrs = {
- "on_action_mnemonic": attr.string(),
- "want_flags": attr.string_list_dict(),
- "want_inputs": attr.label_list(providers = [DefaultInfo], allow_files = True),
- },
- )
-
-def _test_compile_configuration_single_phase(test):
- stub, stub_jar = plugin_for(
- test,
- name = "stub",
- id = "plugin.stub",
- compile_phase = False,
- stubs_phase = True,
- )
-
- compile, compile_jar = plugin_for(
- test,
- name = "compile",
- id = "plugin.compile",
- stubs_phase = False,
- compile_phase = True,
- )
-
- stub_cfg = test.have(
- kt_plugin_cfg,
- name = "stub_cfg",
- plugin = stub,
- options = {
- "-Dop": "stub_only",
- },
- )
-
- compile_cfg = test.have(
- kt_plugin_cfg,
- name = "compile_cfg",
- plugin = compile,
- options = {
- "-Dop": "compile_only",
- },
- )
-
- got = test.got(
- kt_jvm_library,
- name = "got_library",
- srcs = [
- test.artifact(
- name = "got_library.kt",
- ),
- ],
- plugins = [
- stub,
- compile,
- compile_cfg,
- stub_cfg,
- ],
- )
-
- analysis_test(
- name = test.name,
- impl = _action_test_impl,
- target = got,
- attr_values = {
- "on_action_mnemonic": "KotlinCompile",
- "want_flags": {
- "--compiler_plugin_options": ["plugin.compile:-Dop=compile_only"],
- "--stubs_plugin_options": ["plugin.stub:-Dop=stub_only"],
- },
- "want_inputs": [
- stub_jar,
- compile_jar,
- ],
- },
- attrs = {
- "on_action_mnemonic": attr.string(),
- "want_flags": attr.string_list_dict(),
- "want_inputs": attr.label_list(providers = [DefaultInfo], allow_files = True),
- },
- )
-
-def _test_library_multiple_plugins_with_same_id(test):
- got = test.got(
- kt_jvm_library,
- name = "got_library",
- srcs = [
- test.artifact(
- name = "got_library.kt",
- ),
- ],
- plugins = [
- test.have(
- kt_compiler_plugin,
- name = "one",
- id = "test.stub",
- options = {
- "annotation": "plugin.StubForTesting",
- },
- deps = [
- test.have(
- kt_jvm_import,
- name = "one_plugin_jar",
- jars = [
- test.artifact(
- name = "one_plugin.jar",
- ),
- ],
- ),
- ],
- ),
- test.have(
- kt_compiler_plugin,
- name = "two",
- id = "test.stub",
- options = {
- "annotation": "plugin.StubForTesting",
- },
- deps = [
- test.have(
- kt_jvm_import,
- name = "two_plugin_jar",
- jars = [
- test.artifact(
- name = "two_plugin.jar",
- ),
- ],
- ),
- ],
- ),
- ],
- )
-
- analysis_test(
- name = test.name,
- impl = _expect_failure,
- expect_failure = True,
- target = got,
- attr_values = {
- "want_failures": [
- "has multiple plugins with the same id: test.stub.",
- ],
- },
- attrs = {
- "want_failures": attr.string_list(),
- },
- )
-
-def _test_cfg_without_plugin(test):
- adee, _ = plugin_for(
- test,
- name = "Adee",
- id = "adee.see",
- )
- adee_cfg = test.have(
- kt_plugin_cfg,
- name = "adee_cfg",
- plugin = adee,
- options = {
- "-Dop": "compile_only",
- },
- )
-
- got = test.got(
- kt_jvm_library,
- name = "got_library",
- srcs = [
- test.artifact(
- name = "got_library.kt",
- ),
- ],
- plugins = [
- adee_cfg,
- ],
- )
-
- analysis_test(
- name = test.name,
- impl = _expect_failure,
- expect_failure = True,
- target = got,
- attr_values = {
- "want_failures": [
- "has plugin configurations without corresponding plugins: [\"%s: adee.see\"]" % Label(adee_cfg),
- ],
- },
- attrs = {
- "want_failures": attr.string_list(),
- },
- )
-
-def test_suite(name):
- suite(
- name,
- _test_kt_plugin_cfg,
- _test_compile_configuration,
- _test_library_multiple_plugins_with_same_id,
- _test_compile_configuration_single_phase,
- _test_cfg_without_plugin,
- )
diff --git a/src/test/starlark/truth.bzl b/src/test/starlark/truth.bzl
deleted file mode 100644
index 42cf81e..0000000
--- a/src/test/starlark/truth.bzl
+++ /dev/null
@@ -1,41 +0,0 @@
-"""
-Collection of utility functions for the action subject
-"""
-
-def fail_messages_in(target_subject):
- return target_subject.failures().transform(
- desc = "failure.message",
- map_each = lambda f: f.partition("Error in fail:")[2].strip() if "Error in fail:" in f else f,
- )
-
-def flags_and_values_of(action_subject):
- return action_subject.argv().transform(desc = "parsed()", loop = _action_subject_parse_flags)
-
-def _action_subject_parse_flags(argv):
- parsed_flags = {}
-
- # argv might be none for e.g. builtin actions
- if argv == None:
- return parsed_flags
- last_flag = None
- for arg in argv:
- value = None
- if arg == "--":
- # skip the rest of the arguments, this is standard end of the flags.
- break
- if arg.startswith("-"):
- if "=" in arg:
- last_flag, value = arg.split("=", 1)
- else:
- last_flag = arg
- elif last_flag:
- # have a flag, therefore this is probably an associated argument
- value = arg
- else:
- # skip non-flag arguments
- continue
-
- # only set the value if it exists
- if value:
- parsed_flags.setdefault(last_flag, []).append(value)
- return parsed_flags.items()