diff options
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; - } -} |