Automated rollback of commit 7acffaf50c027e38571f64a30b4dd84084d2d8e6.
*** Reason for rollback ***
Breaks internal targets.
PiperOrigin-RevId: 266288093
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java
index 84e2a76..bda0b7e 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java
@@ -47,18 +47,6 @@
/** This is where deprecated options go to die. */
public static class GraveyardOptions extends OptionsBase {
@Option(
- name = "incompatible_disallow_legacy_java_provider",
- defaultValue = "true",
- documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
- effectTags = {OptionEffectTag.NO_OP},
- metadataTags = {
- OptionMetadataTag.INCOMPATIBLE_CHANGE,
- OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
- },
- help = "Deprecated. No-op.")
- public boolean incompatibleDisallowLegacyJavaProvider;
-
- @Option(
name = "incompatible_disable_legacy_proto_provider",
defaultValue = "true",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
index e3bdb33..adaf336 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
@@ -321,6 +321,18 @@
public boolean incompatibleDisallowHashingFrozenMutables;
@Option(
+ name = "incompatible_disallow_legacy_java_provider",
+ defaultValue = "true",
+ documentationCategory = OptionDocumentationCategory.STARLARK_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 = "true",
documentationCategory = OptionDocumentationCategory.STARLARK_SEMANTICS,
@@ -662,6 +674,7 @@
.incompatibleDisableDepsetItems(incompatibleDisableDepsetItems)
.incompatibleDisallowDictPlus(incompatibleDisallowDictPlus)
.incompatibleDisallowEmptyGlob(incompatibleDisallowEmptyGlob)
+ .incompatibleDisallowLegacyJavaProvider(incompatibleDisallowLegacyJavaProvider)
.incompatibleDisallowOldStyleArgsAdd(incompatibleDisallowOldStyleArgsAdd)
.incompatibleDisallowStructProviderSyntax(incompatibleDisallowStructProviderSyntax)
.incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
index 402cf80..8d2ff78 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
@@ -43,6 +43,7 @@
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaRuntimeInfo;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaToolchainProvider;
@@ -236,6 +237,8 @@
ruleBuilder
.setFilesToBuild(filesToBuild)
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY)
.addNativeDeclaredProvider(
new AndroidNativeLibsInfo(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index 6dbb2e0..929e281 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -64,6 +64,7 @@
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;
import com.google.devtools.build.lib.rules.java.JavaUtil;
@@ -742,6 +743,8 @@
return builder
.setFilesToBuild(filesToBuild)
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.addNativeDeclaredProvider(javaInfo)
.addProvider(RunfilesProvider.class, RunfilesProvider.simple(getRunfiles()))
.addNativeDeclaredProvider(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
index 87ea160..8614bf1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
@@ -58,6 +58,7 @@
import com.google.devtools.build.lib.rules.java.JavaRuntimeClasspathProvider;
import com.google.devtools.build.lib.rules.java.JavaRuntimeInfo;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;
@@ -370,6 +371,8 @@
return builder
.setFilesToBuild(filesToBuild)
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.addNativeDeclaredProvider(javaInfo)
.addProvider(
RunfilesProvider.class,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/BUILD b/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
index d2b6b07..1c47f8f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
@@ -109,6 +109,7 @@
"JavaRunfilesProvider.java",
"JavaRuntimeInfo.java",
"JavaSemantics.java",
+ "JavaSkylarkApiProvider.java",
"JavaSkylarkCommon.java",
"JavaSourceInfoProvider.java",
"JavaSourceJarsProvider.java",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
index b259030..de9adbf 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
@@ -476,6 +476,8 @@
return builder
.setFilesToBuild(filesToBuild)
.addNativeDeclaredProvider(javaInfo)
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.add(RunfilesProvider.class, runfilesProvider)
// The executable to run (below) may be different from the executable for runfiles (the one
// we create the runfiles support object with). On Linux they are the same (it's the same
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
index b63b96e..7e39c09 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
@@ -152,6 +152,8 @@
return ruleBuilder
.setFilesToBuild(filesToBuild)
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.addNativeDeclaredProvider(javaInfo)
.add(RunfilesProvider.class, RunfilesProvider.simple(runfiles))
.add(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
index 5322c1e..ecdb68c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
@@ -207,6 +207,8 @@
.build();
builder
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.addProvider(
RunfilesProvider.simple(
JavaCommon.getRunfiles(ruleContext, semantics, javaArtifacts, neverLink)))
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
new file mode 100644
index 0000000..a6f467f
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
@@ -0,0 +1,163 @@
+// Copyright 2015 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// 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.
+
+package com.google.devtools.build.lib.rules.java;
+
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
+import com.google.devtools.build.lib.analysis.skylark.SkylarkApiProvider;
+import com.google.devtools.build.lib.cmdline.Label;
+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.StarlarkSemantics;
+import javax.annotation.Nullable;
+
+/**
+ * A class that exposes the Java providers to Skylark. It is intended to provide a simple and stable
+ * interface for Skylark users.
+ */
+@AutoCodec
+public final class JavaSkylarkApiProvider extends SkylarkApiProvider
+ implements JavaSkylarkApiProviderApi<Artifact> {
+ /** The name of the field in Skylark used to access this class. */
+ public static final String NAME = "java";
+ /** The name of the field in Skylark proto aspects used to access this class. */
+ public static final SkylarkProviderIdentifier SKYLARK_NAME =
+ SkylarkProviderIdentifier.forLegacy(NAME);
+
+ @Nullable private final TransitiveInfoProviderMap transitiveInfoProviderMap;
+
+ /**
+ * Creates a Skylark API provider that reads information from its associated target's providers.
+ */
+ public static JavaSkylarkApiProvider fromRuleContext() {
+ return new JavaSkylarkApiProvider(null);
+ }
+
+ /** Creates a Skylark API provider that reads information from an explicit provider map. */
+ @AutoCodec.Instantiator
+ public static JavaSkylarkApiProvider fromProviderMap(
+ TransitiveInfoProviderMap transitiveInfoProviderMap) {
+ return new JavaSkylarkApiProvider(transitiveInfoProviderMap);
+ }
+
+ private JavaSkylarkApiProvider(TransitiveInfoProviderMap transitiveInfoProviderMap) {
+ this.transitiveInfoProviderMap = transitiveInfoProviderMap;
+ }
+
+ @Nullable
+ private <P extends TransitiveInfoProvider> P getProvider(Class<P> provider) {
+ if (transitiveInfoProviderMap != null) {
+ return JavaInfo.getProvider(provider, transitiveInfoProviderMap);
+ }
+ return JavaInfo.getProvider(provider, getInfo());
+ }
+
+ @Override
+ public NestedSet<Artifact> getSourceJars(Location location, StarlarkSemantics semantics)
+ throws EvalException {
+ checkLegacyJavaProviderFlag(location, semantics);
+ JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class);
+ if (sourceJarsProvider == null) {
+ return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+ }
+ return NestedSetBuilder.wrap(Order.STABLE_ORDER, sourceJarsProvider.getSourceJars());
+ }
+
+ @Override
+ public NestedSet<Artifact> getTransitiveDeps(Location location, StarlarkSemantics semantics)
+ throws EvalException {
+ checkLegacyJavaProviderFlag(location, semantics);
+ JavaCompilationArgsProvider compilationArgsProvider =
+ getProvider(JavaCompilationArgsProvider.class);
+ if (compilationArgsProvider == null) {
+ return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+ }
+ return compilationArgsProvider.getTransitiveCompileTimeJars();
+ }
+
+ @Override
+ public NestedSet<Artifact> getTransitiveRuntimeDeps(
+ Location location, StarlarkSemantics semantics) throws EvalException {
+ checkLegacyJavaProviderFlag(location, semantics);
+ JavaCompilationArgsProvider compilationArgsProvider =
+ getProvider(JavaCompilationArgsProvider.class);
+ if (compilationArgsProvider == null) {
+ return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+ }
+ return compilationArgsProvider.getRuntimeJars();
+ }
+
+ @Override
+ public NestedSet<Artifact> getTransitiveSourceJars(Location location, StarlarkSemantics semantics)
+ throws EvalException {
+ checkLegacyJavaProviderFlag(location, semantics);
+ JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class);
+ if (sourceJarsProvider == null) {
+ return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+ }
+ return sourceJarsProvider.getTransitiveSourceJars();
+ }
+
+ @Override
+ public JavaRuleOutputJarsProvider getOutputJars(Location location, StarlarkSemantics semantics)
+ throws EvalException {
+ checkLegacyJavaProviderFlag(location, semantics);
+ return getProvider(JavaRuleOutputJarsProvider.class);
+ }
+
+ @Override
+ public NestedSet<Label> getTransitiveExports(Location location, StarlarkSemantics semantics)
+ throws EvalException {
+ checkLegacyJavaProviderFlag(location, semantics);
+ JavaExportsProvider exportsProvider = getProvider(JavaExportsProvider.class);
+ if (exportsProvider != null) {
+ return exportsProvider.getTransitiveExports();
+ } else {
+ return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+ }
+ }
+
+ @Override
+ public JavaGenJarsProvider getGenJarsProvider(Location location, StarlarkSemantics semantics)
+ throws EvalException {
+ checkLegacyJavaProviderFlag(location, semantics);
+ return getProvider(JavaGenJarsProvider.class);
+ }
+
+ @Override
+ public JavaCompilationInfoProvider getCompilationInfoProvider(
+ Location location, StarlarkSemantics semantics) throws EvalException {
+ checkLegacyJavaProviderFlag(location, semantics);
+ return getProvider(JavaCompilationInfoProvider.class);
+ }
+
+ private void checkLegacyJavaProviderFlag(Location location, StarlarkSemantics 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 Starlark provider.");
+ }
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
index a0e41e2..da89907 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
@@ -48,6 +48,7 @@
import com.google.devtools.build.lib.rules.java.JavaRuleClasses;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder;
import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.Exports;
@@ -114,6 +115,7 @@
.advertiseProvider(JavaProtoLibraryAspectProvider.class)
.advertiseProvider(
ImmutableList.of(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())))
+ .advertiseProvider(ImmutableList.of(JavaSkylarkApiProvider.SKYLARK_NAME))
.add(
attr(JavaProtoAspectCommon.LITE_PROTO_TOOLCHAIN_ATTR, LABEL)
.mandatoryNativeProviders(
@@ -231,7 +233,9 @@
aspect.addNativeDeclaredProvider(
createCcLinkingInfo(ruleContext, aspectCommon.getProtoRuntimeDeps()));
+ JavaSkylarkApiProvider skylarkApiProvider = JavaSkylarkApiProvider.fromRuleContext();
aspect
+ .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider)
.addNativeDeclaredProvider(javaInfo.build())
.addProvider(
new JavaProtoLibraryAspectProvider(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
index 10e8c92..64edf43 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
@@ -39,6 +39,7 @@
import com.google.devtools.build.lib.rules.java.JavaInfo;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaRunfilesProvider;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaStrictCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.ProguardLibrary;
@@ -101,6 +102,8 @@
return new RuleConfiguredTargetBuilder(ruleContext)
.setFilesToBuild(filesToBuild.build())
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.addProvider(RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
.addOutputGroup(OutputGroupInfo.DEFAULT, NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
.addNativeDeclaredProvider(getJavaLiteRuntimeSpec(ruleContext))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
index 1e2f6a6..93ac592 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
@@ -48,6 +48,7 @@
import com.google.devtools.build.lib.rules.java.JavaRuleClasses;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder;
import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.Exports;
@@ -123,6 +124,7 @@
.advertiseProvider(JavaProtoLibraryAspectProvider.class)
.advertiseProvider(
ImmutableList.of(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())))
+ .advertiseProvider(ImmutableList.of(JavaSkylarkApiProvider.SKYLARK_NAME))
.add(
attr(JavaProtoAspectCommon.SPEED_PROTO_TOOLCHAIN_ATTR, LABEL)
// TODO(carmi): reinstate mandatoryNativeProviders(ProtoLangToolchainProvider)
@@ -250,7 +252,9 @@
javaInfo.addProvider(JavaCompilationArgsProvider.class, generatedCompilationArgsProvider);
aspect.addNativeDeclaredProvider(
createCcLinkingInfo(ruleContext, aspectCommon.getProtoRuntimeDeps()));
+ JavaSkylarkApiProvider javaSkylarkApiProvider = JavaSkylarkApiProvider.fromRuleContext();
aspect
+ .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, javaSkylarkApiProvider)
.addNativeDeclaredProvider(javaInfo.build())
.addProvider(
new JavaProtoLibraryAspectProvider(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
index 0f1f508..b33a91b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
@@ -36,6 +36,7 @@
import com.google.devtools.build.lib.rules.java.JavaInfo;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaRunfilesProvider;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaStrictCompilationArgsProvider;
@@ -98,6 +99,8 @@
RuleConfiguredTargetBuilder result =
new RuleConfiguredTargetBuilder(ruleContext)
.setFilesToBuild(filesToBuild.build())
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.addProvider(RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
.addOutputGroup(
OutputGroupInfo.DEFAULT, NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
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
new file mode 100644
index 0000000..39725a8
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java
@@ -0,0 +1,117 @@
+// Copyright 2018 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// 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.
+
+package com.google.devtools.build.lib.skylarkbuildapi.java;
+
+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.StarlarkSemantics;
+
+/**
+ * Provides access to information about Java rules. Every Java-related target provides
+ * this struct, accessible as a java field on a Target.
+ */
+@SkylarkModule(
+ name = "JavaSkylarkApiProvider",
+ title = "java",
+ category = SkylarkModuleCategory.PROVIDER,
+ doc =
+ "Provides access to information about Java rules. Every Java-related target provides "
+ + "this struct, accessible as a <code>java</code> field on a "
+ + "<a href=\"Target.html\">target</a>."
+)
+public interface JavaSkylarkApiProviderApi<FileT extends FileApi> {
+
+ @SkylarkCallable(
+ name = "source_jars",
+ doc = "Returns the Jars containing Java source files for the target.",
+ useStarlarkSemantics = true,
+ useLocation = true,
+ structField = true)
+ public NestedSet<FileT> getSourceJars(Location location, StarlarkSemantics semantics)
+ throws EvalException;
+
+ @SkylarkCallable(
+ name = "transitive_deps",
+ doc = "Returns the transitive set of Jars required to build the target.",
+ useStarlarkSemantics = true,
+ useLocation = true,
+ structField = true)
+ public NestedSet<FileT> getTransitiveDeps(Location location, StarlarkSemantics semantics)
+ throws EvalException;
+
+ @SkylarkCallable(
+ name = "transitive_runtime_deps",
+ doc = "Returns the transitive set of Jars required on the target's runtime classpath.",
+ useStarlarkSemantics = true,
+ useLocation = true,
+ structField = true)
+ public NestedSet<FileT> getTransitiveRuntimeDeps(Location location, StarlarkSemantics 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.",
+ useStarlarkSemantics = true,
+ useLocation = true,
+ structField = true)
+ public NestedSet<FileT> getTransitiveSourceJars(Location location, StarlarkSemantics semantics)
+ throws EvalException;
+
+ @SkylarkCallable(
+ name = "outputs",
+ doc = "Returns information about outputs of this Java target.",
+ useStarlarkSemantics = true,
+ useLocation = true,
+ structField = true)
+ public JavaRuleOutputJarsProviderApi<?> getOutputJars(
+ Location location, StarlarkSemantics semantics) throws EvalException;
+
+ @SkylarkCallable(
+ name = "transitive_exports",
+ structField = true,
+ useStarlarkSemantics = true,
+ useLocation = true,
+ doc = "Returns transitive set of labels that are being exported from this rule.")
+ public NestedSet<Label> getTransitiveExports(Location location, StarlarkSemantics semantics)
+ throws EvalException;
+
+ @SkylarkCallable(
+ name = "annotation_processing",
+ structField = true,
+ allowReturnNones = true,
+ useStarlarkSemantics = true,
+ useLocation = true,
+ doc = "Returns information about annotation processing for this Java target.")
+ public JavaAnnotationProcessingApi<?> getGenJarsProvider(
+ Location location, StarlarkSemantics semantics) throws EvalException;
+
+ @SkylarkCallable(
+ name = "compilation_info",
+ structField = true,
+ allowReturnNones = true,
+ useStarlarkSemantics = true,
+ useLocation = true,
+ doc = "Returns compilation information for this Java target.")
+ public JavaCompilationInfoProviderApi<?> getCompilationInfoProvider(
+ Location location, StarlarkSemantics semantics) throws EvalException;
+}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
index b83a03b..96b54a4 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
@@ -157,6 +157,7 @@
public abstract boolean incompatibleDisallowEmptyGlob();
+ public abstract boolean incompatibleDisallowLegacyJavaProvider();
public abstract boolean incompatibleDisallowOldStyleArgsAdd();
@@ -259,6 +260,7 @@
.incompatibleDisableDepsetItems(false)
.incompatibleDisallowDictPlus(true)
.incompatibleDisallowEmptyGlob(false)
+ .incompatibleDisallowLegacyJavaProvider(true)
.incompatibleDisallowOldStyleArgsAdd(true)
.incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(true)
.incompatibleDisallowStructProviderSyntax(false)
@@ -326,6 +328,8 @@
public abstract Builder incompatibleDisallowEmptyGlob(boolean value);
+ public abstract Builder incompatibleDisallowLegacyJavaProvider(boolean value);
+
public abstract Builder incompatibleDisallowOldStyleArgsAdd(boolean value);
public abstract Builder incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(
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 ad23ea24c..a9be5d5 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
@@ -140,6 +140,7 @@
"--incompatible_disable_third_party_license_checking=" + rand.nextBoolean(),
"--incompatible_disallow_dict_plus=" + rand.nextBoolean(),
"--incompatible_disallow_empty_glob=" + rand.nextBoolean(),
+ "--incompatible_disallow_legacy_java_provider=" + rand.nextBoolean(),
"--incompatible_disallow_old_style_args_add=" + rand.nextBoolean(),
"--incompatible_disallow_rule_execution_platform_constraints_allowed=" + rand.nextBoolean(),
"--incompatible_disallow_struct_provider_syntax=" + rand.nextBoolean(),
@@ -192,6 +193,7 @@
.incompatibleDisableThirdPartyLicenseChecking(rand.nextBoolean())
.incompatibleDisallowDictPlus(rand.nextBoolean())
.incompatibleDisallowEmptyGlob(rand.nextBoolean())
+ .incompatibleDisallowLegacyJavaProvider(rand.nextBoolean())
.incompatibleDisallowOldStyleArgsAdd(rand.nextBoolean())
.incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(rand.nextBoolean())
.incompatibleDisallowStructProviderSyntax(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 4e8cdb0..6ac932d 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
@@ -1161,6 +1161,29 @@
}
@Test
+ public void testSkylarkApiProviderReexported() throws Exception {
+ scratch.file(
+ "java/test/extension.bzl",
+ "def impl(ctx):",
+ " dep_java = ctx.attr.dep.java",
+ " return struct(java = dep_java)",
+ "my_rule = rule(impl, attrs = { ",
+ " 'dep' : attr.label(), ",
+ "})");
+ scratch.file(
+ "java/test/BUILD",
+ "load(':extension.bzl', 'my_rule')",
+ "java_library(name = 'jl', srcs = ['Jl.java'])",
+ "my_rule(name = 'my', dep = ':jl')");
+ // Now, get that information and ensure it is equal to what the jl java_library
+ // was presenting
+ ConfiguredTarget myConfiguredTarget = getConfiguredTarget("//java/test:my");
+ ConfiguredTarget javaLibraryTarget = getConfiguredTarget("//java/test:jl");
+
+ assertThat(myConfiguredTarget.get("java")).isSameInstanceAs(javaLibraryTarget.get("java"));
+ }
+
+ @Test
public void javaProviderExposedOnJavaLibrary() throws Exception {
scratch.file(
"foo/extension.bzl",
@@ -1998,6 +2021,31 @@
}
@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.");
+ }
+
+ @Test
public void testConfiguredTargetHostJavabase() throws Exception {
writeBuildFileForJavaToolchain();