aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD4
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/WrappingProvider.java25
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/WrappingProviderHelper.java49
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java71
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java117
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceJarsProvider.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java37
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaCompilationArgsAspectProvider.java48
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java61
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java56
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java62
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java51
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryAspectProvider.java41
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryTransitiveFilesToBuildProvider.java47
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaSourceJarsAspectProvider.java44
22 files changed, 340 insertions, 454 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 1cef34f338..a9fcb0c043 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -914,14 +914,12 @@ java_library(
"rules/java/ProtoJavaApiInfoAspectProvider.java",
"rules/java/ProtoJavaApiInfoProvider.java",
"rules/java/proto/ActionReuser.java",
- "rules/java/proto/JavaCompilationArgsAspectProvider.java",
"rules/java/proto/JavaLiteProtoAspect.java",
"rules/java/proto/JavaLiteProtoLibrary.java",
"rules/java/proto/JavaProtoAspect.java",
"rules/java/proto/JavaProtoLibrary.java",
- "rules/java/proto/JavaProtoLibraryTransitiveFilesToBuildProvider.java",
+ "rules/java/proto/JavaProtoLibraryAspectProvider.java",
"rules/java/proto/JavaProtoSkylarkCommon.java",
- "rules/java/proto/JavaSourceJarsAspectProvider.java",
"rules/java/proto/ProtoJavacOpts.java",
"rules/java/proto/StrictDepsUtils.java",
],
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/WrappingProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/WrappingProvider.java
new file mode 100644
index 0000000000..3460d6e0bc
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/WrappingProvider.java
@@ -0,0 +1,25 @@
+// Copyright 2017 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.analysis;
+
+/**
+ * A provider that wraps a transitive info provider map.
+ *
+ * <p>Useful for wrapping providers in aspects in a general way where there would otherwise be a
+ * conflict.
+ */
+public interface WrappingProvider extends TransitiveInfoProvider {
+ TransitiveInfoProviderMap getTransitiveInfoProviderMap();
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/WrappingProviderHelper.java b/src/main/java/com/google/devtools/build/lib/analysis/WrappingProviderHelper.java
new file mode 100644
index 0000000000..8e758f5808
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/WrappingProviderHelper.java
@@ -0,0 +1,49 @@
+// Copyright 2017 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.analysis;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.annotation.Nullable;
+
+/** Helper methods for {@link WrappingProvider} */
+public class WrappingProviderHelper {
+
+ private WrappingProviderHelper() {}
+
+ /** Gets the actual providers from a list of wrappers. */
+ public static <T extends TransitiveInfoProvider> List<T> unwrapProviders(
+ Iterable<? extends WrappingProvider> wrappingProviders, Class<T> providerClass) {
+ List<T> result = new ArrayList<>();
+ for (WrappingProvider wrappingProvider : wrappingProviders) {
+ T provider = wrappingProvider.getTransitiveInfoProviderMap().getProvider(providerClass);
+ if (provider != null) {
+ result.add(provider);
+ }
+ }
+ return result;
+ }
+
+ /** Reads a provider via a wrapping provider. Returns null if not wrapped. */
+ @Nullable
+ public static <T extends TransitiveInfoProvider, U extends WrappingProvider> T getWrappedProvider(
+ TransitiveInfoCollection collection, Class<U> wrappingProviderClass, Class<T> providerClass) {
+ WrappingProvider wrappingProvider = collection.getProvider(wrappingProviderClass);
+ if (wrappingProvider != null) {
+ return wrappingProvider.getTransitiveInfoProviderMap().getProvider(providerClass);
+ }
+ return null;
+ }
+}
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 75290d124e..ad28ff8402 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
@@ -768,20 +768,15 @@ public class AndroidCommon {
recursiveJavaCompilationArgs,
compileTimeDependencyArtifacts,
NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER));
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(ruleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider)
- .setCompilationArgsProvider(compilationArgsProvider);
- javaCommon.addTransitiveInfoProviders(
- builder, skylarkApiProvider, filesToBuild, classJar, ANDROID_COLLECTION_SPEC);
- javaCommon.addGenJarsProvider(builder, skylarkApiProvider, genClassJar, genSourceJar);
+ javaCommon.addTransitiveInfoProviders(builder, filesToBuild, classJar, ANDROID_COLLECTION_SPEC);
+ javaCommon.addGenJarsProvider(builder, genClassJar, genSourceJar);
DataBinding.maybeAddProvider(builder, ruleContext);
return builder
.setFilesToBuild(filesToBuild)
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.add(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
.add(JavaSourceJarsProvider.class, sourceJarsProvider)
.add(
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 5bc42bd331..3b58190638 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
@@ -304,13 +304,9 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor
addExtraProviders(builder, javaCommon, classJar, srcJar, genClassJar, genSourceJar);
JavaRuleOutputJarsProvider ruleOutputJarsProvider = javaRuleOutputJarsProviderBuilder.build();
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(ruleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider);
- javaCommon.addTransitiveInfoProviders(builder, skylarkApiProvider, filesToBuild, classJar);
- javaCommon.addGenJarsProvider(builder, skylarkApiProvider, genClassJar, genSourceJar);
+ javaCommon.addTransitiveInfoProviders(builder, filesToBuild, classJar);
+ javaCommon.addGenJarsProvider(builder, genClassJar, genSourceJar);
// No need to use the flag map here - just confirming that dynamic configurations are in use.
// TODO(mstaib): remove when static configurations are removed.
@@ -318,7 +314,8 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor
return builder
.setFilesToBuild(filesToBuild)
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.addProvider(ruleOutputJarsProvider)
.addProvider(
RunfilesProvider.class,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
index ff973cde35..101718ba8e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
@@ -38,6 +38,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.WrappingProviderHelper;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
@@ -55,8 +56,8 @@ import com.google.devtools.build.lib.rules.java.JavaCommon;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaCompilationInfoProvider;
import com.google.devtools.build.lib.rules.java.JavaRuntimeJarProvider;
-import com.google.devtools.build.lib.rules.java.proto.JavaCompilationArgsAspectProvider;
import com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect;
+import com.google.devtools.build.lib.rules.java.proto.JavaProtoLibraryAspectProvider;
import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider;
import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
import java.util.HashMap;
@@ -120,27 +121,39 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
@Override
public AspectDefinition getDefinition(AspectParameters params) {
- AspectDefinition.Builder result = new AspectDefinition.Builder(this)
- .requireProviderSets(
- ImmutableList.of(
- // We care about JavaRuntimeJarProvider, but rules don't advertise that provider.
- ImmutableSet.<Class<?>>of(JavaCompilationArgsProvider.class),
- // For proto_library rules, where we care about JavaCompilationArgsAspectProvider.
- ImmutableSet.<Class<?>>of(ProtoSourcesProvider.class),
- // For proto_lang_toolchain rules, where we just want to get at their runtime deps.
- ImmutableSet.<Class<?>>of(ProtoLangToolchainProvider.class),
- // For android_sdk rules, where we just want to get at aidl runtime deps.
- ImmutableSet.<Class<?>>of(AndroidSdkProvider.class)))
- // Parse labels since we don't have RuleDefinitionEnvironment.getLabel like in a rule
- .add(attr(ASPECT_DESUGAR_PREREQ, LABEL).cfg(HOST).exec()
- .value(Label.parseAbsoluteUnchecked(toolsRepository + "//tools/android:desugar_java8")))
- // Access to --android_sdk so we can stub in a bootclasspath for desugaring if missing
- .add(attr(":dex_archive_android_sdk", LABEL)
- .allowedRuleClasses("android_sdk", "filegroup")
- .value(new AndroidRuleClasses.AndroidSdkLabel(
- Label.parseAbsoluteUnchecked(toolsRepository + AndroidRuleClasses.DEFAULT_SDK))))
- .requiresConfigurationFragments(AndroidConfiguration.class)
- .requireAspectsWithNativeProviders(JavaCompilationArgsAspectProvider.class);
+ AspectDefinition.Builder result =
+ new AspectDefinition.Builder(this)
+ .requireProviderSets(
+ ImmutableList.of(
+ // We care about JavaRuntimeJarProvider, but rules don't advertise that
+ // provider.
+ ImmutableSet.<Class<?>>of(JavaCompilationArgsProvider.class),
+ // For proto_library rules, where we care about
+ // JavaCompilationArgsAspectProvider.
+ ImmutableSet.<Class<?>>of(ProtoSourcesProvider.class),
+ // For proto_lang_toolchain rules, where we just want to get at their runtime
+ // deps.
+ ImmutableSet.<Class<?>>of(ProtoLangToolchainProvider.class),
+ // For android_sdk rules, where we just want to get at aidl runtime deps.
+ ImmutableSet.<Class<?>>of(AndroidSdkProvider.class)))
+ // Parse labels since we don't have RuleDefinitionEnvironment.getLabel like in a rule
+ .add(
+ attr(ASPECT_DESUGAR_PREREQ, LABEL)
+ .cfg(HOST)
+ .exec()
+ .value(
+ Label.parseAbsoluteUnchecked(
+ toolsRepository + "//tools/android:desugar_java8")))
+ // Access to --android_sdk so we can stub in a bootclasspath for desugaring if missing
+ .add(
+ attr(":dex_archive_android_sdk", LABEL)
+ .allowedRuleClasses("android_sdk", "filegroup")
+ .value(
+ new AndroidRuleClasses.AndroidSdkLabel(
+ Label.parseAbsoluteUnchecked(
+ toolsRepository + AndroidRuleClasses.DEFAULT_SDK))))
+ .requiresConfigurationFragments(AndroidConfiguration.class)
+ .requireAspectsWithNativeProviders(JavaProtoLibraryAspectProvider.class);
if (TriState.valueOf(params.getOnlyValueOfAttribute("incremental_dexing")) != TriState.NO) {
// Marginally improves "query2" precision for targets that disable incremental dexing
result.add(attr(ASPECT_DEXBUILDER_PREREQ, LABEL).cfg(HOST).exec()
@@ -250,10 +263,13 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
RuleContext ruleContext) {
if (isProtoLibrary(ruleContext)
&& getAndroidConfig(ruleContext).incrementalDexingForLiteProtos()) {
- JavaCompilationArgsAspectProvider javaProtos =
- base.getProvider(JavaCompilationArgsAspectProvider.class);
- if (javaProtos != null && !ruleContext.getPrerequisites("srcs", Mode.TARGET).isEmpty()) {
- return javaProtos.provider.getJavaCompilationArgs().getRuntimeJars();
+ if (!ruleContext.getPrerequisites("srcs", Mode.TARGET).isEmpty()) {
+ JavaCompilationArgsProvider javaCompilationArgsProvider =
+ WrappingProviderHelper.getWrappedProvider(
+ base, JavaProtoLibraryAspectProvider.class, JavaCompilationArgsProvider.class);
+ if (javaCompilationArgsProvider != null) {
+ return javaCompilationArgsProvider.getJavaCompilationArgs().getRuntimeJars();
+ }
}
} else {
JavaRuntimeJarProvider jarProvider = base.getProvider(JavaRuntimeJarProvider.class);
@@ -267,7 +283,8 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
private static JavaCompilationArgsProvider getJavaCompilationArgsProvider(ConfiguredTarget base,
RuleContext ruleContext) {
if (isProtoLibrary(ruleContext)) {
- return base.getProvider(JavaCompilationArgsAspectProvider.class).provider;
+ return WrappingProviderHelper.getWrappedProvider(
+ base, JavaProtoLibraryAspectProvider.class, JavaCompilationArgsProvider.class);
} else {
return base.getProvider(JavaCompilationArgsProvider.class);
}
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 253cb78cb9..4a927b8c8b 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
@@ -399,17 +399,14 @@ public class JavaBinary implements RuleConfiguredTargetFactory {
}
JavaRuleOutputJarsProvider ruleOutputJarsProvider = ruleOutputJarsProviderBuilder.build();
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(ruleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider);
- common.addTransitiveInfoProviders(builder, skylarkApiProvider, filesToBuild, classJar);
- common.addGenJarsProvider(builder, skylarkApiProvider, genClassJar, genSourceJar);
+ common.addTransitiveInfoProviders(builder, filesToBuild, classJar);
+ common.addGenJarsProvider(builder, genClassJar, genSourceJar);
return builder
.setFilesToBuild(filesToBuild)
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.add(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
.add(RunfilesProvider.class, runfilesProvider)
// The executable to run (below) may be different from the executable for runfiles (the one
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
index 92e2ae5183..082552b9d4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
@@ -656,16 +656,13 @@ public class JavaCommon {
public void addTransitiveInfoProviders(
RuleConfiguredTargetBuilder builder,
- JavaSkylarkApiProvider.Builder skylarkApiProvider,
NestedSet<Artifact> filesToBuild,
@Nullable Artifact classJar) {
- addTransitiveInfoProviders(
- builder, skylarkApiProvider, filesToBuild, classJar, JAVA_COLLECTION_SPEC);
+ addTransitiveInfoProviders(builder, filesToBuild, classJar, JAVA_COLLECTION_SPEC);
}
public void addTransitiveInfoProviders(
RuleConfiguredTargetBuilder builder,
- JavaSkylarkApiProvider.Builder skylarkApiProvider,
NestedSet<Artifact> filesToBuild,
@Nullable Artifact classJar,
InstrumentationSpec instrumentationSpec) {
@@ -673,10 +670,6 @@ public class JavaCommon {
JavaCompilationInfoProvider compilationInfoProvider = createCompilationInfoProvider();
JavaExportsProvider exportsProvider = collectTransitiveExports();
- skylarkApiProvider
- .setCompilationInfoProvider(compilationInfoProvider)
- .setExportsProvider(exportsProvider);
-
builder
.add(
InstrumentedFilesProvider.class,
@@ -700,7 +693,6 @@ public class JavaCommon {
public void addGenJarsProvider(
RuleConfiguredTargetBuilder builder,
- JavaSkylarkApiProvider.Builder javaSkylarkApiProvider,
@Nullable Artifact genClassJar,
@Nullable Artifact genSourceJar) {
JavaGenJarsProvider genJarsProvider = collectTransitiveGenJars(
@@ -711,7 +703,6 @@ public class JavaCommon {
genJarsBuilder.addTransitive(genJarsProvider.getTransitiveGenClassJars());
genJarsBuilder.addTransitive(genJarsProvider.getTransitiveGenSourceJars());
- javaSkylarkApiProvider.setGenJarsProvider(genJarsProvider);
builder
.add(JavaGenJarsProvider.class, genJarsProvider)
.addOutputGroup(JavaSemantics.GENERATED_JARS_OUTPUT_GROUP, genJarsBuilder.build());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java
index 837a270172..d93f4dba1e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java
@@ -21,6 +21,7 @@ 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.concurrent.ThreadSafety.Immutable;
+import java.util.List;
/**
* An interface for objects that provide information on how to include them in
@@ -86,7 +87,11 @@ public abstract class JavaCompilationArgsProvider implements TransitiveInfoProvi
*/
public abstract NestedSet<Artifact> getRunTimeJavaDependencyArtifacts();
- public static JavaCompilationArgsProvider merge(Iterable<JavaCompilationArgsProvider> providers) {
+ public static JavaCompilationArgsProvider merge(List<JavaCompilationArgsProvider> providers) {
+ if (providers.size() == 1) {
+ return providers.get(0);
+ }
+
JavaCompilationArgs.Builder javaCompilationArgs = JavaCompilationArgs.builder();
JavaCompilationArgs.Builder recursiveJavaCompilationArgs = JavaCompilationArgs.builder();
NestedSetBuilder<Artifact> compileTimeJavaDepArtifacts = NestedSetBuilder.stableOrder();
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 a3393c9d44..5fd09b5ca9 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
@@ -155,12 +155,7 @@ public class JavaImport implements RuleConfiguredTargetFactory {
JavaSourceJarsProvider.create(transitiveJavaSourceJars, srcJars);
JavaCompilationArgsProvider compilationArgsProvider =
JavaCompilationArgsProvider.create(javaCompilationArgs, recursiveJavaCompilationArgs);
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(ruleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider)
- .setCompilationArgsProvider(compilationArgsProvider);
- common.addTransitiveInfoProviders(ruleBuilder, skylarkApiProvider, filesToBuild, null);
+ common.addTransitiveInfoProviders(ruleBuilder, filesToBuild, null);
JavaProvider javaProvider = JavaProvider.Builder.create()
.addProvider(JavaCompilationArgsProvider.class, compilationArgsProvider)
.addProvider(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
@@ -168,7 +163,8 @@ public class JavaImport implements RuleConfiguredTargetFactory {
.build();
return ruleBuilder
.setFilesToBuild(filesToBuild)
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.addNativeDeclaredProvider(javaProvider)
.addProvider(JavaProvider.class, javaProvider)
.add(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
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 0ce54d643a..c08ddb7f2c 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
@@ -203,15 +203,10 @@ public class JavaLibrary implements RuleConfiguredTargetFactory {
compileTimeJavaDepArtifacts, runTimeJavaDepArtifacts);
JavaSourceJarsProvider sourceJarsProvider = sourceJarsProviderBuilder.build();
JavaRuleOutputJarsProvider ruleOutputJarsProvider = ruleOutputJarsProviderBuilder.build();
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(ruleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider)
- .setCompilationArgsProvider(compilationArgsProvider);
NestedSet<Artifact> filesToBuild = filesBuilder.build();
- common.addTransitiveInfoProviders(builder, skylarkApiProvider, filesToBuild, classJar);
- common.addGenJarsProvider(builder, skylarkApiProvider, genClassJar, genSourceJar);
+ common.addTransitiveInfoProviders(builder, filesToBuild, classJar);
+ common.addGenJarsProvider(builder, genClassJar, genSourceJar);
NestedSet<Artifact> proguardSpecs = new ProguardLibrary(ruleContext).collectProguardSpecs();
@@ -224,7 +219,8 @@ public class JavaLibrary implements RuleConfiguredTargetFactory {
// java_library doesn't need to return JavaRunfilesProvider
.build();
builder
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.addProvider(ruleOutputJarsProvider)
.addProvider(new JavaRuntimeJarProvider(javaArtifacts.getRuntimeJars()))
.addProvider(
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 0cc5dfd2a8..7d799325da 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
@@ -14,9 +14,9 @@
package com.google.devtools.build.lib.rules.java;
-import static com.google.common.base.Preconditions.checkNotNull;
-
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.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -47,26 +47,31 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
public static final SkylarkProviderIdentifier PROTO_NAME =
SkylarkProviderIdentifier.forLegacy("proto_java");
- private final JavaRuleOutputJarsProvider ruleOutputJarsProvider;
- @Nullable private final JavaSourceJarsProvider sourceJarsProvider;
- @Nullable private final JavaGenJarsProvider genJarsProvider;
- @Nullable private final JavaCompilationInfoProvider compilationInfoProvider;
- @Nullable private final JavaCompilationArgsProvider compilationArgsProvider;
- @Nullable private final JavaExportsProvider exportsProvider;
-
- private JavaSkylarkApiProvider(
- JavaRuleOutputJarsProvider ruleOutputJarsProvider,
- @Nullable JavaSourceJarsProvider sourceJarsProvider,
- @Nullable JavaGenJarsProvider genJarsProvider,
- @Nullable JavaCompilationInfoProvider compilationInfoProvider,
- @Nullable JavaCompilationArgsProvider compilationArgsProvider,
- @Nullable JavaExportsProvider exportsProvider) {
- this.compilationInfoProvider = compilationInfoProvider;
- this.ruleOutputJarsProvider = ruleOutputJarsProvider;
- this.sourceJarsProvider = sourceJarsProvider;
- this.genJarsProvider = genJarsProvider;
- this.compilationArgsProvider = compilationArgsProvider;
- this.exportsProvider = exportsProvider;
+ @Nullable private final TransitiveInfoProviderMap transitiveInfoProviderMap;
+
+ public static JavaSkylarkApiProvider fromRuleContext() {
+ return new JavaSkylarkApiProvider();
+ }
+
+ public static JavaSkylarkApiProvider fromProviderMap(
+ TransitiveInfoProviderMap transitiveInfoProviderMap) {
+ return new JavaSkylarkApiProvider(transitiveInfoProviderMap);
+ }
+
+ private JavaSkylarkApiProvider() {
+ this.transitiveInfoProviderMap = null;
+ }
+
+ private JavaSkylarkApiProvider(TransitiveInfoProviderMap transitiveInfoProviderMap) {
+ this.transitiveInfoProviderMap = transitiveInfoProviderMap;
+ }
+
+ @Nullable
+ private <P extends TransitiveInfoProvider> P getProvider(Class<P> provider) {
+ if (transitiveInfoProviderMap != null) {
+ return transitiveInfoProviderMap.getProvider(provider);
+ }
+ return getInfo().getProvider(provider);
}
@SkylarkCallable(
@@ -75,6 +80,7 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
structField = true
)
public NestedSet<Artifact> getSourceJars() {
+ JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class);
if (sourceJarsProvider == null) {
return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
}
@@ -87,6 +93,8 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
structField = true
)
public NestedSet<Artifact> getTransitiveDeps() {
+ JavaCompilationArgsProvider compilationArgsProvider =
+ getProvider(JavaCompilationArgsProvider.class);
if (compilationArgsProvider == null) {
return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
}
@@ -99,6 +107,8 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
structField = true
)
public NestedSet<Artifact> getTransitiveRuntimeDeps() {
+ JavaCompilationArgsProvider compilationArgsProvider =
+ getProvider(JavaCompilationArgsProvider.class);
if (compilationArgsProvider == null) {
return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
}
@@ -113,6 +123,7 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
structField = true
)
public NestedSet<Artifact> getTransitiveSourceJars() {
+ JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class);
if (sourceJarsProvider == null) {
return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
}
@@ -125,7 +136,7 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
structField = true
)
public JavaRuleOutputJarsProvider getOutputJars() {
- return ruleOutputJarsProvider;
+ return getProvider(JavaRuleOutputJarsProvider.class);
}
@SkylarkCallable(
@@ -134,6 +145,7 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
doc = "Returns transitive set of labels that are being exported from this rule."
)
public NestedSet<Label> getTransitiveExports() {
+ JavaExportsProvider exportsProvider = getProvider(JavaExportsProvider.class);
if (exportsProvider != null) {
return exportsProvider.getTransitiveExports();
} else {
@@ -148,7 +160,7 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
doc = "Returns information about annotation processing for this Java target."
)
public JavaGenJarsProvider getGenJarsProvider() {
- return genJarsProvider;
+ return getProvider(JavaGenJarsProvider.class);
}
@SkylarkCallable(
@@ -158,61 +170,6 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
doc = "Returns compilation information for this Java target."
)
public JavaCompilationInfoProvider getCompilationInfoProvider() {
- return compilationInfoProvider;
- }
-
- public static Builder builder() {
- return new Builder();
- }
-
- /** Builder for {@link JavaSkylarkApiProvider} */
- public static class Builder {
- private JavaRuleOutputJarsProvider ruleOutputJarsProvider;
- private JavaSourceJarsProvider sourceJarsProvider;
- private JavaGenJarsProvider genJarsProvider;
- private JavaCompilationInfoProvider compilationInfoProvider;
- private JavaCompilationArgsProvider compilationArgsProvider;
- private JavaExportsProvider exportsProvider;
-
- public Builder setRuleOutputJarsProvider(JavaRuleOutputJarsProvider ruleOutputJarsProvider) {
- this.ruleOutputJarsProvider = ruleOutputJarsProvider;
- return this;
- }
-
- public Builder setSourceJarsProvider(JavaSourceJarsProvider sourceJarsProvider) {
- this.sourceJarsProvider = sourceJarsProvider;
- return this;
- }
-
- public Builder setGenJarsProvider(JavaGenJarsProvider genJarsProvider) {
- this.genJarsProvider = genJarsProvider;
- return this;
- }
-
- public Builder setCompilationInfoProvider(JavaCompilationInfoProvider compilationInfoProvider) {
- this.compilationInfoProvider = compilationInfoProvider;
- return this;
- }
-
- public Builder setCompilationArgsProvider(JavaCompilationArgsProvider compilationArgsProvider) {
- this.compilationArgsProvider = compilationArgsProvider;
- return this;
- }
-
- public Builder setExportsProvider(JavaExportsProvider exportsProvider) {
- this.exportsProvider = exportsProvider;
- return this;
- }
-
- public JavaSkylarkApiProvider build() {
- checkNotNull(ruleOutputJarsProvider, "Must provide JavaRuleOutputJarsProvider");
- return new JavaSkylarkApiProvider(
- ruleOutputJarsProvider,
- sourceJarsProvider,
- genJarsProvider,
- compilationInfoProvider,
- compilationArgsProvider,
- exportsProvider);
- }
+ return getProvider(JavaCompilationInfoProvider.class);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceJarsProvider.java
index 122ead0ca8..2907e26fb7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceJarsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceJarsProvider.java
@@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import java.util.List;
/** The collection of source jars from the transitive closure. */
@AutoValue
@@ -45,7 +46,10 @@ public abstract class JavaSourceJarsProvider implements TransitiveInfoProvider {
/** Return the source jars that are to be built when the target is on the command line. */
public abstract ImmutableList<Artifact> getSourceJars();
- public static JavaSourceJarsProvider merge(Iterable<JavaSourceJarsProvider> providers) {
+ public static JavaSourceJarsProvider merge(List<JavaSourceJarsProvider> providers) {
+ if (providers.size() == 1) {
+ return providers.get(0);
+ }
JavaSourceJarsProvider.Builder result = builder();
for (JavaSourceJarsProvider provider : providers) {
result.mergeFrom(provider);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java
index bb75a937d5..b58923fb65 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java
@@ -17,17 +17,16 @@ package com.google.devtools.build.lib.rules.java.proto;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Iterables.getOnlyElement;
import static com.google.common.collect.Iterables.isEmpty;
-import static com.google.common.collect.Iterables.transform;
import static com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode.TARGET;
import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType.BOTH;
-import static com.google.devtools.build.lib.rules.java.proto.JavaProtoLibraryTransitiveFilesToBuildProvider.GET_JARS;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredAspect;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleContext;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgs;
@@ -75,28 +74,26 @@ public class ActionReuser {
NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER));
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(
- createOutputJarProvider(outputJar, compileTimeJar, sourceJar))
- .setSourceJarsProvider(createSrcJarProvider(sourceJar))
- .setCompilationArgsProvider(compilationArgsProvider);
+ TransitiveInfoProviderMapBuilder javaProvidersBuilder =
+ new TransitiveInfoProviderMapBuilder()
+ .add(createOutputJarProvider(outputJar, compileTimeJar, sourceJar))
+ .add(createSrcJarProvider(sourceJar))
+ .add(compilationArgsProvider);
- NestedSet<Artifact> transitiveOutputJars =
- NestedSetBuilder.fromNestedSets(
- transform(
- ruleContext.getPrerequisites(
- "deps", TARGET, JavaProtoLibraryTransitiveFilesToBuildProvider.class),
- GET_JARS))
- .add(outputJar)
- .build();
+ NestedSetBuilder<Artifact> transitiveOutputJars = NestedSetBuilder.stableOrder();
+ for (JavaProtoLibraryAspectProvider provider :
+ ruleContext.getPrerequisites("deps", TARGET, JavaProtoLibraryAspectProvider.class)) {
+ transitiveOutputJars.addTransitive(provider.getJars());
+ }
+ transitiveOutputJars.add(outputJar);
+ TransitiveInfoProviderMap javaProviders = javaProvidersBuilder.build();
aspect
.addSkylarkTransitiveInfo(
- JavaSkylarkApiProvider.PROTO_NAME.getLegacyId(), skylarkApiProvider.build())
+ JavaSkylarkApiProvider.PROTO_NAME.getLegacyId(),
+ JavaSkylarkApiProvider.fromProviderMap(javaProviders))
.addProviders(
- new JavaProtoLibraryTransitiveFilesToBuildProvider(transitiveOutputJars),
- new JavaCompilationArgsAspectProvider(compilationArgsProvider));
+ new JavaProtoLibraryAspectProvider(javaProviders, transitiveOutputJars.build()));
return true;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaCompilationArgsAspectProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaCompilationArgsAspectProvider.java
deleted file mode 100644
index 1169eb4193..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaCompilationArgsAspectProvider.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 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.proto;
-
-import com.google.common.base.Function;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
-
-import javax.annotation.Nullable;
-
-/**
- * A wrapper around {@link JavaCompilationArgsProvider}.
- */
-public class JavaCompilationArgsAspectProvider implements TransitiveInfoProvider {
-
- /**
- * A long way to say (wrapper) -> wrapper.provider.
- */
- public static final Function<
- ? super JavaCompilationArgsAspectProvider, ? extends JavaCompilationArgsProvider>
- GET_PROVIDER =
- new Function<JavaCompilationArgsAspectProvider, JavaCompilationArgsProvider>() {
- @Nullable
- @Override
- public JavaCompilationArgsProvider apply(
- @Nullable JavaCompilationArgsAspectProvider wrapper) {
- return wrapper == null ? null : wrapper.provider;
- }
- };
-
- public final JavaCompilationArgsProvider provider;
-
- public JavaCompilationArgsAspectProvider(JavaCompilationArgsProvider provider) {
- this.provider = 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 967756c490..05c0ad02d5 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
@@ -16,24 +16,24 @@ package com.google.devtools.build.lib.rules.java.proto;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Iterables.getOnlyElement;
-import static com.google.common.collect.Iterables.transform;
import static com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode.TARGET;
import static com.google.devtools.build.lib.cmdline.Label.parseAbsoluteUnchecked;
import static com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition.HOST;
import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.packages.BuildType.LABEL;
-import static com.google.devtools.build.lib.rules.java.proto.JavaCompilationArgsAspectProvider.GET_PROVIDER;
-import static com.google.devtools.build.lib.rules.java.proto.JavaProtoLibraryTransitiveFilesToBuildProvider.GET_JARS;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredAspect;
import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
+import com.google.devtools.build.lib.analysis.WrappingProviderHelper;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
import com.google.devtools.build.lib.cmdline.Label;
@@ -98,8 +98,7 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
public ConfiguredAspect create(
ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters)
throws InterruptedException {
- ConfiguredAspect.Builder aspect =
- new ConfiguredAspect.Builder(this, parameters, ruleContext);
+ ConfiguredAspect.Builder aspect = new ConfiguredAspect.Builder(this, parameters, ruleContext);
// Get SupportData, which is provided by the proto_library rule we attach to.
SupportData supportData =
@@ -118,7 +117,7 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
.propagateAlongAttribute("deps")
.requiresConfigurationFragments(JavaConfiguration.class, ProtoConfiguration.class)
.requireProviders(ProtoSourcesProvider.class)
- .advertiseProvider(JavaCompilationArgsAspectProvider.class)
+ .advertiseProvider(JavaProtoLibraryAspectProvider.class)
.advertiseProvider(ImmutableList.of(JavaSkylarkApiProvider.PROTO_NAME))
.add(
attr(PROTO_TOOLCHAIN_ATTR, LABEL)
@@ -151,22 +150,23 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
* Java compilation action.
*/
private final JavaCompilationArgsProvider dependencyCompilationArgs;
+
private final JavaSemantics javaSemantics;
+ private final Iterable<JavaProtoLibraryAspectProvider> javaProtoLibraryAspectProviders;
Impl(
- final RuleContext ruleContext,
- final SupportData supportData,
- JavaSemantics javaSemantics) {
+ final RuleContext ruleContext, final SupportData supportData, JavaSemantics javaSemantics) {
this.ruleContext = ruleContext;
this.supportData = supportData;
this.javaSemantics = javaSemantics;
+ this.javaProtoLibraryAspectProviders =
+ ruleContext.getPrerequisites(
+ "deps", RuleConfiguredTarget.Mode.TARGET, JavaProtoLibraryAspectProvider.class);
dependencyCompilationArgs =
JavaCompilationArgsProvider.merge(
- Iterables.<JavaCompilationArgsAspectProvider, JavaCompilationArgsProvider>transform(
- this.<JavaCompilationArgsAspectProvider>getDeps(
- JavaCompilationArgsAspectProvider.class),
- GET_PROVIDER));
+ WrappingProviderHelper.unwrapProviders(
+ javaProtoLibraryAspectProviders, JavaCompilationArgsProvider.class));
}
void addProviders(ConfiguredAspect.Builder aspect) {
@@ -176,11 +176,13 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
// The jars that this proto and its dependencies produce. Used to roll-up jars up to the
// java_proto_library, to be put into filesToBuild.
- NestedSetBuilder<Artifact> transitiveOutputJars =
- NestedSetBuilder.fromNestedSets(
- transform(getDeps(JavaProtoLibraryTransitiveFilesToBuildProvider.class), GET_JARS));
+ NestedSetBuilder<Artifact> transitiveOutputJars = NestedSetBuilder.stableOrder();
+ for (JavaProtoLibraryAspectProvider provider : javaProtoLibraryAspectProviders) {
+ transitiveOutputJars.addTransitive(provider.getJars());
+ }
- JavaSkylarkApiProvider.Builder skylarkApiProvider = JavaSkylarkApiProvider.builder();
+ TransitiveInfoProviderMapBuilder javaProvidersBuilder =
+ new TransitiveInfoProviderMapBuilder();
if (supportData.hasProtoSources()) {
Artifact sourceJar = getSourceJarArtifact();
@@ -205,26 +207,23 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
JavaSourceJarsProvider.create(
NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars);
- skylarkApiProvider
- .setRuleOutputJarsProvider(ruleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider);
-
- aspect.addProvider(new JavaSourceJarsAspectProvider(sourceJarsProvider));
+ javaProvidersBuilder.add(ruleOutputJarsProvider).add(sourceJarsProvider);
} else {
// No sources - this proto_library is an alias library, which exports its dependencies.
// Simply propagate the compilation-args from its dependencies.
generatedCompilationArgsProvider = dependencyCompilationArgs;
- skylarkApiProvider.setRuleOutputJarsProvider(JavaRuleOutputJarsProvider.builder().build());
+ javaProvidersBuilder.add(JavaRuleOutputJarsProvider.EMPTY);
}
- skylarkApiProvider.setCompilationArgsProvider(generatedCompilationArgsProvider);
+ javaProvidersBuilder.add(generatedCompilationArgsProvider);
+ TransitiveInfoProviderMap javaProviders = javaProvidersBuilder.build();
aspect
.addSkylarkTransitiveInfo(
- JavaSkylarkApiProvider.PROTO_NAME.getLegacyId(), skylarkApiProvider.build())
- .addProviders(
- new JavaProtoLibraryTransitiveFilesToBuildProvider(transitiveOutputJars.build()),
- new JavaCompilationArgsAspectProvider(generatedCompilationArgsProvider));
+ JavaSkylarkApiProvider.PROTO_NAME.getLegacyId(),
+ JavaSkylarkApiProvider.fromProviderMap(javaProviders))
+ .addProvider(
+ new JavaProtoLibraryAspectProvider(javaProviders, transitiveOutputJars.build()));
}
private void createProtoCompileAction(Artifact sourceJar) {
@@ -277,9 +276,5 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
private Artifact getOutputJarArtifact() {
return ruleContext.getBinArtifact("lib" + ruleContext.getLabel().getName() + "-lite.jar");
}
-
- private <C extends TransitiveInfoProvider> Iterable<C> getDeps(Class<C> clazz) {
- return ruleContext.getPrerequisites("deps", TARGET, clazz);
- }
}
}
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 de91377b10..83178e8149 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
@@ -20,7 +20,6 @@ import static com.google.devtools.build.lib.collect.nestedset.Order.STABLE_ORDER
import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.PROTO_TOOLCHAIN_ATTR;
import com.google.common.collect.ImmutableMultimap;
-import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.OutputGroupProvider;
@@ -30,7 +29,7 @@ import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.WrappingProviderHelper;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
@@ -53,42 +52,37 @@ public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory {
public ConfiguredTarget create(final RuleContext ruleContext)
throws InterruptedException, RuleErrorException {
+ Iterable<JavaProtoLibraryAspectProvider> javaProtoLibraryAspectProviders =
+ ruleContext.getPrerequisites("deps", Mode.TARGET, JavaProtoLibraryAspectProvider.class);
+
JavaCompilationArgsProvider dependencyArgsProviders =
JavaCompilationArgsProvider.merge(
- Iterables.<JavaCompilationArgsAspectProvider, JavaCompilationArgsProvider>transform(
- getDeps(ruleContext, JavaCompilationArgsAspectProvider.class),
- JavaCompilationArgsAspectProvider.GET_PROVIDER));
+ WrappingProviderHelper.unwrapProviders(
+ javaProtoLibraryAspectProviders, JavaCompilationArgsProvider.class));
if (!StrictDepsUtils.isStrictDepsJavaProtoLibrary(ruleContext)) {
dependencyArgsProviders = StrictDepsUtils.makeNonStrict(dependencyArgsProviders);
}
- Runfiles runfiles = new Runfiles.Builder(ruleContext.getWorkspaceName()).addArtifacts(
- dependencyArgsProviders.getRecursiveJavaCompilationArgs().getRuntimeJars()).build();
+ Runfiles runfiles =
+ new Runfiles.Builder(ruleContext.getWorkspaceName())
+ .addArtifacts(
+ dependencyArgsProviders.getRecursiveJavaCompilationArgs().getRuntimeJars())
+ .build();
JavaSourceJarsProvider sourceJarsProvider =
JavaSourceJarsProvider.merge(
- Iterables.<JavaSourceJarsAspectProvider, JavaSourceJarsProvider>transform(
- getDeps(ruleContext, JavaSourceJarsAspectProvider.class),
- JavaSourceJarsAspectProvider.GET_PROVIDER));
+ WrappingProviderHelper.unwrapProviders(
+ javaProtoLibraryAspectProviders, JavaSourceJarsProvider.class));
NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder();
filesToBuild.addAll(sourceJarsProvider.getSourceJars());
- for (JavaProtoLibraryTransitiveFilesToBuildProvider provider : ruleContext.getPrerequisites(
- "deps", Mode.TARGET, JavaProtoLibraryTransitiveFilesToBuildProvider.class)) {
+ for (JavaProtoLibraryAspectProvider provider : javaProtoLibraryAspectProviders) {
filesToBuild.addTransitive(provider.getJars());
}
- JavaRuleOutputJarsProvider javaRuleOutputJarsProvider =
- JavaRuleOutputJarsProvider.builder().build();
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(javaRuleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider)
- .setCompilationArgsProvider(dependencyArgsProviders);
-
JavaRunfilesProvider javaRunfilesProvider = new JavaRunfilesProvider(runfiles);
JavaProvider javaProvider =
@@ -104,15 +98,16 @@ public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory {
return new RuleConfiguredTargetBuilder(ruleContext)
.setFilesToBuild(filesToBuild.build())
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
- .addProvider(RunfilesProvider.class, RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
+ .addProvider(RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
.addOutputGroup(
OutputGroupProvider.DEFAULT, NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
- .add(JavaCompilationArgsProvider.class, dependencyArgsProviders)
- .add(JavaSourceJarsProvider.class, sourceJarsProvider)
- .add(JavaRunfilesProvider.class, javaRunfilesProvider)
- .add(ProguardSpecProvider.class, getJavaLiteRuntimeSpec(ruleContext))
- .add(JavaRuleOutputJarsProvider.class, javaRuleOutputJarsProvider)
+ .addProvider(dependencyArgsProviders)
+ .addProvider(sourceJarsProvider)
+ .addProvider(javaRunfilesProvider)
+ .addProvider(getJavaLiteRuntimeSpec(ruleContext))
+ .addProvider(JavaRuleOutputJarsProvider.EMPTY)
.addProvider(javaProvider)
.addNativeDeclaredProvider(javaProvider)
.build();
@@ -123,17 +118,12 @@ public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory {
ProtoJavaApiInfoAspectProvider.Builder protoJavaApiInfoAspectProvider =
ProtoJavaApiInfoAspectProvider.builder();
for (ProtoJavaApiInfoProvider protoJavaApiInfoProvider :
- getDeps(ruleContext, ProtoJavaApiInfoProvider.class)) {
+ ruleContext.getPrerequisites("deps", Mode.TARGET, ProtoJavaApiInfoProvider.class)) {
protoJavaApiInfoAspectProvider.add(protoJavaApiInfoProvider).build();
}
return protoJavaApiInfoAspectProvider.build();
}
- private <C extends TransitiveInfoProvider> Iterable<C> getDeps(
- RuleContext ruleContext, Class<C> clazz) {
- return ruleContext.getPrerequisites("deps", TARGET, clazz);
- }
-
private ProguardSpecProvider getJavaLiteRuntimeSpec(RuleContext ruleContext) {
NestedSet<Artifact> specs =
new ProguardLibrary(ruleContext).collectProguardSpecs(ImmutableMultimap.<Mode, String>of());
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 36be8ab52c..7e0b23d7cf 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
@@ -16,24 +16,23 @@ package com.google.devtools.build.lib.rules.java.proto;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Iterables.getOnlyElement;
-import static com.google.common.collect.Iterables.transform;
import static com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode.TARGET;
import static com.google.devtools.build.lib.cmdline.Label.parseAbsoluteUnchecked;
import static com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition.HOST;
import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.packages.BuildType.LABEL;
-import static com.google.devtools.build.lib.rules.java.proto.JavaCompilationArgsAspectProvider.GET_PROVIDER;
-import static com.google.devtools.build.lib.rules.java.proto.JavaProtoLibraryTransitiveFilesToBuildProvider.GET_JARS;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredAspect;
import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
+import com.google.devtools.build.lib.analysis.WrappingProviderHelper;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
import com.google.devtools.build.lib.cmdline.Label;
@@ -102,8 +101,7 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
public ConfiguredAspect create(
ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters)
throws InterruptedException {
- ConfiguredAspect.Builder aspect =
- new ConfiguredAspect.Builder(this, parameters, ruleContext);
+ ConfiguredAspect.Builder aspect = new ConfiguredAspect.Builder(this, parameters, ruleContext);
if (!rpcSupport.checkAttributes(ruleContext, parameters)) {
return aspect.build();
@@ -128,7 +126,7 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
.propagateAlongAttribute("deps")
.requiresConfigurationFragments(JavaConfiguration.class, ProtoConfiguration.class)
.requireProviders(ProtoSourcesProvider.class)
- .advertiseProvider(JavaCompilationArgsAspectProvider.class)
+ .advertiseProvider(JavaProtoLibraryAspectProvider.class)
.advertiseProvider(ImmutableList.of(JavaSkylarkApiProvider.PROTO_NAME))
.add(
attr(SPEED_PROTO_TOOLCHAIN_ATTR, LABEL)
@@ -167,6 +165,8 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
*/
private final JavaCompilationArgsProvider dependencyCompilationArgs;
+ private final Iterable<JavaProtoLibraryAspectProvider> javaProtoLibraryAspectProviders;
+
Impl(
final RuleContext ruleContext,
final SupportData supportData,
@@ -176,13 +176,14 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
this.supportData = supportData;
this.javaSemantics = javaSemantics;
this.rpcSupport = rpcSupport;
+ this.javaProtoLibraryAspectProviders =
+ ruleContext.getPrerequisites(
+ "deps", RuleConfiguredTarget.Mode.TARGET, JavaProtoLibraryAspectProvider.class);
dependencyCompilationArgs =
JavaCompilationArgsProvider.merge(
- Iterables.<JavaCompilationArgsAspectProvider, JavaCompilationArgsProvider>transform(
- this.<JavaCompilationArgsAspectProvider>getDeps(
- JavaCompilationArgsAspectProvider.class),
- GET_PROVIDER));
+ WrappingProviderHelper.unwrapProviders(
+ javaProtoLibraryAspectProviders, JavaCompilationArgsProvider.class));
}
void addProviders(ConfiguredAspect.Builder aspect) {
@@ -192,11 +193,13 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
// The jars that this proto and its dependencies produce. Used to roll-up jars up to the
// java_proto_library, to be put into filesToBuild.
- NestedSetBuilder<Artifact> transitiveOutputJars =
- NestedSetBuilder.fromNestedSets(
- transform(getDeps(JavaProtoLibraryTransitiveFilesToBuildProvider.class), GET_JARS));
+ NestedSetBuilder<Artifact> transitiveOutputJars = NestedSetBuilder.stableOrder();
+ for (JavaProtoLibraryAspectProvider provider : javaProtoLibraryAspectProviders) {
+ transitiveOutputJars.addTransitive(provider.getJars());
+ }
- JavaSkylarkApiProvider.Builder skylarkApiProvider = JavaSkylarkApiProvider.builder();
+ TransitiveInfoProviderMapBuilder javaProvidersBuilder =
+ new TransitiveInfoProviderMapBuilder();
if (shouldGenerateCode()) {
Artifact sourceJar = getSourceJarArtifact();
@@ -221,25 +224,20 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
JavaSourceJarsProvider.create(
NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars);
- skylarkApiProvider
- .setRuleOutputJarsProvider(ruleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider);
-
- aspect.addProvider(new JavaSourceJarsAspectProvider(sourceJarsProvider));
+ javaProvidersBuilder.add(ruleOutputJarsProvider).add(sourceJarsProvider);
} else {
// No sources - this proto_library is an alias library, which exports its dependencies.
// Simply propagate the compilation-args from its dependencies.
generatedCompilationArgsProvider = dependencyCompilationArgs;
- skylarkApiProvider.setRuleOutputJarsProvider(JavaRuleOutputJarsProvider.builder().build());
+ javaProvidersBuilder.add(JavaRuleOutputJarsProvider.EMPTY);
}
- skylarkApiProvider.setCompilationArgsProvider(generatedCompilationArgsProvider);
+ javaProvidersBuilder.add(generatedCompilationArgsProvider);
+ TransitiveInfoProviderMap javaProviders = javaProvidersBuilder.build();
aspect
- .addSkylarkTransitiveInfo(
- JavaSkylarkApiProvider.PROTO_NAME.getLegacyId(), skylarkApiProvider.build())
- .addProviders(
- new JavaProtoLibraryTransitiveFilesToBuildProvider(transitiveOutputJars.build()),
- new JavaCompilationArgsAspectProvider(generatedCompilationArgsProvider));
+ .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.PROTO_NAME.getLegacyId(), javaProviders)
+ .addProvider(
+ new JavaProtoLibraryAspectProvider(javaProviders, transitiveOutputJars.build()));
}
/**
@@ -286,9 +284,7 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
.setOutput(outputJar)
.addSourceJars(sourceJar)
.setJavacOpts(ProtoJavacOpts.constructJavacOpts(ruleContext));
- helper
- .addDep(dependencyCompilationArgs)
- .setCompilationStrictDepsMode(StrictDepsMode.OFF);
+ helper.addDep(dependencyCompilationArgs).setCompilationStrictDepsMode(StrictDepsMode.OFF);
TransitiveInfoCollection runtime = getProtoToolchainProvider().runtime();
if (runtime != null) {
helper.addDep(runtime.getProvider(JavaCompilationArgsProvider.class));
@@ -316,9 +312,5 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
private Artifact getOutputJarArtifact() {
return ruleContext.getBinArtifact("lib" + ruleContext.getLabel().getName() + "-speed.jar");
}
-
- private <C extends TransitiveInfoProvider> Iterable<C> getDeps(Class<C> clazz) {
- return ruleContext.getPrerequisites("deps", TARGET, clazz);
- }
}
}
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 68c92f489f..545f2c6d4b 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
@@ -14,10 +14,8 @@
package com.google.devtools.build.lib.rules.java.proto;
-import static com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode.TARGET;
import static com.google.devtools.build.lib.collect.nestedset.Order.STABLE_ORDER;
-import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.OutputGroupProvider;
@@ -26,7 +24,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.WrappingProviderHelper;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
@@ -45,12 +43,13 @@ public class JavaProtoLibrary implements RuleConfiguredTargetFactory {
public ConfiguredTarget create(final RuleContext ruleContext)
throws InterruptedException, RuleErrorException {
+ Iterable<JavaProtoLibraryAspectProvider> javaProtoLibraryAspectProviders =
+ ruleContext.getPrerequisites("deps", Mode.TARGET, JavaProtoLibraryAspectProvider.class);
+
JavaCompilationArgsProvider dependencyArgsProviders =
JavaCompilationArgsProvider.merge(
- Iterables.<JavaCompilationArgsAspectProvider, JavaCompilationArgsProvider>transform(
- this.<JavaCompilationArgsAspectProvider>getDeps(
- ruleContext, JavaCompilationArgsAspectProvider.class),
- JavaCompilationArgsAspectProvider.GET_PROVIDER));
+ WrappingProviderHelper.unwrapProviders(
+ javaProtoLibraryAspectProviders, JavaCompilationArgsProvider.class));
if (!StrictDepsUtils.isStrictDepsJavaProtoLibrary(ruleContext)) {
dependencyArgsProviders = StrictDepsUtils.makeNonStrict(dependencyArgsProviders);
@@ -64,29 +63,17 @@ public class JavaProtoLibrary implements RuleConfiguredTargetFactory {
JavaSourceJarsProvider sourceJarsProvider =
JavaSourceJarsProvider.merge(
- Iterables.<JavaSourceJarsAspectProvider, JavaSourceJarsProvider>transform(
- this.<JavaSourceJarsAspectProvider>getDeps(
- ruleContext, JavaSourceJarsAspectProvider.class),
- JavaSourceJarsAspectProvider.GET_PROVIDER));
+ WrappingProviderHelper.unwrapProviders(
+ javaProtoLibraryAspectProviders, JavaSourceJarsProvider.class));
NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder();
filesToBuild.addAll(sourceJarsProvider.getSourceJars());
- for (JavaProtoLibraryTransitiveFilesToBuildProvider provider :
- ruleContext.getPrerequisites(
- "deps", Mode.TARGET, JavaProtoLibraryTransitiveFilesToBuildProvider.class)) {
+ for (JavaProtoLibraryAspectProvider provider : javaProtoLibraryAspectProviders) {
filesToBuild.addTransitive(provider.getJars());
}
- JavaRuleOutputJarsProvider ruleOutputJarsProvider =
- JavaRuleOutputJarsProvider.builder().build();
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(ruleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider)
- .setCompilationArgsProvider(dependencyArgsProviders);
-
JavaRunfilesProvider javaRunfilesProvider = new JavaRunfilesProvider(runfiles);
JavaProvider javaProvider =
@@ -102,14 +89,15 @@ public class JavaProtoLibrary implements RuleConfiguredTargetFactory {
return new RuleConfiguredTargetBuilder(ruleContext)
.setFilesToBuild(filesToBuild.build())
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
- .addProvider(RunfilesProvider.class, RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
+ .addProvider(RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
.addOutputGroup(
OutputGroupProvider.DEFAULT, NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
- .add(JavaCompilationArgsProvider.class, dependencyArgsProviders)
- .add(JavaSourceJarsProvider.class, sourceJarsProvider)
- .add(JavaRunfilesProvider.class, javaRunfilesProvider)
- .add(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
+ .addProvider(dependencyArgsProviders)
+ .addProvider(sourceJarsProvider)
+ .addProvider(javaRunfilesProvider)
+ .addProvider(JavaRuleOutputJarsProvider.EMPTY)
.addProvider(javaProvider)
.addNativeDeclaredProvider(javaProvider)
.build();
@@ -120,14 +108,9 @@ public class JavaProtoLibrary implements RuleConfiguredTargetFactory {
ProtoJavaApiInfoAspectProvider.Builder protoJavaApiInfoAspectProvider =
ProtoJavaApiInfoAspectProvider.builder();
for (ProtoJavaApiInfoProvider protoJavaApiInfoProvider :
- getDeps(ruleContext, ProtoJavaApiInfoProvider.class)) {
+ ruleContext.getPrerequisites("deps", Mode.TARGET, ProtoJavaApiInfoProvider.class)) {
protoJavaApiInfoAspectProvider.add(protoJavaApiInfoProvider).build();
}
return protoJavaApiInfoAspectProvider.build();
}
-
- private <C extends TransitiveInfoProvider> Iterable<C> getDeps(
- RuleContext ruleContext, Class<C> clazz) {
- return ruleContext.getPrerequisites("deps", TARGET, clazz);
- }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryAspectProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryAspectProvider.java
new file mode 100644
index 0000000000..3124e54515
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryAspectProvider.java
@@ -0,0 +1,41 @@
+// Copyright 2017 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.proto;
+
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
+import com.google.devtools.build.lib.analysis.WrappingProvider;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+
+/** A provider used to communicate information between java_proto_library and its aspect. */
+public class JavaProtoLibraryAspectProvider implements WrappingProvider {
+ private final TransitiveInfoProviderMap transitiveInfoProviderMap;
+ private final NestedSet<Artifact> jars;
+
+ public JavaProtoLibraryAspectProvider(
+ TransitiveInfoProviderMap transitiveInfoProviderMap, NestedSet<Artifact> jars) {
+ this.transitiveInfoProviderMap = transitiveInfoProviderMap;
+ this.jars = jars;
+ }
+
+ @Override
+ public TransitiveInfoProviderMap getTransitiveInfoProviderMap() {
+ return transitiveInfoProviderMap;
+ }
+
+ public NestedSet<Artifact> getJars() {
+ return jars;
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryTransitiveFilesToBuildProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryTransitiveFilesToBuildProvider.java
deleted file mode 100644
index aaf4ee26d2..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryTransitiveFilesToBuildProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2016 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.proto;
-
-import com.google.common.base.Function;
-import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-
-import javax.annotation.Nullable;
-
-/** Used by java_{lite,...}_proto_library to roll up jars to build. */
-public class JavaProtoLibraryTransitiveFilesToBuildProvider implements TransitiveInfoProvider {
- private final NestedSet<Artifact> jars;
-
- /** A long way to say (JavaProtoLibraryTransitiveFilesToBuildProvider p) -> p.getJars() */
- public static final Function<JavaProtoLibraryTransitiveFilesToBuildProvider, NestedSet<Artifact>>
- GET_JARS =
- new Function<JavaProtoLibraryTransitiveFilesToBuildProvider, NestedSet<Artifact>>() {
- @Nullable
- @Override
- public NestedSet<Artifact> apply(
- @Nullable JavaProtoLibraryTransitiveFilesToBuildProvider p) {
- return p == null ? null : p.getJars();
- }
- };
-
- public JavaProtoLibraryTransitiveFilesToBuildProvider(NestedSet<Artifact> jars) {
- this.jars = jars;
- }
-
- public NestedSet<Artifact> getJars() {
- return jars;
- }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaSourceJarsAspectProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaSourceJarsAspectProvider.java
deleted file mode 100644
index 962f93dfb6..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaSourceJarsAspectProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2016 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.proto;
-
-import com.google.common.base.Function;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
-
-import javax.annotation.Nullable;
-
-/** A wrapper around {@link JavaSourceJarsProvider}. */
-public class JavaSourceJarsAspectProvider implements TransitiveInfoProvider {
- /**
- * A long way to say (wrapper) -> wrapper.provider.
- */
- public static final Function<
- ? super JavaSourceJarsAspectProvider, ? extends JavaSourceJarsProvider>
- GET_PROVIDER =
- new Function<JavaSourceJarsAspectProvider, JavaSourceJarsProvider>() {
- @Nullable
- @Override
- public JavaSourceJarsProvider apply(@Nullable JavaSourceJarsAspectProvider wrapper) {
- return wrapper == null ? null : wrapper.provider;
- }
- };
-
- public final JavaSourceJarsProvider provider;
-
- public JavaSourceJarsAspectProvider(JavaSourceJarsProvider provider) {
- this.provider = provider;
- }
-}