Add --incompatible_disallow_legacy_java_provider flag. RELNOTES: None. PiperOrigin-RevId: 228660460
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java index 09d9d48..4f35a69 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java +++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
@@ -286,6 +286,18 @@ public boolean incompatibleDisallowFileType; @Option( + name = "incompatible_disallow_legacy_java_provider", + defaultValue = "false", + documentationCategory = OptionDocumentationCategory.SKYLARK_SEMANTICS, + effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS}, + metadataTags = { + OptionMetadataTag.INCOMPATIBLE_CHANGE, + OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES + }, + help = "If set to true, usages of old .java provider are disallowed.") + public boolean incompatibleDisallowLegacyJavaProvider; + + @Option( name = "incompatible_disallow_legacy_javainfo", defaultValue = "false", documentationCategory = OptionDocumentationCategory.SKYLARK_SEMANTICS, @@ -546,6 +558,7 @@ .incompatibleDisallowDictPlus(incompatibleDisallowDictPlus) .incompatibleDisallowFileType(incompatibleDisallowFileType) .incompatibleDisallowLegacyJavaInfo(incompatibleDisallowLegacyJavaInfo) + .incompatibleDisallowLegacyJavaProvider(incompatibleDisallowLegacyJavaProvider) .incompatibleDisallowLoadLabelsToCrossPackageBoundaries( incompatibleDisallowLoadLabelsToCrossPackageBoundaries) .incompatibleDisallowOldStyleArgsAdd(incompatibleDisallowOldStyleArgsAdd)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java index 51bdea5..f6ff009 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
@@ -22,9 +22,12 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skylarkbuildapi.java.JavaSkylarkApiProviderApi; +import com.google.devtools.build.lib.syntax.EvalException; +import com.google.devtools.build.lib.syntax.SkylarkSemantics; import javax.annotation.Nullable; /** @@ -69,7 +72,9 @@ } @Override - public NestedSet<Artifact> getSourceJars() { + public NestedSet<Artifact> getSourceJars(Location location, SkylarkSemantics semantics) + throws EvalException { + checkLegacyJavaProviderFlag(location, semantics); JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class); if (sourceJarsProvider == null) { return NestedSetBuilder.emptySet(Order.STABLE_ORDER); @@ -78,7 +83,9 @@ } @Override - public NestedSet<Artifact> getTransitiveDeps() { + public NestedSet<Artifact> getTransitiveDeps(Location location, SkylarkSemantics semantics) + throws EvalException { + checkLegacyJavaProviderFlag(location, semantics); JavaCompilationArgsProvider compilationArgsProvider = getProvider(JavaCompilationArgsProvider.class); if (compilationArgsProvider == null) { @@ -88,7 +95,9 @@ } @Override - public NestedSet<Artifact> getTransitiveRuntimeDeps() { + public NestedSet<Artifact> getTransitiveRuntimeDeps(Location location, SkylarkSemantics semantics) + throws EvalException { + checkLegacyJavaProviderFlag(location, semantics); JavaCompilationArgsProvider compilationArgsProvider = getProvider(JavaCompilationArgsProvider.class); if (compilationArgsProvider == null) { @@ -98,7 +107,9 @@ } @Override - public NestedSet<Artifact> getTransitiveSourceJars() { + public NestedSet<Artifact> getTransitiveSourceJars(Location location, SkylarkSemantics semantics) + throws EvalException { + checkLegacyJavaProviderFlag(location, semantics); JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class); if (sourceJarsProvider == null) { return NestedSetBuilder.emptySet(Order.STABLE_ORDER); @@ -107,12 +118,16 @@ } @Override - public JavaRuleOutputJarsProvider getOutputJars() { + public JavaRuleOutputJarsProvider getOutputJars(Location location, SkylarkSemantics semantics) + throws EvalException { + checkLegacyJavaProviderFlag(location, semantics); return getProvider(JavaRuleOutputJarsProvider.class); } @Override - public NestedSet<Label> getTransitiveExports() { + public NestedSet<Label> getTransitiveExports(Location location, SkylarkSemantics semantics) + throws EvalException { + checkLegacyJavaProviderFlag(location, semantics); JavaExportsProvider exportsProvider = getProvider(JavaExportsProvider.class); if (exportsProvider != null) { return exportsProvider.getTransitiveExports(); @@ -122,12 +137,27 @@ } @Override - public JavaGenJarsProvider getGenJarsProvider() { + public JavaGenJarsProvider getGenJarsProvider(Location location, SkylarkSemantics semantics) + throws EvalException { + checkLegacyJavaProviderFlag(location, semantics); return getProvider(JavaGenJarsProvider.class); } @Override - public JavaCompilationInfoProvider getCompilationInfoProvider() { + public JavaCompilationInfoProvider getCompilationInfoProvider( + Location location, SkylarkSemantics semantics) throws EvalException { + checkLegacyJavaProviderFlag(location, semantics); return getProvider(JavaCompilationInfoProvider.class); } + + private void checkLegacyJavaProviderFlag(Location location, SkylarkSemantics semantics) + throws EvalException { + if (semantics.incompatibleDisallowLegacyJavaProvider()) { + throw new EvalException( + location, + "The .java provider is deprecated and cannot be used " + + "when --incompatible_disallow_legacy_java_provider is set. " + + "Please migrate to the JavaInfo Skylark provider."); + } + } }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java index 6afac7e..b47b29c 100644 --- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java
@@ -16,10 +16,13 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.skylarkbuildapi.FileApi; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; +import com.google.devtools.build.lib.syntax.EvalException; +import com.google.devtools.build.lib.syntax.SkylarkSemantics; /** * Provides access to information about Java rules. Every Java-related target provides @@ -37,62 +40,78 @@ public interface JavaSkylarkApiProviderApi<FileT extends FileApi> { @SkylarkCallable( - name = "source_jars", - doc = "Returns the Jars containing Java source files for the target.", - structField = true - ) - public NestedSet<FileT> getSourceJars(); + name = "source_jars", + doc = "Returns the Jars containing Java source files for the target.", + useSkylarkSemantics = true, + useLocation = true, + structField = true) + public NestedSet<FileT> getSourceJars(Location location, SkylarkSemantics semantics) + throws EvalException; @SkylarkCallable( - name = "transitive_deps", - doc = "Returns the transitive set of Jars required to build the target.", - structField = true - ) - public NestedSet<FileT> getTransitiveDeps(); + name = "transitive_deps", + doc = "Returns the transitive set of Jars required to build the target.", + useSkylarkSemantics = true, + useLocation = true, + structField = true) + public NestedSet<FileT> getTransitiveDeps(Location location, SkylarkSemantics semantics) + throws EvalException; @SkylarkCallable( - name = "transitive_runtime_deps", - doc = "Returns the transitive set of Jars required on the target's runtime classpath.", - structField = true - ) - public NestedSet<FileT> getTransitiveRuntimeDeps(); + name = "transitive_runtime_deps", + doc = "Returns the transitive set of Jars required on the target's runtime classpath.", + useSkylarkSemantics = true, + useLocation = true, + structField = true) + public NestedSet<FileT> getTransitiveRuntimeDeps(Location location, SkylarkSemantics semantics) + throws EvalException; @SkylarkCallable( - name = "transitive_source_jars", - doc = - "Returns the Jars containing Java source files for the target and all of its transitive " - + "dependencies.", - structField = true - ) - public NestedSet<FileT> getTransitiveSourceJars(); + name = "transitive_source_jars", + doc = + "Returns the Jars containing Java source files for the target and all of its transitive " + + "dependencies.", + useSkylarkSemantics = true, + useLocation = true, + structField = true) + public NestedSet<FileT> getTransitiveSourceJars(Location location, SkylarkSemantics semantics) + throws EvalException; @SkylarkCallable( - name = "outputs", - doc = "Returns information about outputs of this Java target.", - structField = true - ) - public JavaRuleOutputJarsProviderApi<?> getOutputJars(); + name = "outputs", + doc = "Returns information about outputs of this Java target.", + useSkylarkSemantics = true, + useLocation = true, + structField = true) + public JavaRuleOutputJarsProviderApi<?> getOutputJars( + Location location, SkylarkSemantics semantics) throws EvalException; @SkylarkCallable( - name = "transitive_exports", - structField = true, - doc = "Returns transitive set of labels that are being exported from this rule." - ) - public NestedSet<Label> getTransitiveExports(); + name = "transitive_exports", + structField = true, + useSkylarkSemantics = true, + useLocation = true, + doc = "Returns transitive set of labels that are being exported from this rule.") + public NestedSet<Label> getTransitiveExports(Location location, SkylarkSemantics semantics) + throws EvalException; @SkylarkCallable( - name = "annotation_processing", - structField = true, - allowReturnNones = true, - doc = "Returns information about annotation processing for this Java target." - ) - public JavaAnnotationProcessingApi<?> getGenJarsProvider(); + name = "annotation_processing", + structField = true, + allowReturnNones = true, + useSkylarkSemantics = true, + useLocation = true, + doc = "Returns information about annotation processing for this Java target.") + public JavaAnnotationProcessingApi<?> getGenJarsProvider( + Location location, SkylarkSemantics semantics) throws EvalException; @SkylarkCallable( - name = "compilation_info", - structField = true, - allowReturnNones = true, - doc = "Returns compilation information for this Java target." - ) - public JavaCompilationInfoProviderApi<?> getCompilationInfoProvider(); + name = "compilation_info", + structField = true, + allowReturnNones = true, + useSkylarkSemantics = true, + useLocation = true, + doc = "Returns compilation information for this Java target.") + public JavaCompilationInfoProviderApi<?> getCompilationInfoProvider( + Location location, SkylarkSemantics semantics) throws EvalException; }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java index 86c6565..6f9b309 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
@@ -152,6 +152,8 @@ public abstract boolean incompatibleDisallowFileType(); + public abstract boolean incompatibleDisallowLegacyJavaProvider(); + public abstract boolean incompatibleDisallowLegacyJavaInfo(); public abstract boolean incompatibleDisallowLoadLabelsToCrossPackageBoundaries(); @@ -221,6 +223,7 @@ .incompatibleDisallowDataTransition(false) .incompatibleDisallowDictPlus(false) .incompatibleDisallowFileType(false) + .incompatibleDisallowLegacyJavaProvider(false) .incompatibleDisallowLegacyJavaInfo(false) .incompatibleDisallowLoadLabelsToCrossPackageBoundaries(false) .incompatibleDisallowOldStyleArgsAdd(false) @@ -284,6 +287,8 @@ public abstract Builder incompatibleDisallowFileType(boolean value); + public abstract Builder incompatibleDisallowLegacyJavaProvider(boolean value); + public abstract Builder incompatibleDisallowLegacyJavaInfo(boolean value); public abstract Builder incompatibleDisallowLoadLabelsToCrossPackageBoundaries(boolean value);
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java index 7be8fb2..08bde63 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java +++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
@@ -143,6 +143,7 @@ "--incompatible_disallow_dict_plus=" + rand.nextBoolean(), "--incompatible_disallow_filetype=" + rand.nextBoolean(), "--incompatible_disallow_legacy_javainfo=" + rand.nextBoolean(), + "--incompatible_disallow_legacy_java_provider=" + rand.nextBoolean(), "--incompatible_disallow_load_labels_to_cross_package_boundaries=" + rand.nextBoolean(), "--incompatible_disallow_old_style_args_add=" + rand.nextBoolean(), "--incompatible_disallow_slash_operator=" + rand.nextBoolean(), @@ -190,6 +191,7 @@ .incompatibleDisallowDictPlus(rand.nextBoolean()) .incompatibleDisallowFileType(rand.nextBoolean()) .incompatibleDisallowLegacyJavaInfo(rand.nextBoolean()) + .incompatibleDisallowLegacyJavaProvider(rand.nextBoolean()) .incompatibleDisallowLoadLabelsToCrossPackageBoundaries(rand.nextBoolean()) .incompatibleDisallowOldStyleArgsAdd(rand.nextBoolean()) .incompatibleDisallowSlashOperator(rand.nextBoolean())
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java index 4464f35..be6e8ba 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
@@ -2105,4 +2105,29 @@ assertThat(output.getClassJar().getFilename()).isEqualTo("libc.jar"); assertThat(output.getIJar()).isNull(); } + + @Test + public void testDisallowLegacyJavaProvider() throws Exception { + setSkylarkSemanticsOptions("--incompatible_disallow_legacy_java_provider"); + scratch.file( + "foo/custom_rule.bzl", + "def _impl(ctx):", + " ctx.attr.java_lib.java.source_jars", + "java_custom_library = rule(", + " implementation = _impl,", + " attrs = {", + " 'java_lib': attr.label(),", + " },", + ")"); + + scratch.file( + "foo/BUILD", + "load(':custom_rule.bzl', 'java_custom_library')", + "java_library(name = 'java_lib', srcs = ['java/A.java'])", + "java_custom_library(name = 'custom_lib', java_lib = ':java_lib')"); + checkError( + "//foo:custom_lib", + "The .java provider is deprecated and cannot be used " + + "when --incompatible_disallow_legacy_java_provider is set."); + } }