aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar Irina Iancu <elenairina@google.com>2017-01-23 14:55:47 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2017-01-23 15:15:53 +0000
commit889ec7379b4c36bb3044492e7a6872089045c1df (patch)
tree172532a4ff26220af8d3dcd98626f546538f021d /src/main
parent94f0a25d22c3a51e76cd56a711902500d1d7a8ad (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgs.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java22
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java112
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java34
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoSkylarkCommon.java7
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(