Skip to content

Commit d29ceda

Browse files
Implement target-specific unused_deps_mode attribute on java rules with tests
1 parent 43619a8 commit d29ceda

8 files changed

Lines changed: 294 additions & 5 deletions

File tree

MODULE.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,11 @@ local_path_override(
137137
path = "./third_party/remoteapis",
138138
)
139139

140+
local_path_override(
141+
module_name = "rules_java",
142+
path = "rules_java_tmp",
143+
)
144+
140145
# =========================================
141146
# Java dependencies
142147
# =========================================

src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,9 @@ private DepsCheckingMode getUnusedDepsMode() {
605605
if (!ruleContext.getLabel().getRepository().isMain()) {
606606
return DepsCheckingMode.OFF;
607607
}
608+
if (getAttributes().getUnusedDepsMode() != DepsCheckingMode.DEFAULT) {
609+
return getAttributes().getUnusedDepsMode();
610+
}
608611
DepsCheckingMode mode = getJavaConfiguration().getUnusedDeps();
609612
if (ruleContext.getRule() != null) {
610613
java.util.Set<String> tags = ruleContext.getRule().getRuleTags();

src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,20 @@ private static DepsCheckingMode getStrictDepsMode(String strictDepsMode) {
8585
}
8686
}
8787

88+
private static DepsCheckingMode getUnusedDepsMode(String unusedDepsMode) {
89+
switch (unusedDepsMode) {
90+
case "OFF":
91+
return DepsCheckingMode.OFF;
92+
case "ERROR":
93+
return DepsCheckingMode.ERROR;
94+
case "WARN":
95+
return DepsCheckingMode.WARN;
96+
case "DEFAULT":
97+
default:
98+
return DepsCheckingMode.DEFAULT;
99+
}
100+
}
101+
88102
private void checkJavaToolchainIsDeclaredOnRule(RuleContext ruleContext)
89103
throws EvalException, LabelSyntaxException {
90104
ToolchainInfo toolchainInfo =
@@ -201,7 +215,8 @@ public void createCompilationAction(
201215
boolean enableJSpecify,
202216
boolean enableDirectClasspath,
203217
Sequence<?> additionalInputs,
204-
Sequence<?> additionalOutputs)
218+
Sequence<?> additionalOutputs,
219+
String unusedDepsMode)
205220
throws EvalException,
206221
TypeException,
207222
RuleErrorException,
@@ -227,6 +242,7 @@ public void createCompilationAction(
227242
.addClassPathResources(
228243
Sequence.cast(classpathResources, Artifact.class, "classpath_resources"))
229244
.setStrictJavaDeps(getStrictDepsMode(Ascii.toUpperCase(strictDepsMode)))
245+
.setUnusedDepsMode(getUnusedDepsMode(Ascii.toUpperCase(unusedDepsMode)))
230246
.setTargetLabel(targetLabel)
231247
.setInjectingRuleKind(
232248
injectingRuleKind == Starlark.NONE ? null : (String) injectingRuleKind)

src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ public static class Builder {
6868
/** @see {@link #setStrictJavaDeps}. */
6969
private DepsCheckingMode strictJavaDeps = DepsCheckingMode.ERROR;
7070

71+
private DepsCheckingMode unusedDepsMode = DepsCheckingMode.DEFAULT;
72+
7173
private final NestedSetBuilder<Artifact> directJarsBuilder = NestedSetBuilder.naiveLinkOrder();
7274
private final NestedSetBuilder<Artifact> headerCompilationDirectJarsBuilder =
7375
NestedSetBuilder.naiveLinkOrder();
@@ -178,6 +180,14 @@ public Builder setStrictJavaDeps(DepsCheckingMode strictDeps) {
178180
return this;
179181
}
180182

183+
/** Sets the unused dependency checking mode. */
184+
@CanIgnoreReturnValue
185+
public Builder setUnusedDepsMode(DepsCheckingMode unusedDeps) {
186+
Preconditions.checkArgument(!built);
187+
unusedDepsMode = unusedDeps;
188+
return this;
189+
}
190+
181191
/**
182192
* In tandem with strictJavaDeps, directJars represents a subset of the compile-time classpath
183193
* jars that were provided by direct dependencies. When strictJavaDeps is OFF, there is no need
@@ -272,7 +282,8 @@ public JavaTargetAttributes build() {
272282
compileTimeDependencyArtifacts.build(),
273283
targetLabel,
274284
injectingRuleKind,
275-
strictJavaDeps);
285+
strictJavaDeps,
286+
unusedDepsMode);
276287
}
277288

278289
// TODO(bazel-team): delete the following method - users should use the built
@@ -314,6 +325,7 @@ public boolean hasSourceFiles() {
314325
@Nullable private final String injectingRuleKind;
315326

316327
private final DepsCheckingMode strictJavaDeps;
328+
private final DepsCheckingMode unusedDepsMode;
317329

318330
/** Constructor of JavaTargetAttributes. */
319331
private JavaTargetAttributes(
@@ -332,7 +344,8 @@ private JavaTargetAttributes(
332344
NestedSet<Artifact> compileTimeDependencyArtifacts,
333345
Label targetLabel,
334346
@Nullable String injectingRuleKind,
335-
DepsCheckingMode strictJavaDeps) {
347+
DepsCheckingMode strictJavaDeps,
348+
DepsCheckingMode unusedDepsMode) {
336349
this.sourceFiles = sourceFiles;
337350
this.directJars = directJars;
338351
this.headerCompilationDirectJars = headerCompilationDirectJars;
@@ -349,6 +362,7 @@ private JavaTargetAttributes(
349362
this.targetLabel = targetLabel;
350363
this.injectingRuleKind = injectingRuleKind;
351364
this.strictJavaDeps = strictJavaDeps;
365+
this.unusedDepsMode = unusedDepsMode;
352366
}
353367

354368
JavaTargetAttributes appendAdditionalTransitiveClassPathEntries(
@@ -373,7 +387,8 @@ JavaTargetAttributes appendAdditionalTransitiveClassPathEntries(
373387
compileTimeDependencyArtifacts,
374388
targetLabel,
375389
injectingRuleKind,
376-
strictJavaDeps);
390+
strictJavaDeps,
391+
unusedDepsMode);
377392
}
378393

379394
public NestedSet<Artifact> getDirectJars() {
@@ -440,4 +455,9 @@ public String getInjectingRuleKind() {
440455
public DepsCheckingMode getStrictJavaDeps() {
441456
return strictJavaDeps;
442457
}
458+
459+
/** Returns the unused dependency checking mode. */
460+
public DepsCheckingMode getUnusedDepsMode() {
461+
return unusedDepsMode;
462+
}
443463
}

src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,7 @@ void createHeaderCompilationAction(
524524
@Param(name = "enable_direct_classpath", defaultValue = "True", named = true),
525525
@Param(name = "additional_inputs", defaultValue = "[]", named = true),
526526
@Param(name = "additional_outputs", defaultValue = "[]", named = true),
527+
@Param(name = "unused_deps_mode", defaultValue = "\"default\"", named = true),
527528
})
528529
void createCompilationAction(
529530
StarlarkRuleContextT ctx,
@@ -553,7 +554,8 @@ void createCompilationAction(
553554
boolean enableJSpecify,
554555
boolean enableDirectClasspath,
555556
Sequence<?> additionalInputs,
556-
Sequence<?> additionalOutputs)
557+
Sequence<?> additionalOutputs,
558+
String unusedDepsMode)
557559
throws EvalException,
558560
TypeException,
559561
RuleErrorException,

src/test/java/com/google/devtools/build/lib/rules/java/JavaCompileActionBuilderTest.java

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,5 +440,101 @@ public void testTargetDeclaredDepsPropagated() throws Exception {
440440
assertThat(targetDeclaredDepsIndex).isNotEqualTo(-1);
441441
assertThat(command.get(targetDeclaredDepsIndex + 1)).endsWith(":b");
442442
}
443+
444+
@Test
445+
public void testUnusedDepsMode_attributeError() throws Exception {
446+
useConfiguration("--experimental_unused_deps=off");
447+
scratch.file(
448+
"java/com/google/test/BUILD",
449+
"""
450+
load("@rules_java//java:defs.bzl", "java_library")
451+
java_library(
452+
name = "a",
453+
srcs = ["A.java"],
454+
unused_deps_mode = "error",
455+
)
456+
""");
457+
JavaCompileAction action =
458+
(JavaCompileAction) getGeneratingActionForLabel("//java/com/google/test:liba.jar");
459+
assertThat(JavaCompileActionTestHelper.getUnusedDepsMode(action))
460+
.isEqualTo(DepsCheckingMode.ERROR);
461+
}
462+
463+
@Test
464+
public void testUnusedDepsMode_attributeWarn() throws Exception {
465+
useConfiguration("--experimental_unused_deps=off");
466+
scratch.file(
467+
"java/com/google/test/BUILD",
468+
"""
469+
load("@rules_java//java:defs.bzl", "java_library")
470+
java_library(
471+
name = "a",
472+
srcs = ["A.java"],
473+
unused_deps_mode = "warn",
474+
)
475+
""");
476+
JavaCompileAction action =
477+
(JavaCompileAction) getGeneratingActionForLabel("//java/com/google/test:liba.jar");
478+
assertThat(JavaCompileActionTestHelper.getUnusedDepsMode(action))
479+
.isEqualTo(DepsCheckingMode.WARN);
480+
}
481+
482+
@Test
483+
public void testUnusedDepsMode_attributeOff() throws Exception {
484+
useConfiguration("--experimental_unused_deps=error");
485+
scratch.file(
486+
"java/com/google/test/BUILD",
487+
"""
488+
load("@rules_java//java:defs.bzl", "java_library")
489+
java_library(
490+
name = "a",
491+
srcs = ["A.java"],
492+
unused_deps_mode = "off",
493+
)
494+
""");
495+
JavaCompileAction action =
496+
(JavaCompileAction) getGeneratingActionForLabel("//java/com/google/test:liba.jar");
497+
assertThat(JavaCompileActionTestHelper.getUnusedDepsMode(action))
498+
.isEqualTo(DepsCheckingMode.OFF);
499+
}
500+
501+
@Test
502+
public void testUnusedDepsMode_attributeDefault() throws Exception {
503+
useConfiguration("--experimental_unused_deps=error");
504+
scratch.file(
505+
"java/com/google/test/BUILD",
506+
"""
507+
load("@rules_java//java:defs.bzl", "java_library")
508+
java_library(
509+
name = "a",
510+
srcs = ["A.java"],
511+
unused_deps_mode = "default",
512+
)
513+
""");
514+
JavaCompileAction action =
515+
(JavaCompileAction) getGeneratingActionForLabel("//java/com/google/test:liba.jar");
516+
assertThat(JavaCompileActionTestHelper.getUnusedDepsMode(action))
517+
.isEqualTo(DepsCheckingMode.ERROR);
518+
}
519+
520+
@Test
521+
public void testUnusedDepsMode_attributePriorityOverTags() throws Exception {
522+
useConfiguration("--experimental_unused_deps=off");
523+
scratch.file(
524+
"java/com/google/test/BUILD",
525+
"""
526+
load("@rules_java//java:defs.bzl", "java_library")
527+
java_library(
528+
name = "a",
529+
srcs = ["A.java"],
530+
tags = ["unused-deps:off"],
531+
unused_deps_mode = "error",
532+
)
533+
""");
534+
JavaCompileAction action =
535+
(JavaCompileAction) getGeneratingActionForLabel("//java/com/google/test:liba.jar");
536+
assertThat(JavaCompileActionTestHelper.getUnusedDepsMode(action))
537+
.isEqualTo(DepsCheckingMode.ERROR);
538+
}
443539
}
444540

src/test/shell/bazel/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ sh_library(
5757
"//tools:srcs",
5858
"@bazel_skylib//:test_deps",
5959
"@rules_java//toolchains:current_java_runtime",
60+
"@rules_java//:distribution",
6061
],
6162
data = [
6263
"//src/test/shell/bazel/testdata:exec_wasm",

0 commit comments

Comments
 (0)