diff options
author | Irina Iancu <elenairina@google.com> | 2017-01-23 14:55:47 +0000 |
---|---|---|
committer | Laszlo Csomor <laszlocsomor@google.com> | 2017-01-23 15:15:53 +0000 |
commit | 889ec7379b4c36bb3044492e7a6872089045c1df (patch) | |
tree | 172532a4ff26220af8d3dcd98626f546538f021d /src/main/java | |
parent | 94f0a25d22c3a51e76cd56a711902500d1d7a8ad (diff) |
Adding JavaSourceJarsProvider to Java Provider.
Also refactoring JavaProvider to use the Builder pattern, given that it is going to encapsulate a fair number of other providers.
--
PiperOrigin-RevId: 145280532
MOS_MIGRATED_REVID=145280532
Diffstat (limited to 'src/main/java')
7 files changed, 154 insertions, 57 deletions
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 7ae926c3bc..9fb76d3bb0 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 @@ -306,10 +306,10 @@ public class JavaCommon { (JavaProvider) skylarkProviders.getDeclaredProvider(JavaProvider.JAVA_PROVIDER.getKey()); if (javaProvider != null) { JavaCompilationArgsProvider compilationArgsProvider = - javaProvider.getJavaCompilationArgsProvider(); + javaProvider.getProvider(JavaCompilationArgsProvider.class); if (!addedProviders.contains(compilationArgsProvider)) { - builder.addTransitive(javaProvider - .getJavaCompilationArgsProvider().getCompileTimeJavaDependencyArtifacts()); + builder.addTransitive((javaProvider.getProvider(JavaCompilationArgsProvider.class)) + .getCompileTimeJavaDependencyArtifacts()); } } } @@ -390,9 +390,19 @@ public class JavaCommon { public NestedSet<Artifact> collectTransitiveSourceJars(Iterable<Artifact> targetSrcJars) { NestedSetBuilder<Artifact> builder = NestedSetBuilder.<Artifact>stableOrder() .addAll(targetSrcJars); - for (JavaSourceJarsProvider dep : getDependencies(JavaSourceJarsProvider.class)) { - builder.addTransitive(dep.getTransitiveSourceJars()); + + for (TransitiveInfoCollection dep : getDependencies()) { + JavaSourceJarsProvider sourceJarsProvider = dep.getProvider(JavaSourceJarsProvider.class); + if (sourceJarsProvider == null) { + // A target can either have both JavaSourceJarsProvider and JavaProvider that + // encapsulates the same information, or just one of them. + sourceJarsProvider = JavaProvider.getProvider(JavaSourceJarsProvider.class, dep); + } + if (sourceJarsProvider != null) { + builder.addTransitive(sourceJarsProvider.getTransitiveSourceJars()); + } } + return builder.build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgs.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgs.java index 5ca2d7d7a8..96f8586f9b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgs.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgs.java @@ -17,7 +17,6 @@ package com.google.devtools.build.lib.rules.java; import com.google.auto.value.AutoValue; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.FileProvider; -import com.google.devtools.build.lib.analysis.SkylarkProviders; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; @@ -156,15 +155,7 @@ public abstract class JavaCompilationArgs { if (provider == null) { // Only look for the JavaProvider when there is no JavaCompilationArgsProvider, else // it would encapsulate the same information. - SkylarkProviders skylarkProviders = dep.getProvider(SkylarkProviders.class); - if (skylarkProviders != null) { - JavaProvider javaProvider = - (JavaProvider) skylarkProviders.getDeclaredProvider( - JavaProvider.JAVA_PROVIDER.getKey()); - if (javaProvider != null) { - provider = javaProvider.getJavaCompilationArgsProvider(); - } - } + provider = JavaProvider.getProvider(JavaCompilationArgsProvider.class, dep); } if (provider != null) { addTransitiveCompilationArgs(provider, recursive, type); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java index b5da9766c7..de2ccf03d1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java @@ -27,7 +27,6 @@ import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; -import com.google.devtools.build.lib.analysis.SkylarkProviders; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; @@ -670,7 +669,7 @@ public final class JavaCompilationHelper { if (provider == null) { // A target can either have both JavaCompilationArgsProvider and JavaProvider that // encapsulates the same information, or just one of them. - provider = getJavaCompilationArgsProviderFromDep(dep); + provider = JavaProvider.getProvider(JavaCompilationArgsProvider.class, dep); } if (provider != null) { compilationArgsProviders.add(provider); @@ -681,25 +680,6 @@ public final class JavaCompilationHelper { } /** - * Returns a JavaCompilationArgsProvider fetched from the JavaProvider of the given target. - * JavaProvider can be found as a declared provider in SkylarkProviders. - */ - @Nullable - private static JavaCompilationArgsProvider getJavaCompilationArgsProviderFromDep( - TransitiveInfoCollection target) { - SkylarkProviders skylarkProviders = target.getProvider(SkylarkProviders.class); - if (skylarkProviders == null) { - return null; - } - JavaProvider javaProvider = - (JavaProvider) skylarkProviders.getDeclaredProvider(JavaProvider.JAVA_PROVIDER.getKey()); - if (javaProvider == null) { - return null; - } - return javaProvider.getJavaCompilationArgsProvider(); - } - - /** * Determines whether to enable strict_java_deps. * * @return filtered command line flag value, defaulting to ERROR 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 888d4456c1..050aeca6d7 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 @@ -185,7 +185,10 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { NestedSet<Artifact> proguardSpecs = new ProguardLibrary(ruleContext).collectProguardSpecs(); CcLinkParamsProvider ccLinkParamsProvider = new CcLinkParamsProvider(ccLinkParamsStore); - JavaProvider javaProvider = new JavaProvider(compilationArgsProvider); + JavaProvider javaProvider = JavaProvider.Builder.create() + .addProvider(JavaCompilationArgsProvider.class, compilationArgsProvider) + .addProvider(JavaSourceJarsProvider.class, sourceJarsProvider) + .build(); builder .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build()) .add(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider) diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java index b6ee004893..51a5af2bc2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java @@ -13,11 +13,21 @@ // limitations under the License. package com.google.devtools.build.lib.rules.java; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.analysis.SkylarkProviders; +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.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.SkylarkClassObject; import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import javax.annotation.Nullable; /** A Skylark declared provider that encapsulates all providers that are needed by Java rules. */ @Immutable @@ -26,14 +36,106 @@ public final class JavaProvider extends SkylarkClassObject implements Transitive public static final SkylarkClassObjectConstructor JAVA_PROVIDER = SkylarkClassObjectConstructor.createNative("java_common.provider"); - private final JavaCompilationArgsProvider javaCompilationArgsProvider; + private static final Set<Class<? extends TransitiveInfoProvider>> allowedProviders = + new HashSet<>(Arrays.asList( + JavaCompilationArgsProvider.class, + JavaSourceJarsProvider.class) + ); - public JavaProvider(JavaCompilationArgsProvider javaCompilationArgsProvider) { + private final TransitiveInfoProviderMap providers; + + /** Returns the instance for the provided providerClass, or <tt>null</tt> if not present. */ + @Nullable + public <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass) { + return providers.getProvider(providerClass); + } + + /** + * Merges the given providers into one {@link JavaProvider}. All the providers with the same type + * in the given list are merged into one provider that is added to the resulting + * {@link JavaProvider}. + */ + public static JavaProvider merge(List<JavaProvider> providers) { + List<JavaCompilationArgsProvider> javaCompilationArgsProviders = + JavaProvider.fetchProvidersFromList(providers, JavaCompilationArgsProvider.class); + List<JavaSourceJarsProvider> javaSourceJarsProviders = + JavaProvider.fetchProvidersFromList(providers, JavaSourceJarsProvider.class); + + return JavaProvider.Builder.create() + .addProvider( + JavaCompilationArgsProvider.class, + JavaCompilationArgsProvider.merge(javaCompilationArgsProviders)) + .addProvider( + JavaSourceJarsProvider.class, JavaSourceJarsProvider.merge(javaSourceJarsProviders)) + .build(); + } + + /** + * Returns a list of providers of the specified class, fetched from the given list of + * {@link JavaProvider}s. + * Returns an empty list if no providers can be fetched. + * Returns a list of the same size as the given list if the requested providers are of type + * JavaCompilationArgsProvider. + */ + public static <C extends TransitiveInfoProvider> List<C> fetchProvidersFromList( + List<JavaProvider> javaProviders, Class<C> providersClass) { + List<C> fetchedProviders = new LinkedList<>(); + for (JavaProvider javaProvider : javaProviders) { + C provider = javaProvider.getProvider(providersClass); + if (provider != null) { + fetchedProviders.add(provider); + } + } + return fetchedProviders; + } + + /** + * Returns a provider of the specified class, fetched from the JavaProvider of the given target. + * JavaProvider can be found as a declared provider in SkylarkProviders. + * Returns null if no such provider exists. + */ + @Nullable + public static <T extends TransitiveInfoProvider> T getProvider( + Class<T> providerClass, TransitiveInfoCollection target) { + SkylarkProviders skylarkProviders = target.getProvider(SkylarkProviders.class); + if (skylarkProviders == null) { + return null; + } + JavaProvider javaProvider = + (JavaProvider) skylarkProviders.getDeclaredProvider(JavaProvider.JAVA_PROVIDER.getKey()); + if (javaProvider == null) { + return null; + } + return javaProvider.getProvider(providerClass); + } + + private JavaProvider(TransitiveInfoProviderMap providers) { super(JAVA_PROVIDER, ImmutableMap.<String, Object>of()); - this.javaCompilationArgsProvider = javaCompilationArgsProvider; + this.providers = providers; } - public JavaCompilationArgsProvider getJavaCompilationArgsProvider() { - return javaCompilationArgsProvider; + /** + * A Builder for {@link JavaProvider}. + */ + public static class Builder { + TransitiveInfoProviderMap.Builder providerMap = new TransitiveInfoProviderMap.Builder(); + + private Builder() {} + + public static Builder create() { + return new Builder(); + } + + public <P extends TransitiveInfoProvider> Builder addProvider( + Class<P> providerClass, TransitiveInfoProvider provider) { + Preconditions.checkArgument(allowedProviders.contains(providerClass)); + providerMap.put(providerClass, provider); + return this; + } + + public JavaProvider build() { + Preconditions.checkArgument(providerMap.contains(JavaCompilationArgsProvider.class)); + return new JavaProvider(providerMap.build()); + } } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java index e62e080bd6..78e50fc609 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java @@ -31,7 +31,6 @@ import com.google.devtools.build.lib.skylarkinterface.Param; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.syntax.SkylarkList; -import java.util.LinkedList; import java.util.List; /** A module that contains Skylark utilities for Java support. */ @@ -126,7 +125,9 @@ public class JavaSkylarkCommon { .addSourceFiles(sourceFiles) .setJavacOpts(javacOpts); - helper.addAllDeps(getJavaCompilationArgsProviders(deps)); + List<JavaCompilationArgsProvider> compilationArgsProviders = + JavaProvider.fetchProvidersFromList(deps, JavaCompilationArgsProvider.class); + helper.addAllDeps(compilationArgsProviders); helper.setCompilationStrictDepsMode(getStrictDepsMode(strictDepsMode)); MiddlemanProvider hostJavabaseProvider = hostJavabase.getProvider(MiddlemanProvider.class); @@ -142,7 +143,22 @@ public class JavaSkylarkCommon { javaToolchainProvider, hostJavabaseArtifacts, SkylarkList.createImmutable(ImmutableList.<Artifact>of())); - return new JavaProvider(helper.buildCompilationArgsProvider(artifacts, true)); + return JavaProvider.Builder.create() + .addProvider( + JavaCompilationArgsProvider.class, + helper.buildCompilationArgsProvider(artifacts, true)) + .addProvider(JavaSourceJarsProvider.class, createJavaSourceJarsProvider(sourceJars)) + .build(); + } + + /** + * Creates a {@link JavaSourceJarsProvider} from the given list of source jars. + */ + private static JavaSourceJarsProvider createJavaSourceJarsProvider(List<Artifact> sourceJars) { + NestedSet<Artifact> javaSourceJars = + NestedSetBuilder.<Artifact>stableOrder().addAll(sourceJars).build(); + return JavaSourceJarsProvider.create( + NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars); } @SkylarkCallable( @@ -172,17 +188,7 @@ public class JavaSkylarkCommon { mandatoryPositionals = 1 ) public static JavaProvider mergeJavaProviders(SkylarkList<JavaProvider> providers) { - return new JavaProvider( - JavaCompilationArgsProvider.merge(getJavaCompilationArgsProviders(providers))); - } - - private static List<JavaCompilationArgsProvider> getJavaCompilationArgsProviders( - SkylarkList<JavaProvider> providers) { - List<JavaCompilationArgsProvider> javaCompilationArgsProviders = new LinkedList<>(); - for (JavaProvider provider : providers) { - javaCompilationArgsProviders.add(provider.getJavaCompilationArgsProvider()); - } - return javaCompilationArgsProviders; + return JavaProvider.merge(providers); } private static StrictDepsMode getStrictDepsMode(String strictDepsMode) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoSkylarkCommon.java index 5612095478..6f07c4683c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoSkylarkCommon.java @@ -97,7 +97,12 @@ public class JavaProtoSkylarkCommon { SkylarkRuleContext skylarkRuleContext, String protoToolchainAttr) { TransitiveInfoCollection runtime = getProtoToolchainProvider(skylarkRuleContext, protoToolchainAttr).runtime(); - return new JavaProvider(runtime.getProvider(JavaCompilationArgsProvider.class)); + return + JavaProvider.Builder.create() + .addProvider( + JavaCompilationArgsProvider.class, + runtime.getProvider(JavaCompilationArgsProvider.class)) + .build(); } @SkylarkCallable( |