Add --experimental_fix_deps_tool flag to Bazel
RELNOTES: None
PiperOrigin-RevId: 187936071
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
index a4eb03e..d47fe0d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
@@ -68,6 +68,7 @@
private final JavaSemantics semantics;
private final ImmutableList<Artifact> additionalJavaBaseInputs;
private final StrictDepsMode strictJavaDeps;
+ private final String fixDepsTool;
private static final String DEFAULT_ATTRIBUTES_SUFFIX = "";
private static final PathFragment JAVAC = PathFragment.create("_javac");
@@ -91,6 +92,7 @@
this.strictJavaDeps = disableStrictDeps
? StrictDepsMode.OFF
: getJavaConfiguration().getFilteredStrictJavaDeps();
+ this.fixDepsTool = getJavaConfiguration().getFixDepsTool();
}
public JavaCompilationHelper(RuleContext ruleContext, JavaSemantics semantics,
@@ -226,6 +228,7 @@
builder.setProcessorPaths(attributes.getProcessorPath());
builder.addProcessorNames(attributes.getProcessorNames());
builder.setStrictJavaDeps(attributes.getStrictJavaDeps());
+ builder.setFixDepsTool(getJavaConfiguration().getFixDepsTool());
builder.setDirectJars(attributes.getDirectJars());
builder.setCompileTimeDependencyArtifacts(attributes.getCompileTimeDependencyArtifacts());
builder.setTargetLabel(
@@ -755,6 +758,11 @@
return strictJavaDeps;
}
+ /** Determines which tool to use when fixing dependency errors. */
+ public String getFixDepsTool() {
+ return fixDepsTool;
+ }
+
/**
* Gets the value of the "javacopts" attribute combining them with the
* default options. If the current rule has no javacopts attribute, this
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
index 9846e0f..1c02c96 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
@@ -137,6 +137,9 @@
*/
private final BuildConfiguration.StrictDepsMode strictJavaDeps;
+ /** The tool with which to fix dependency errors. */
+ private final String fixDepsTool;
+
/** The set of .jdeps artifacts provided by direct dependencies. */
private final NestedSet<Artifact> compileTimeDependencyArtifacts;
@@ -164,6 +167,7 @@
* @param directJars the subset of classpath jars provided by direct dependencies
* @param executionInfo the execution info
* @param strictJavaDeps the Strict Java Deps mode
+ * @param fixDepsTool the tool with which to fix dependency errors
* @param compileTimeDependencyArtifacts the jdeps files for direct dependencies
* @param progressMessage the progress message
*/
@@ -190,6 +194,7 @@
NestedSet<Artifact> directJars,
Map<String, String> executionInfo,
StrictDepsMode strictJavaDeps,
+ String fixDepsTool,
NestedSet<Artifact> compileTimeDependencyArtifacts,
CharSequence progressMessage,
RunfilesSupplier runfilesSupplier) {
@@ -225,6 +230,7 @@
this.javacOpts = ImmutableList.copyOf(javacOpts);
this.directJars = checkNotNull(directJars, "directJars must not be null");
this.strictJavaDeps = strictJavaDeps;
+ this.fixDepsTool = checkNotNull(fixDepsTool);
this.compileTimeDependencyArtifacts = compileTimeDependencyArtifacts;
}
@@ -296,6 +302,10 @@
return strictJavaDeps;
}
+ public String getFixDepsTool() {
+ return fixDepsTool;
+ }
+
public PathFragment getClassDirectory() {
return classDirectory;
}
@@ -422,6 +432,7 @@
private final Collection<Artifact> sourceJars = new ArrayList<>();
private BuildConfiguration.StrictDepsMode strictJavaDeps =
BuildConfiguration.StrictDepsMode.OFF;
+ private String fixDepsTool = "add_dep";
private NestedSet<Artifact> directJars = NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER);
private NestedSet<Artifact> compileTimeDependencyArtifacts =
NestedSetBuilder.emptySet(Order.STABLE_ORDER);
@@ -557,7 +568,6 @@
owner, artifactForExperimentalCoverage, sourceFiles, false));
}
-
NestedSet<Artifact> tools =
NestedSetBuilder.<Artifact>stableOrder()
.add(langtoolsJar)
@@ -605,6 +615,7 @@
directJars,
executionInfo,
strictJavaDeps,
+ fixDepsTool,
compileTimeDependencyArtifacts,
getProgressMessage(),
javaBuilder.getRunfilesSupplier());
@@ -699,6 +710,7 @@
}
}
}
+ result.add("--experimental_fix_deps_tool", fixDepsTool);
// Chose what artifact to pass to JavaBuilder, as input to jacoco instrumentation processor.
// metadata should be null when --experimental_java_coverage is true.
@@ -844,6 +856,12 @@
return this;
}
+ /** Sets the tool with which to fix dependency errors. */
+ public Builder setFixDepsTool(String depsTool) {
+ fixDepsTool = depsTool;
+ return this;
+ }
+
/** Accumulates the given jar artifacts as being provided by direct dependencies. */
public Builder setDirectJars(NestedSet<Artifact> directJars) {
this.directJars = checkNotNull(directJars, "directJars must not be null");
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java
index 2d1eb2e..026df11 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java
@@ -156,6 +156,7 @@
private final ImmutableList<String> defaultJvmFlags;
private final ImmutableList<String> checkedConstraints;
private final StrictDepsMode strictJavaDeps;
+ private final String fixDepsTool;
private final Label proguardBinary;
private final ImmutableList<Label> extraProguardSpecs;
private final TriState bundleTranslations;
@@ -187,6 +188,7 @@
this.defaultJvmFlags = ImmutableList.copyOf(javaOptions.jvmOpts);
this.checkedConstraints = ImmutableList.copyOf(javaOptions.checkedConstraints);
this.strictJavaDeps = javaOptions.strictJavaDeps;
+ this.fixDepsTool = javaOptions.fixDepsTool;
this.proguardBinary = javaOptions.proguard;
this.extraProguardSpecs = ImmutableList.copyOf(javaOptions.extraProguardSpecs);
this.bundleTranslations = javaOptions.bundleTranslations;
@@ -242,6 +244,7 @@
ImmutableList<String> defaultJvmFlags,
ImmutableList<String> checkedConstraints,
StrictDepsMode strictJavaDeps,
+ String fixDepsTool,
Label proguardBinary,
ImmutableList<Label> extraProguardSpecs,
TriState bundleTranslations,
@@ -269,6 +272,7 @@
this.defaultJvmFlags = defaultJvmFlags;
this.checkedConstraints = checkedConstraints;
this.strictJavaDeps = strictJavaDeps;
+ this.fixDepsTool = fixDepsTool;
this.proguardBinary = proguardBinary;
this.extraProguardSpecs = extraProguardSpecs;
this.bundleTranslations = bundleTranslations;
@@ -376,6 +380,11 @@
}
}
+ /** Which tool to use for fixing dependency errors. */
+ public String getFixDepsTool() {
+ return fixDepsTool;
+ }
+
/**
* @return proper label only if --java_launcher= is specified, otherwise null.
*/
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
index 3e9484d..58be271 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
@@ -240,6 +240,15 @@
)
public StrictDepsMode strictJavaDeps;
+ @Option(
+ name = "experimental_fix_deps_tool",
+ defaultValue = "add_dep",
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS},
+ help = "Specifies which tool should be used to resolve missing dependencies."
+ )
+ public String fixDepsTool;
+
// TODO(bazel-team): This flag should ideally default to true (and eventually removed). We have
// been accidentally supplying JUnit and Hamcrest deps to java_test targets indirectly via the
// BazelTestRunner, and setting this flag to true fixes that behaviour.
@@ -558,6 +567,7 @@
host.javaClasspath = javaClasspath;
host.strictJavaDeps = strictJavaDeps;
+ host.fixDepsTool = fixDepsTool;
host.enforceOneVersion = enforceOneVersion;
// java_test targets can be used as a host tool, Ex: as a validating tool on a genrule.
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
index 814a46f..1b5a01c 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
@@ -2830,6 +2830,56 @@
}
@Test
+ public void testFixDepsToolFlag() throws Exception {
+ useConfiguration("--experimental_fix_deps_tool=autofixer");
+
+ scratch.file("java/foo/A.java", "foo");
+ scratch.file(
+ "java/foo/BUILD",
+ "android_binary(name = 'a', manifest = 'AndroidManifest.xml', ",
+ " srcs = ['A.java'])");
+
+ Iterable<String> commandLine =
+ ((JavaCompileAction)
+ actionsTestUtil()
+ .getActionForArtifactEndingWith(
+ actionsTestUtil()
+ .artifactClosureOf(
+ getGeneratingAction(
+ getFileConfiguredTarget("//java/foo:a_deploy.jar")
+ .getArtifact())
+ .getInputs()),
+ "liba.jar"))
+ .buildCommandLine();
+
+ assertThat(commandLine).containsAllOf("--experimental_fix_deps_tool", "autofixer").inOrder();
+ }
+
+ @Test
+ public void testFixDepsToolFlagEmpty() throws Exception {
+ scratch.file("java/foo/A.java", "foo");
+ scratch.file(
+ "java/foo/BUILD",
+ "android_binary(name = 'a', manifest = 'AndroidManifest.xml', ",
+ " srcs = ['A.java'])");
+
+ Iterable<String> commandLine =
+ ((JavaCompileAction)
+ actionsTestUtil()
+ .getActionForArtifactEndingWith(
+ actionsTestUtil()
+ .artifactClosureOf(
+ getGeneratingAction(
+ getFileConfiguredTarget("//java/foo:a_deploy.jar")
+ .getArtifact())
+ .getInputs()),
+ "liba.jar"))
+ .buildCommandLine();
+
+ assertThat(commandLine).containsAllOf("--experimental_fix_deps_tool", "add_dep").inOrder();
+ }
+
+ @Test
public void testAndroidBinaryExportsJavaCompilationArgsProvider() throws Exception {
scratch.file("java/foo/A.java", "foo");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
index 18079f7..d99b56d 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
@@ -211,6 +211,25 @@
}
@Test
+ public void testFixDepsToolEmpty() throws Exception {
+ scratch.file("java/android/BUILD", "android_library(name = 'b', srcs = ['B.java'])");
+ List<String> commandLine =
+ getGeneratingSpawnActionArgs(
+ getFileConfiguredTarget("//java/android:libb.jar").getArtifact());
+ assertThat(commandLine).containsAllOf("--experimental_fix_deps_tool", "add_dep").inOrder();
+ }
+
+ @Test
+ public void testFixDepsTool() throws Exception {
+ useConfiguration("--experimental_fix_deps_tool=auto_fixer");
+ scratch.file("java/android/BUILD", "android_library(name = 'b', srcs = ['B.java'])");
+ List<String> commandLine =
+ getGeneratingSpawnActionArgs(
+ getFileConfiguredTarget("//java/android:libb.jar").getArtifact());
+ assertThat(commandLine).containsAllOf("--experimental_fix_deps_tool", "auto_fixer").inOrder();
+ }
+
+ @Test
public void testJavaPluginProcessorPath() throws Exception {
scratch.file("java/test/BUILD",
"java_library(name = 'plugin_dep',",