Skip to content

Commit 21888d4

Browse files
tune unused deps handling with tags
1 parent e1db289 commit 21888d4

File tree

3 files changed

+87
-6
lines changed

3 files changed

+87
-6
lines changed

kotlin/internal/jvm/compile.bzl

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,18 @@ def find_java_runtime_toolchain(ctx, target):
6464
def _java_info(target):
6565
return target[JavaInfo] if JavaInfo in target else None
6666

67-
def _deps_artifacts(toolchains, targets):
67+
def _report_unused_deps(ctx, toolchains):
68+
if "kt_experimental_report_unused_deps_off" in ctx.attr.tags:
69+
return "off"
70+
if "kt_experimental_report_unused_deps_warn" in ctx.attr.tags:
71+
return "warn"
72+
if "kt_experimental_report_unused_deps_error" in ctx.attr.tags:
73+
return "error"
74+
return toolchains.kt.experimental_report_unused_deps
75+
76+
def _deps_artifacts(ctx, toolchains, targets):
6877
"""Collect Jdeps artifacts if required."""
69-
if not toolchains.kt.experimental_report_unused_deps == "off":
78+
if not _report_unused_deps(ctx, toolchains) == "off":
7079
deps_artifacts = [t[JavaInfo].outputs.jdeps for t in targets if JavaInfo in t and t[JavaInfo].outputs.jdeps]
7180
else:
7281
deps_artifacts = []
@@ -320,7 +329,13 @@ def _run_merge_jdeps_action(ctx, toolchains, jdeps, outputs, deps):
320329
args.add("--" + f, path)
321330

322331
args.add_all("--inputs", jdeps, omit_if_empty = True)
323-
args.add("--report_unused_deps", toolchains.kt.experimental_report_unused_deps)
332+
args.add("--report_unused_deps", _report_unused_deps(ctx, toolchains))
333+
unused_deps_ignored_targets = [
334+
tag.split(":", 1)[1]
335+
for tag in ctx.attr.tags
336+
if tag.startswith("kt_experimental_unused_deps_ignored_targets:")
337+
]
338+
args.add_all("--unused_deps_ignored_targets", unused_deps_ignored_targets, omit_if_empty = True)
324339

325340
mnemonic = "JdepsMerge"
326341
progress_message = "%s %%{label} { jdeps: %d }" % (
@@ -329,7 +344,7 @@ def _run_merge_jdeps_action(ctx, toolchains, jdeps, outputs, deps):
329344
)
330345

331346
inputs = depset(jdeps)
332-
if not toolchains.kt.experimental_report_unused_deps == "off":
347+
if not _report_unused_deps(ctx, toolchains) == "off":
333348
# For sandboxing to work, and for this action to be deterministic, the compile jars need to be passed as inputs
334349
inputs = depset(jdeps, transitive = [depset([], transitive = [dep.transitive_compile_time_jars for dep in deps])])
335350

@@ -596,7 +611,7 @@ def kt_jvm_produce_jar_actions(ctx, rule_kind):
596611
transitive_runtime_jars = _plugin_mappers.targets_to_transitive_runtime_jars(ctx.attr.plugins + ctx.attr.deps)
597612
plugins = _new_plugins_from(ctx.attr.plugins + _exported_plugins(deps = ctx.attr.deps))
598613

599-
deps_artifacts = _deps_artifacts(toolchains, ctx.attr.deps + ctx.attr.associates)
614+
deps_artifacts = _deps_artifacts(ctx, toolchains, ctx.attr.deps + ctx.attr.associates)
600615

601616
generated_src_jars = []
602617
annotation_processing = None

src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsMerger.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class JdepsMerger {
3838
OUTPUT("--output"),
3939
TARGET_LABEL("--target_label"),
4040
REPORT_UNUSED_DEPS("--report_unused_deps"),
41+
UNUSED_DEPS_IGNORED_TARGETS("--unused_deps_ignored_targets"),
4142
}
4243

4344
private fun readJarOwnerFromManifest(jarPath: Path): JarOwner {
@@ -63,6 +64,7 @@ class JdepsMerger {
6364
inputs: List<String>,
6465
output: String,
6566
reportUnusedDeps: String,
67+
unusedDepsIgnoredTargets: List<String>,
6668
): Int {
6769
val rootBuilder = Deps.Dependencies.newBuilder()
6870
rootBuilder.success = false
@@ -114,6 +116,7 @@ class JdepsMerger {
114116
.filter { it.value == Deps.Dependency.Kind.UNUSED }
115117
.map { it.key }
116118
.filter { it != label }
119+
.filter { it !in unusedDepsIgnoredTargets }
117120

118121
if (unusedLabels.isNotEmpty()) {
119122
ctx.info {
@@ -160,7 +163,9 @@ class JdepsMerger {
160163
val output = argMap.mandatorySingle(JdepsMergerFlags.OUTPUT)
161164
val label = argMap.mandatorySingle(JdepsMergerFlags.TARGET_LABEL)
162165
val reportUnusedDeps = argMap.mandatorySingle(JdepsMergerFlags.REPORT_UNUSED_DEPS)
166+
val unusedDepsIgnoredTargets =
167+
argMap.optional(JdepsMergerFlags.UNUSED_DEPS_IGNORED_TARGETS).orEmpty()
163168

164-
return merge(ctx, label, inputs, output, reportUnusedDeps)
169+
return merge(ctx, label, inputs, output, reportUnusedDeps, unusedDepsIgnoredTargets)
165170
}
166171
}

src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsMergerTest.kt

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,67 @@ class JdepsMergerTest {
204204
).containsExactly(unusedKotlinDep)
205205
}
206206

207+
@Test
208+
fun `unused deps report warning unless ignored`() {
209+
val merger = DaggerJdepsMergerTestComponent.builder().build().jdepsMerger()
210+
211+
val unusedKotlinDep1 = ktJvmLibrary("kotlin_dep1")
212+
val unusedKotlinDep2 = ktJvmLibrary("kotlin_dep2")
213+
val kotlinJdeps = jdeps("kt.jdeps") {
214+
addDependency(
215+
with(Dependency.newBuilder()) {
216+
kind = Dependency.Kind.UNUSED
217+
path = unusedKotlinDep1
218+
build()
219+
},
220+
)
221+
addDependency(
222+
with(Dependency.newBuilder()) {
223+
kind = Dependency.Kind.UNUSED
224+
path = unusedKotlinDep2
225+
build()
226+
},
227+
)
228+
}
229+
230+
val javaJdeps = jdeps("java.jdeps") {
231+
addDependency(
232+
with(Dependency.newBuilder()) {
233+
kind = Dependency.Kind.EXPLICIT
234+
path = ktJvmLibrary("java_dep")
235+
build()
236+
},
237+
)
238+
}
239+
240+
val mergedJdeps = out("merged.jdeps")
241+
242+
val result = WorkerContext.run {
243+
doTask("jdepsmerge") { taskCtx ->
244+
MergeJdeps(merger = merger).invoke(
245+
taskCtx,
246+
args {
247+
input(kotlinJdeps)
248+
input(javaJdeps)
249+
flag(JdepsMergerFlags.TARGET_LABEL, "//foo/bar:baz")
250+
flag(JdepsMergerFlags.OUTPUT, mergedJdeps)
251+
flag(JdepsMergerFlags.REPORT_UNUSED_DEPS, "warn")
252+
flag(JdepsMergerFlags.UNUSED_DEPS_IGNORED_TARGETS, "kotlin_dep2")
253+
},
254+
)
255+
}
256+
}
257+
assertThat(result.status).isEqualTo(SUCCESS)
258+
assertThat(result.log.out.toString()).contains("'remove deps kotlin_dep1' //foo/bar:baz")
259+
260+
val depsProto = depsProto(mergedJdeps)
261+
assertThat(
262+
depsProto.dependencyList
263+
.filter { it.kind == Dependency.Kind.UNUSED }
264+
.map { it.path },
265+
).containsExactly(unusedKotlinDep1, unusedKotlinDep2)
266+
}
267+
207268
@Test
208269
fun `unused deps report error`() {
209270
val merger = DaggerJdepsMergerTestComponent.builder().build().jdepsMerger()

0 commit comments

Comments
 (0)