aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-09-16 15:21:39 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2016-09-19 07:34:37 +0000
commit94d35deeb44bdac33d58430d0441b34d5c5c630e (patch)
treee8b217fb0f6c6b033834bf26e816aef3afac8531 /src/main/java/com/google/devtools
parentc484f19a2cf7427887d6e4c71c8534806e1ba83e (diff)
Add a specialized TransitiveInfoProviderMap to map TransitiveInfoProviders by class.
TransitiveInfoProviderMap enforces that the provider implements the interface it's keyed by and provides accessors the reduce the amount of casting. This in general reduces boilerplate throughout wherever TransitiveInfoProviders are mapped by their class. Also add shorthand for adding a provider where it only implements TransitiveInfoProvider once, reducing the redundant specification of the TransitiveInfoProvider class. Infer the class as the exclusive direct implementor of TransitiveInfoProvider to account for special cases like AutoValue and LicenseProvider. -- MOS_MIGRATED_REVID=133386336
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java87
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/FileConfiguredTarget.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java65
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java36
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java95
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java192
-rw-r--r--src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java117
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java46
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java39
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java18
19 files changed, 448 insertions, 313 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java
index 8c1b34a0a6..ca5aac4a6b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java
@@ -26,6 +26,7 @@ import com.google.devtools.build.lib.packages.PackageSpecification;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.syntax.ClassObject;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+import javax.annotation.Nullable;
/**
* An abstract implementation of ConfiguredTarget in which all properties are
@@ -82,6 +83,7 @@ public abstract class AbstractConfiguredTarget
return "ConfiguredTarget(" + getTarget().getLabel() + ", " + getConfiguration() + ")";
}
+ @Nullable
@Override
public <P extends TransitiveInfoProvider> P getProvider(Class<P> provider) {
AnalysisUtils.checkProvider(provider);
@@ -111,7 +113,7 @@ public abstract class AbstractConfiguredTarget
return get(name);
}
}
-
+
@Override
public String errorMessage(String name) {
return null;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
index 86a0d54216..eb98851c69 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
@@ -30,7 +30,7 @@ import com.google.devtools.build.lib.packages.SkylarkClassObject;
import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor.Key;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.util.Preconditions;
-import java.util.LinkedHashMap;
+import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;
import javax.annotation.Nullable;
@@ -54,12 +54,9 @@ import javax.annotation.Nullable;
@Immutable
public final class ConfiguredAspect implements Iterable<TransitiveInfoProvider> {
private final String name;
- private final ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>
- providers;
+ private final TransitiveInfoProviderMap providers;
- private ConfiguredAspect(
- String name,
- ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> providers) {
+ private ConfiguredAspect(String name, TransitiveInfoProviderMap providers) {
this.name = name;
this.providers = providers;
}
@@ -71,21 +68,15 @@ public final class ConfiguredAspect implements Iterable<TransitiveInfoProvider>
return name;
}
- /**
- * Returns the providers created by the aspect.
- */
- public ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>
- getProviders() {
+ /** Returns the providers created by the aspect. */
+ public TransitiveInfoProviderMap getProviders() {
return providers;
}
-
@Nullable
@VisibleForTesting
public <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass) {
- AnalysisUtils.checkProvider(providerClass);
-
- return providerClass.cast(providers.get(providerClass));
+ return providers.getProvider(providerClass);
}
@Override
@@ -101,8 +92,7 @@ public final class ConfiguredAspect implements Iterable<TransitiveInfoProvider>
* Builder for {@link ConfiguredAspect}.
*/
public static class Builder {
- private final Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>
- providers = new LinkedHashMap<>();
+ private final TransitiveInfoProviderMap.Builder providers = TransitiveInfoProviderMap.builder();
private final Map<String, NestedSetBuilder<Artifact>> outputGroupBuilders = new TreeMap<>();
private final ImmutableMap.Builder<String, Object> skylarkProviderBuilder =
ImmutableMap.builder();
@@ -114,26 +104,46 @@ public final class ConfiguredAspect implements Iterable<TransitiveInfoProvider>
this.ruleContext = ruleContext;
}
- /**
- * Adds a provider to the aspect.
- */
- public Builder addProvider(
- Class<? extends TransitiveInfoProvider> key, TransitiveInfoProvider value) {
- Preconditions.checkNotNull(key);
- Preconditions.checkNotNull(value);
- AnalysisUtils.checkProvider(key);
- Preconditions.checkState(!providers.containsKey(key));
- Preconditions.checkArgument(!SkylarkProviders.class.equals(key),
- "Do not provide SkylarkProviders directly");
- providers.put(key, value);
+ public <T extends TransitiveInfoProvider> Builder addProvider(
+ Class<? extends T> providerClass, T provider) {
+ Preconditions.checkNotNull(provider);
+ checkProviderClass(providerClass);
+ providers.put(providerClass, provider);
+ return this;
+ }
+
+ /** Adds a provider to the aspect. */
+ public Builder addProvider(TransitiveInfoProvider provider) {
+ Preconditions.checkNotNull(provider);
+ addProvider(TransitiveInfoProviderMap.getEffectiveProviderClass(provider), provider);
return this;
}
- public Builder addProviders(
- Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> providers) {
- for (Map.Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> provider :
+ private void checkProviderClass(Class<? extends TransitiveInfoProvider> providerClass) {
+ Preconditions.checkNotNull(providerClass);
+ Preconditions.checkArgument(
+ !SkylarkProviders.class.equals(providerClass),
+ "Do not provide SkylarkProviders directly");
+ }
+
+ /** Adds providers to the aspect. */
+ public Builder addProviders(TransitiveInfoProviderMap providers) {
+ for (Map.Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> entry :
providers.entrySet()) {
- addProvider(provider.getKey(), provider.getValue());
+ addProvider(entry.getKey(), entry.getKey().cast(entry.getValue()));
+ }
+ return this;
+ }
+
+ /** Adds providers to the aspect. */
+ public Builder addProviders(TransitiveInfoProvider... providers) {
+ return addProviders(Arrays.asList(providers));
+ }
+
+ /** Adds providers to the aspect. */
+ public Builder addProviders(Iterable<TransitiveInfoProvider> providers) {
+ for (TransitiveInfoProvider provider : providers) {
+ addProvider(provider);
}
return this;
}
@@ -165,26 +175,25 @@ public final class ConfiguredAspect implements Iterable<TransitiveInfoProvider>
outputGroups.put(entry.getKey(), entry.getValue().build());
}
- if (providers.containsKey(OutputGroupProvider.class)) {
+ if (providers.contains(OutputGroupProvider.class)) {
throw new IllegalStateException(
"OutputGroupProvider was provided explicitly; do not use addOutputGroup");
}
- addProvider(OutputGroupProvider.class, new OutputGroupProvider(outputGroups.build()));
+ addProvider(new OutputGroupProvider(outputGroups.build()));
}
ImmutableMap<String, Object> skylarkProvidersMap = skylarkProviderBuilder.build();
if (!skylarkProvidersMap.isEmpty()) {
- providers.put(SkylarkProviders.class, new SkylarkProviders(skylarkProvidersMap,
- ImmutableMap.<Key, SkylarkClassObject>of()));
+ providers.add(
+ new SkylarkProviders(skylarkProvidersMap, ImmutableMap.<Key, SkylarkClassObject>of()));
}
addProvider(
- ExtraActionArtifactsProvider.class,
createExtraActionProvider(
ImmutableSet.<ActionAnalysisMetadata>of() /* actionsWithoutExtraAction */,
ruleContext));
- return new ConfiguredAspect(name, ImmutableMap.copyOf(providers));
+ return new ConfiguredAspect(name, providers.build());
}
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/FileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/FileConfiguredTarget.java
index 42178bf531..f55298f717 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/FileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/FileConfiguredTarget.java
@@ -14,8 +14,6 @@
package com.google.devtools.build.lib.analysis;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMap.Builder;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -33,19 +31,18 @@ public abstract class FileConfiguredTarget extends AbstractConfiguredTarget
implements FileType.HasFilename, LicensesProvider {
private final Artifact artifact;
- private final ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>
- providers;
+ private final TransitiveInfoProviderMap providers;
FileConfiguredTarget(TargetContext targetContext, Artifact artifact) {
super(targetContext);
NestedSet<Artifact> filesToBuild = NestedSetBuilder.create(Order.STABLE_ORDER, artifact);
this.artifact = artifact;
- Builder<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> builder = ImmutableMap
- .<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>builder()
- .put(VisibilityProvider.class, this)
- .put(LicensesProvider.class, this)
- .put(FileProvider.class, new FileProvider(filesToBuild))
- .put(FilesToRunProvider.class, FilesToRunProvider.fromSingleExecutableArtifact(artifact));
+ TransitiveInfoProviderMap.Builder builder =
+ TransitiveInfoProviderMap.builder()
+ .put(VisibilityProvider.class, this)
+ .put(LicensesProvider.class, this)
+ .add(new FileProvider(filesToBuild))
+ .add(FilesToRunProvider.fromSingleExecutableArtifact(artifact));
if (this instanceof FilesetProvider) {
builder.put(FilesetProvider.class, this);
}
@@ -75,7 +72,7 @@ public abstract class FileConfiguredTarget extends AbstractConfiguredTarget
@Override
public <P extends TransitiveInfoProvider> P getProvider(Class<P> provider) {
AnalysisUtils.checkProvider(provider);
- return provider.cast(providers.get(provider));
+ return providers.getProvider(provider);
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java
index 6e01d8ec1f..4c0366690f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java
@@ -13,38 +13,28 @@
// limitations under the License.
package com.google.devtools.build.lib.analysis;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
-
import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.Set;
/**
* A single dependency with its configured target and aspects merged together.
*
- * <p>This is an ephemeral object created only for the analysis of a single configured target.
- * After that configured target is analyzed, this is thrown away.
+ * <p>This is an ephemeral object created only for the analysis of a single configured target. After
+ * that configured target is analyzed, this is thrown away.
*/
-public class MergedConfiguredTarget extends AbstractConfiguredTarget {
+public final class MergedConfiguredTarget extends AbstractConfiguredTarget {
private final ConfiguredTarget base;
- private final ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>
- providers;
+ private final TransitiveInfoProviderMap providers;
- private MergedConfiguredTarget(ConfiguredTarget base,
- ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> providers) {
+ private MergedConfiguredTarget(ConfiguredTarget base, TransitiveInfoProviderMap providers) {
super(base.getTarget(), base.getConfiguration());
this.base = base;
this.providers = providers;
}
- /**
- * Returns a value provided by this target. Only meant to use from Skylark.
- */
+ /** Returns a value provided by this target. Only meant to use from Skylark. */
@Override
public Object get(String providerKey) {
return getProvider(SkylarkProviders.class).getValue(providerKey);
@@ -54,29 +44,21 @@ public class MergedConfiguredTarget extends AbstractConfiguredTarget {
public <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass) {
AnalysisUtils.checkProvider(providerClass);
- Object provider = providers.get(providerClass);
+ P provider = providers.getProvider(providerClass);
if (provider == null) {
provider = base.getProvider(providerClass);
}
- return providerClass.cast(provider);
+ return provider;
}
- /**
- * Creates an instance based on a configured target and a set of aspects.
- */
- public static ConfiguredTarget of(ConfiguredTarget base,
- Iterable<ConfiguredAspect> aspects) {
+ /** Creates an instance based on a configured target and a set of aspects. */
+ public static ConfiguredTarget of(ConfiguredTarget base, Iterable<ConfiguredAspect> aspects) {
if (Iterables.isEmpty(aspects)) {
// If there are no aspects, don't bother with creating a proxy object
return base;
}
- Set<Class<? extends TransitiveInfoProvider>> providers = new HashSet<>();
-
- ImmutableSet<Class<? extends TransitiveInfoProvider>> baseProviders =
- ImmutableSet.copyOf(providers);
-
// Merge output group providers.
OutputGroupProvider mergedOutputGroupProvider =
OutputGroupProvider.merge(getAllProviders(base, aspects, OutputGroupProvider.class));
@@ -89,36 +71,35 @@ public class MergedConfiguredTarget extends AbstractConfiguredTarget {
ExtraActionArtifactsProvider mergedExtraActionProviders = ExtraActionArtifactsProvider.merge(
getAllProviders(base, aspects, ExtraActionArtifactsProvider.class));
- Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> aspectProviders =
- new LinkedHashMap<>();
+ TransitiveInfoProviderMap.Builder aspectProviders = TransitiveInfoProviderMap.builder();
if (mergedOutputGroupProvider != null) {
- aspectProviders.put(OutputGroupProvider.class, mergedOutputGroupProvider);
+ aspectProviders.add(mergedOutputGroupProvider);
}
if (mergedSkylarkProviders != null) {
- aspectProviders.put(SkylarkProviders.class, mergedSkylarkProviders);
+ aspectProviders.add(mergedSkylarkProviders);
}
if (mergedExtraActionProviders != null) {
- aspectProviders.put(ExtraActionArtifactsProvider.class, mergedExtraActionProviders);
+ aspectProviders.add(mergedExtraActionProviders);
}
for (ConfiguredAspect aspect : aspects) {
for (Map.Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> entry :
aspect.getProviders().entrySet()) {
- if (OutputGroupProvider.class.equals(entry.getKey())
- || SkylarkProviders.class.equals(entry.getKey())
- || ExtraActionArtifactsProvider.class.equals(entry.getKey())) {
+ Class<? extends TransitiveInfoProvider> providerClass = entry.getKey();
+ if (OutputGroupProvider.class.equals(providerClass)
+ || SkylarkProviders.class.equals(providerClass)
+ || ExtraActionArtifactsProvider.class.equals(providerClass)) {
continue;
}
- if (base.getProvider(entry.getKey()) != null
- || aspectProviders.containsKey(entry.getKey())) {
- throw new IllegalStateException("Provider " + entry.getKey() + " provided twice");
+ if (base.getProvider(providerClass) != null || aspectProviders.contains(providerClass)) {
+ throw new IllegalStateException("Provider " + providerClass + " provided twice");
}
- aspectProviders.put(entry.getKey(), entry.getValue());
+ aspectProviders.add(entry.getValue());
}
}
- return new MergedConfiguredTarget(base, ImmutableMap.copyOf(aspectProviders));
+ return new MergedConfiguredTarget(base, aspectProviders.build());
}
private static <T extends TransitiveInfoProvider> List<T> getAllProviders(
@@ -130,7 +111,7 @@ public class MergedConfiguredTarget extends AbstractConfiguredTarget {
}
for (ConfiguredAspect configuredAspect : aspects) {
- final T aspectProvider = configuredAspect.getProvider(providerClass);
+ T aspectProvider = configuredAspect.getProvider(providerClass);
if (aspectProvider == null) {
continue;
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java
index 91af120e62..287923673a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java
@@ -22,15 +22,14 @@ import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.OutputFile;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.util.Preconditions;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import javax.annotation.Nullable;
/**
* A {@link ConfiguredTarget} that is produced by a rule.
*
* <p>Created by {@link RuleConfiguredTargetBuilder}. There is an instance of this class for every
- * analyzed rule. For more information about how analysis works, see
- * {@link com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory}.
+ * analyzed rule. For more information about how analysis works, see {@link
+ * com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory}.
*/
public final class RuleConfiguredTarget extends AbstractConfiguredTarget {
/**
@@ -45,26 +44,26 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget {
DONT_CHECK
}
- private final ImmutableMap<Class<? extends TransitiveInfoProvider>, Object> providers;
+ private final TransitiveInfoProviderMap providers;
private final ImmutableMap<Label, ConfigMatchingProvider> configConditions;
- RuleConfiguredTarget(RuleContext ruleContext,
- Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> providers,
+ RuleConfiguredTarget(
+ RuleContext ruleContext,
+ TransitiveInfoProviderMap providers,
SkylarkProviders skylarkProviders1) {
super(ruleContext);
// We don't use ImmutableMap.Builder here to allow augmenting the initial list of 'default'
// providers by passing them in.
- Map<Class<? extends TransitiveInfoProvider>, Object> providerBuilder = new LinkedHashMap<>();
- providerBuilder.putAll(providers);
- Preconditions.checkState(providerBuilder.containsKey(RunfilesProvider.class));
- Preconditions.checkState(providerBuilder.containsKey(FileProvider.class));
- Preconditions.checkState(providerBuilder.containsKey(FilesToRunProvider.class));
+ TransitiveInfoProviderMap.Builder providerBuilder = providers.toBuilder();
+ Preconditions.checkState(providerBuilder.contains(RunfilesProvider.class));
+ Preconditions.checkState(providerBuilder.contains(FileProvider.class));
+ Preconditions.checkState(providerBuilder.contains(FilesToRunProvider.class));
// Initialize every SkylarkApiProvider
skylarkProviders1.init(this);
- providerBuilder.put(SkylarkProviders.class, skylarkProviders1);
+ providerBuilder.add(skylarkProviders1);
- this.providers = ImmutableMap.copyOf(providerBuilder);
+ this.providers = providerBuilder.build();
this.configConditions = ruleContext.getConfigConditions();
// If this rule is the run_under target, then check that we have an executable; note that
@@ -93,17 +92,12 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget {
return configConditions;
}
+ @Nullable
@Override
public <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass) {
- AnalysisUtils.checkProvider(providerClass);
// TODO(bazel-team): Should aspects be allowed to override providers on the configured target
// class?
- Object provider = providers.get(providerClass);
- if (provider == null) {
- return null;
- } else {
- return providerClass.cast(provider);
- }
+ return providers.getProvider(providerClass);
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
index d111fd6f58..aa925d5a7f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
@@ -59,8 +59,8 @@ import java.util.TreeMap;
*/
public final class RuleConfiguredTargetBuilder {
private final RuleContext ruleContext;
- private final Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> providers =
- new LinkedHashMap<>();
+ private final TransitiveInfoProviderMap.Builder providersBuilder =
+ TransitiveInfoProviderMap.builder();
private final ImmutableMap.Builder<String, Object> skylarkProviders = ImmutableMap.builder();
private final ImmutableMap.Builder<SkylarkClassObjectConstructor.Key, SkylarkClassObject>
skylarkDeclaredProviders = ImmutableMap.builder();
@@ -91,15 +91,15 @@ public final class RuleConfiguredTargetBuilder {
FilesToRunProvider filesToRunProvider = new FilesToRunProvider(
getFilesToRun(runfilesSupport, filesToBuild), runfilesSupport, executable);
- add(FileProvider.class, new FileProvider(filesToBuild));
- add(FilesToRunProvider.class, filesToRunProvider);
+ addProvider(new FileProvider(filesToBuild));
+ addProvider(filesToRunProvider);
addSkylarkTransitiveInfo(FilesToRunProvider.SKYLARK_NAME, filesToRunProvider);
if (runfilesSupport != null) {
// If a binary is built, build its runfiles, too
addOutputGroup(
OutputGroupProvider.HIDDEN_TOP_LEVEL, runfilesSupport.getRunfilesMiddleman());
- } else if (providers.get(RunfilesProvider.class) != null) {
+ } else if (providersBuilder.contains(RunfilesProvider.class)) {
// If we don't have a RunfilesSupport (probably because this is not a binary rule), we still
// want to build the files this rule contributes to runfiles of dependent rules so that we
// report an error if one of these is broken.
@@ -107,9 +107,12 @@ public final class RuleConfiguredTargetBuilder {
// Note that this is a best-effort thing: there is .getDataRunfiles() and all the language-
// specific *RunfilesProvider classes, which we don't add here for reasons that are lost in
// the mists of time.
- addOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL,
- ((RunfilesProvider) providers.get(RunfilesProvider.class))
- .getDefaultRunfiles().getAllArtifacts());
+ addOutputGroup(
+ OutputGroupProvider.HIDDEN_TOP_LEVEL,
+ providersBuilder
+ .getProvider(RunfilesProvider.class)
+ .getDefaultRunfiles()
+ .getAllArtifacts());
}
// Create test action and artifacts if target was successfully initialized
@@ -132,20 +135,19 @@ public final class RuleConfiguredTargetBuilder {
add(OutputGroupProvider.class, new OutputGroupProvider(outputGroups.build()));
}
- addRegisteredProvidersToSkylarkProviders();
-
+ TransitiveInfoProviderMap providers = providersBuilder.build();
+ addRegisteredProvidersToSkylarkProviders(providers);
+
return new RuleConfiguredTarget(
ruleContext,
providers,
new SkylarkProviders(skylarkProviders.build(), skylarkDeclaredProviders.build()));
}
-
- /**
- * Adds skylark providers from a skylark provider registry, and checks for collisions.
- */
- private void addRegisteredProvidersToSkylarkProviders() {
+
+ /** Adds skylark providers from a skylark provider registry, and checks for collisions. */
+ private void addRegisteredProvidersToSkylarkProviders(TransitiveInfoProviderMap providers) {
Map<String, Object> nativeSkylarkProviders = new HashMap<>();
- for (Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> entry :
+ for (Map.Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> entry :
providers.entrySet()) {
if (ruleContext.getSkylarkProviderRegistry().containsValue(entry.getKey())) {
String skylarkName = ruleContext.getSkylarkProviderRegistry().inverse().get(entry.getKey());
@@ -210,56 +212,62 @@ public final class RuleConfiguredTargetBuilder {
}
TestActionBuilder testActionBuilder =
new TestActionBuilder(ruleContext)
- .setInstrumentedFiles(findProvider(InstrumentedFilesProvider.class));
+ .setInstrumentedFiles(providersBuilder.getProvider(InstrumentedFilesProvider.class));
- TestEnvironmentProvider environmentProvider = findProvider(TestEnvironmentProvider.class);
+ TestEnvironmentProvider environmentProvider =
+ providersBuilder.getProvider(TestEnvironmentProvider.class);
if (environmentProvider != null) {
testActionBuilder.addExtraEnv(environmentProvider.getEnvironment());
}
- final TestParams testParams =
+ TestParams testParams =
testActionBuilder
.setFilesToRunProvider(filesToRunProvider)
- .setExecutionRequirements(findProvider(ExecutionInfoProvider.class))
+ .setExecutionRequirements(providersBuilder.getProvider(ExecutionInfoProvider.class))
.setShardCount(explicitShardCount)
.build();
- final ImmutableList<String> testTags =
- ImmutableList.copyOf(ruleContext.getRule().getRuleTags());
+ ImmutableList<String> testTags = ImmutableList.copyOf(ruleContext.getRule().getRuleTags());
return new TestProvider(testParams, testTags);
}
- private <T extends TransitiveInfoProvider> T findProvider(Class<T> clazz) {
- return clazz.cast(providers.get(clazz));
+ /** Add a specific provider. */
+ public <T extends TransitiveInfoProvider> RuleConfiguredTargetBuilder addProvider(
+ TransitiveInfoProvider provider) {
+ providersBuilder.add(provider);
+ return this;
+ }
+
+ /** Add a collection of specific providers. */
+ public <T extends TransitiveInfoProvider> RuleConfiguredTargetBuilder addProviders(
+ Iterable<TransitiveInfoProvider> providers) {
+ providersBuilder.addAll(providers);
+ return this;
+ }
+
+ /** Add a collection of specific providers. */
+ public <T extends TransitiveInfoProvider> RuleConfiguredTargetBuilder addProviders(
+ TransitiveInfoProviderMap providers) {
+ providersBuilder.addAll(providers);
+ return this;
}
+
/**
* Add a specific provider with a given value.
+ *
+ * @deprecated use {@link addProvider}
*/
+ @Deprecated
public <T extends TransitiveInfoProvider> RuleConfiguredTargetBuilder add(Class<T> key, T value) {
return addProvider(key, value);
}
- /**
- * Add a specific provider with a given value.
- */
- public RuleConfiguredTargetBuilder addProvider(
- Class<? extends TransitiveInfoProvider> key, TransitiveInfoProvider value) {
+ /** Add a specific provider with a given value. */
+ public <T extends TransitiveInfoProvider> RuleConfiguredTargetBuilder addProvider(
+ Class<? extends T> key, T value) {
Preconditions.checkNotNull(key);
Preconditions.checkNotNull(value);
- AnalysisUtils.checkProvider(key);
- providers.put(key, value);
- return this;
- }
-
- /**
- * Add multiple providers with given values.
- */
- public RuleConfiguredTargetBuilder addProviders(
- Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> providers) {
- for (Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> provider :
- providers.entrySet()) {
- addProvider(provider.getKey(), provider.getValue());
- }
+ providersBuilder.put(key, value);
return this;
}
@@ -271,7 +279,6 @@ public final class RuleConfiguredTargetBuilder {
*/
public RuleConfiguredTargetBuilder addSkylarkTransitiveInfo(
String name, Object value, Location loc) throws EvalException {
-
SkylarkProviderValidationUtil.validateAndThrowEvalException(name, value, loc);
skylarkProviders.put(name, value);
return this;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java
new file mode 100644
index 0000000000..f0460909fb
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java
@@ -0,0 +1,192 @@
+// Copyright 2014 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 com.google.common.base.Joiner;
+import com.google.common.base.Verify;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.util.Preconditions;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.Immutable;
+
+/** Provides a mapping between a TransitiveInfoProvider class and an instance. */
+@Immutable
+public final class TransitiveInfoProviderMap {
+
+ private final ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> map;
+
+ private TransitiveInfoProviderMap(
+ ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> map) {
+ this.map = map;
+ }
+
+ /** Initializes a {@link TransitiveInfoProviderMap} from the instances provided. */
+ public static TransitiveInfoProviderMap of(TransitiveInfoProvider... providers) {
+ return builder().add(providers).build();
+ }
+
+ /** 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 (P) map.get(getEffectiveProviderClass(providerClass));
+ }
+
+ public ImmutableSet<Map.Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>>
+ entrySet() {
+ return map.entrySet();
+ }
+
+ public ImmutableCollection<TransitiveInfoProvider> values() {
+ return map.values();
+ }
+
+ public Builder toBuilder() {
+ return builder().addAll(map.values());
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ /** A builder for {@link TransitiveInfoProviderMap}. */
+ public static class Builder {
+
+ // TODO(arielb): share the instance with the outerclass and copy on write instead?
+ private final LinkedHashMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>
+ providers = new LinkedHashMap();
+
+ /**
+ * Returns <tt>true</tt> if a {@link TransitiveInfoProvider} has been added for the class
+ * provided.
+ */
+ public boolean contains(Class<? extends TransitiveInfoProvider> providerClass) {
+ return providers.containsKey(providerClass);
+ }
+
+ public <T extends TransitiveInfoProvider> Builder put(
+ Class<? extends T> providerClass, T provider) {
+ Preconditions.checkNotNull(providerClass);
+ Preconditions.checkNotNull(provider);
+ // TODO(arielb): throw an exception if the providerClass is already present?
+ // This is enforced by aspects but RuleConfiguredTarget presents violations
+ // particularly around LicensesProvider
+ providers.put(providerClass, provider);
+ return this;
+ }
+
+ public Builder add(TransitiveInfoProvider provider) {
+ return put(getEffectiveProviderClass(provider), provider);
+ }
+
+ public Builder add(TransitiveInfoProvider... providers) {
+ return addAll(Arrays.asList(providers));
+ }
+
+ public Builder addAll(TransitiveInfoProviderMap providers) {
+ return addAll(providers.values());
+ }
+
+ public Builder addAll(Iterable<TransitiveInfoProvider> providers) {
+ for (TransitiveInfoProvider provider : providers) {
+ add(provider);
+ }
+ return this;
+ }
+
+ @Nullable
+ public <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass) {
+ return (P) providers.get(providerClass);
+ }
+
+ public TransitiveInfoProviderMap build() {
+ return new TransitiveInfoProviderMap(ImmutableMap.copyOf(providers));
+ }
+ }
+
+ private static final LoadingCache<
+ Class<? extends TransitiveInfoProvider>, Class<? extends TransitiveInfoProvider>>
+ EFFECTIVE_PROVIDER_CLASS_CACHE =
+ CacheBuilder.newBuilder()
+ .build(
+ new CacheLoader<
+ Class<? extends TransitiveInfoProvider>,
+ Class<? extends TransitiveInfoProvider>>() {
+
+ private Set<Class<? extends TransitiveInfoProvider>> getDirectImplementations(
+ Class<? extends TransitiveInfoProvider> providerClass) {
+ Set<Class<? extends TransitiveInfoProvider>> result = new LinkedHashSet<>();
+ for (Class<?> clazz : providerClass.getInterfaces()) {
+ if (TransitiveInfoProvider.class.equals(clazz)) {
+ result.add(providerClass);
+ } else if (TransitiveInfoProvider.class.isAssignableFrom(clazz)) {
+ result.addAll(
+ getDirectImplementations(
+ (Class<? extends TransitiveInfoProvider>) clazz));
+ }
+ }
+
+ Class<?> superclass = providerClass.getSuperclass();
+ if (superclass != null
+ && TransitiveInfoProvider.class.isAssignableFrom(superclass)) {
+ result.addAll(
+ getDirectImplementations(
+ (Class<? extends TransitiveInfoProvider>) superclass));
+ }
+ return result;
+ }
+
+ @Override
+ public Class<? extends TransitiveInfoProvider> load(
+ Class<? extends TransitiveInfoProvider> providerClass) {
+ Set<Class<? extends TransitiveInfoProvider>> result =
+ getDirectImplementations(providerClass);
+ Verify.verify(!result.isEmpty()); // impossible
+ Preconditions.checkState(
+ result.size() == 1,
+ "Effective provider class for %s is ambiguous (%s), specify explicitly.",
+ providerClass,
+ Joiner.on(',').join(result));
+ return result.iterator().next();
+ }
+ });
+
+ /**
+ * Provides the effective class for the provider. The effective class is inferred as the sole
+ * class in the provider's inheritence hierarchy that implements {@link TransitiveInfoProvider}
+ * directly. This allows for simple subclasses such as those created by AutoValue, but will fail
+ * if there's any ambiguity as to which implementor of the {@link TransitiveInfoProvider} is
+ * intended. If the provider implements multiple TransitiveInfoProvider interfaces, prefer the
+ * explicit put builder methods.
+ */
+ // TODO(arielb): see if these can be made private?
+ static <T extends TransitiveInfoProvider> Class<T> getEffectiveProviderClass(T provider) {
+ return getEffectiveProviderClass((Class<T>) provider.getClass());
+ }
+
+ private static <T extends TransitiveInfoProvider> Class<T> getEffectiveProviderClass(
+ Class<T> providerClass) {
+ return (Class<T>) EFFECTIVE_PROVIDER_CLASS_CACHE.getUnchecked(providerClass);
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
index a97aef12db..c7e3cd5613 100644
--- a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
@@ -202,9 +202,7 @@ public class AndroidStudioInfoAspect extends NativeAspectClass implements Config
.addOutputGroup(IDE_INFO_TEXT, provider.getIdeInfoTextFiles())
.addOutputGroup(IDE_RESOLVE, provider.getIdeResolveFiles())
.addOutputGroup(IDE_COMPILE, provider.getIdeCompileFiles())
- .addProvider(
- AndroidStudioInfoFilesProvider.class,
- provider);
+ .addProvider(provider);
return builder.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java
index dbfe68f61e..4d31393903 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java
@@ -67,7 +67,6 @@ public class AndroidNeverlinkAspect extends NativeAspectClass implements Configu
return new ConfiguredAspect.Builder(NAME, ruleContext)
.addProvider(
- AndroidNeverLinkLibrariesProvider.class,
AndroidNeverLinkLibrariesProvider.create(
AndroidCommon.collectTransitiveNeverlinkLibraries(
ruleContext,
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 b176e81cc9..c805da5553 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
@@ -51,7 +51,6 @@ import com.google.devtools.build.lib.packages.TriState;
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.JavaRuntimeJarProvider;
-
import java.util.Set;
import java.util.TreeSet;
@@ -115,7 +114,7 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
if (JavaCommon.isNeverLink(ruleContext)) {
return new ConfiguredAspect.Builder(NAME, ruleContext)
- .addProvider(DexArchiveProvider.class, DexArchiveProvider.NEVERLINK)
+ .addProvider(DexArchiveProvider.NEVERLINK)
.build();
}
@@ -130,9 +129,7 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
}
}
}
- return new ConfiguredAspect.Builder(NAME, ruleContext)
- .addProvider(DexArchiveProvider.class, result.build())
- .build();
+ return new ConfiguredAspect.Builder(NAME, ruleContext).addProvider(result.build()).build();
}
private static DexArchiveProvider.Builder createArchiveProviderBuilderFromDeps(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java
index d08ece66cb..0a39076fbd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java
@@ -116,9 +116,7 @@ public final class JackAspect extends NativeAspectClass implements ConfiguredAsp
JavaCommon.isNeverLink(ruleContext)
? jackHelper.compileAsNeverlinkLibrary()
: jackHelper.compileAsLibrary();
- return new ConfiguredAspect.Builder(NAME, ruleContext)
- .addProvider(JackLibraryProvider.class, result)
- .build();
+ return new ConfiguredAspect.Builder(NAME, ruleContext).addProvider(result).build();
}
/** Gets a list of targets on the given LABEL_LIST attribute if it exists, else an empty list. */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
index eaee2ead6e..de7373a8ba 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
@@ -32,7 +32,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.TransitiveInfoProviderMap;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -55,7 +55,6 @@ import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
@@ -133,7 +132,7 @@ public final class CcLibraryHelper {
CppCompileAction.PREPROCESS_ASSEMBLE,
Link.LinkTargetType.STATIC_LIBRARY.getActionName(),
// We need to create pic-specific actions for link actions, as they will produce
- // differently named outputs.
+ // differently named outputs.
Link.LinkTargetType.PIC_STATIC_LIBRARY.getActionName(),
Link.LinkTargetType.INTERFACE_DYNAMIC_LIBRARY.getActionName(),
Link.LinkTargetType.DYNAMIC_LIBRARY.getActionName(),
@@ -155,10 +154,8 @@ public final class CcLibraryHelper {
public FileTypeSet getSourceTypes() {
return sourceTypeSet;
}
-
- /**
- * Returns the set of enabled actions for this category.
- */
+
+ /** Returns the set of enabled actions for this category. */
public Set<String> getActionConfigSet() {
return actionConfigSet;
}
@@ -180,20 +177,21 @@ public final class CcLibraryHelper {
* context.
*/
public static final class Info {
- private final ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>
- providers;
+ private final TransitiveInfoProviderMap.Builder providers;
private final ImmutableMap<String, NestedSet<Artifact>> outputGroups;
private final CcCompilationOutputs compilationOutputs;
private final CcLinkingOutputs linkingOutputs;
private final CcLinkingOutputs linkingOutputsExcludingPrecompiledLibraries;
private final CppCompilationContext context;
- private Info(Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> providers,
+ private Info(
+ TransitiveInfoProviderMap providers,
Map<String, NestedSet<Artifact>> outputGroups,
- CcCompilationOutputs compilationOutputs, CcLinkingOutputs linkingOutputs,
+ CcCompilationOutputs compilationOutputs,
+ CcLinkingOutputs linkingOutputs,
CcLinkingOutputs linkingOutputsExcludingPrecompiledLibraries,
CppCompilationContext context) {
- this.providers = ImmutableMap.copyOf(providers);
+ this.providers = providers.toBuilder();
this.outputGroups = ImmutableMap.copyOf(outputGroups);
this.compilationOutputs = compilationOutputs;
this.linkingOutputs = linkingOutputs;
@@ -202,8 +200,8 @@ public final class CcLibraryHelper {
this.context = context;
}
- public Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> getProviders() {
- return providers;
+ public TransitiveInfoProviderMap getProviders() {
+ return providers.build();
}
public ImmutableMap<String, NestedSet<Artifact>> getOutputGroups() {
@@ -236,11 +234,11 @@ public final class CcLibraryHelper {
* the given builder.
*/
public void addLinkingOutputsTo(NestedSetBuilder<Artifact> filesBuilder) {
- filesBuilder.addAll(LinkerInputs.toLibraryArtifacts(linkingOutputs.getStaticLibraries()));
- filesBuilder.addAll(LinkerInputs.toLibraryArtifacts(linkingOutputs.getPicStaticLibraries()));
- filesBuilder.addAll(LinkerInputs.toNonSolibArtifacts(linkingOutputs.getDynamicLibraries()));
- filesBuilder.addAll(
- LinkerInputs.toNonSolibArtifacts(linkingOutputs.getExecutionDynamicLibraries()));
+ filesBuilder
+ .addAll(LinkerInputs.toLibraryArtifacts(linkingOutputs.getStaticLibraries()))
+ .addAll(LinkerInputs.toLibraryArtifacts(linkingOutputs.getPicStaticLibraries()))
+ .addAll(LinkerInputs.toNonSolibArtifacts(linkingOutputs.getDynamicLibraries()))
+ .addAll(LinkerInputs.toNonSolibArtifacts(linkingOutputs.getExecutionDynamicLibraries()));
}
}
@@ -267,7 +265,7 @@ public final class CcLibraryHelper {
private final List<PathFragment> systemIncludeDirs = new ArrayList<>();
private final List<PathFragment> includeDirs = new ArrayList<>();
private final List<Artifact> linkActionInputs = new ArrayList<>();
-
+
@Nullable private Artifact dynamicLibrary;
private LinkTargetType linkType = LinkTargetType.STATIC_LIBRARY;
private HeadersCheckingMode headersCheckingMode = HeadersCheckingMode.LOOSE;
@@ -288,7 +286,7 @@ public final class CcLibraryHelper {
private final SourceCategory sourceCategory;
private List<VariablesExtension> variablesExtensions = new ArrayList<>();
@Nullable private CppModuleMap injectedCppModuleMap;
-
+
private final FeatureConfiguration featureConfiguration;
/**
@@ -319,22 +317,20 @@ public final class CcLibraryHelper {
CcCommon.configureFeatures(ruleContext, sourceCategory),
sourceCategory);
}
-
+
/**
* Creates a CcLibraryHelper for cpp source files.
*
- * @param ruleContext the RuleContext for the rule being built
- * @param semantics CppSemantics for the build
- * @param featureConfiguration activated features and action configs for the build
+ * @param ruleContext the RuleContext for the rule being built
+ * @param semantics CppSemantics for the build
+ * @param featureConfiguration activated features and action configs for the build
*/
public CcLibraryHelper(
RuleContext ruleContext, CppSemantics semantics, FeatureConfiguration featureConfiguration) {
this(ruleContext, semantics, featureConfiguration, SourceCategory.CC);
}
-
- /**
- * Sets fields that overlap for cc_library and cc_binary rules.
- */
+
+ /** Sets fields that overlap for cc_library and cc_binary rules. */
public CcLibraryHelper fromCommon(CcCommon common) {
this
.addCopts(common.getCopts())
@@ -359,7 +355,7 @@ public final class CcLibraryHelper {
}
return this;
}
-
+
/**
* Adds {@code headers} as public header files. These files will be made visible to dependent
* rules. They may be parsed/preprocessed or compiled into a header module depending on the
@@ -369,7 +365,7 @@ public final class CcLibraryHelper {
addPublicHeaders(Arrays.asList(headers));
return this;
}
-
+
/**
* Adds {@code headers} as public header files. These files will be made visible to dependent
* rules. They may be parsed/preprocessed or compiled into a header module depending on the
@@ -381,7 +377,7 @@ public final class CcLibraryHelper {
}
return this;
}
-
+
/**
* Add the corresponding files as public header files, i.e., these files will not be compiled, but
* are made visible as includes to dependent rules in module maps.
@@ -417,7 +413,7 @@ public final class CcLibraryHelper {
}
return this;
}
-
+
/**
* Add the corresponding files as source files. These may also be header files, in which case they
* will not be compiled, but also not made visible as includes to dependent rules. The given
@@ -448,7 +444,7 @@ public final class CcLibraryHelper {
public CcLibraryHelper addSources(Artifact... sources) {
return addSources(Arrays.asList(sources));
}
-
+
/**
* Adds a header to {@code publicHeaders} and in case header processing is switched on for the
* file type also to compilationUnitSources.
@@ -698,10 +694,8 @@ public final class CcLibraryHelper {
Iterables.addAll(this.includeDirs, includeDirs);
return this;
}
-
- /**
- * Adds the given artifact to the input of any generated link actions.
- */
+
+ /** Adds the given artifact to the input of any generated link actions. */
public CcLibraryHelper addLinkActionInput(Artifact input) {
Preconditions.checkNotNull(input);
this.linkActionInputs.add(input);
@@ -716,16 +710,14 @@ public final class CcLibraryHelper {
this.variablesExtensions.add(variableExtension);
return this;
}
-
- /**
- * Sets the module map artifact for this build.
- */
+
+ /** Sets the module map artifact for this build. */
public CcLibraryHelper setCppModuleMap(CppModuleMap cppModuleMap) {
Preconditions.checkNotNull(cppModuleMap);
this.injectedCppModuleMap = cppModuleMap;
return this;
}
-
+
/**
* Overrides the path for the generated dynamic library - this should only be called if the
* dynamic library is an implicit or explicit output of the rule, i.e., if it is accessible by
@@ -978,14 +970,14 @@ public final class CcLibraryHelper {
// By very careful when adding new providers here - it can potentially affect a lot of rules.
// We should consider merging most of these providers into a single provider.
- Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> providers =
- new LinkedHashMap<>();
- providers.put(CppRunfilesProvider.class,
- new CppRunfilesProvider(cppStaticRunfiles, cppSharedRunfiles));
- providers.put(CppCompilationContext.class, interfaceCompilationContext);
- providers.put(CppDebugFileProvider.class, new CppDebugFileProvider(
- dwoArtifacts.getDwoArtifacts(), dwoArtifacts.getPicDwoArtifacts()));
- providers.put(TransitiveLipoInfoProvider.class, collectTransitiveLipoInfo(ccOutputs));
+ TransitiveInfoProviderMap.Builder providers =
+ TransitiveInfoProviderMap.builder()
+ .add(
+ new CppRunfilesProvider(cppStaticRunfiles, cppSharedRunfiles),
+ interfaceCompilationContext,
+ new CppDebugFileProvider(
+ dwoArtifacts.getDwoArtifacts(), dwoArtifacts.getPicDwoArtifacts()),
+ collectTransitiveLipoInfo(ccOutputs));
Map<String, NestedSet<Artifact>> outputGroups = new TreeMap<>();
if (shouldAddLinkerOutputArtifacts(ruleContext, ccOutputs)) {
@@ -1008,21 +1000,28 @@ public final class CcLibraryHelper {
// TODO(bazel-team): Maybe we can infer these from other data at the places where they are
// used.
if (emitCcNativeLibrariesProvider) {
- providers.put(CcNativeLibraryProvider.class,
- new CcNativeLibraryProvider(collectNativeCcLibraries(ccLinkingOutputs)));
+ providers.add(new CcNativeLibraryProvider(collectNativeCcLibraries(ccLinkingOutputs)));
}
- providers.put(CcExecutionDynamicLibrariesProvider.class,
+ providers.put(
+ CcExecutionDynamicLibrariesProvider.class,
collectExecutionDynamicLibraryArtifacts(ccLinkingOutputs.getExecutionDynamicLibraries()));
boolean forcePic = cppConfiguration.forcePic();
if (emitCcSpecificLinkParamsProvider) {
- providers.put(CcSpecificLinkParamsProvider.class, new CcSpecificLinkParamsProvider(
- createCcLinkParamsStore(ccLinkingOutputs, cppCompilationContext, forcePic)));
+ providers.add(
+ new CcSpecificLinkParamsProvider(
+ createCcLinkParamsStore(ccLinkingOutputs, cppCompilationContext, forcePic)));
} else {
- providers.put(CcLinkParamsProvider.class, new CcLinkParamsProvider(
- createCcLinkParamsStore(ccLinkingOutputs, cppCompilationContext, forcePic)));
+ providers.add(
+ new CcLinkParamsProvider(
+ createCcLinkParamsStore(ccLinkingOutputs, cppCompilationContext, forcePic)));
}
- return new Info(providers, outputGroups, ccOutputs, ccLinkingOutputs, originalLinkingOutputs,
+ return new Info(
+ providers.build(),
+ outputGroups,
+ ccOutputs,
+ ccLinkingOutputs,
+ originalLinkingOutputs,
cppCompilationContext);
}
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 f56a150ea8..cce0ab3735 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
@@ -24,10 +24,7 @@ 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.BiMap;
-import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredAspect;
@@ -36,6 +33,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.TransitiveInfoProviderMap;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -58,7 +56,6 @@ import com.google.devtools.build.lib.rules.proto.ProtoConfiguration;
import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
import com.google.devtools.build.lib.rules.proto.ProtoSupportDataProvider;
import com.google.devtools.build.lib.rules.proto.SupportData;
-import java.util.Map;
import javax.annotation.Nullable;
/** An Aspect which JavaLiteProtoLibrary injects to build Java Lite protos. */
@@ -71,9 +68,7 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
@Nullable private final String jacocoLabel;
- public JavaLiteProtoAspect(
- JavaSemantics javaSemantics,
- @Nullable String jacocoLabel) {
+ public JavaLiteProtoAspect(JavaSemantics javaSemantics, @Nullable String jacocoLabel) {
this.javaSemantics = javaSemantics;
this.jacocoLabel = jacocoLabel;
}
@@ -125,12 +120,6 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
private final SupportData supportData;
/**
- * A map between the ijar and the jar resulting from compiling the code generated for this
- * proto.
- */
- private final BiMap<Artifact, Artifact> compileTimeJarToRuntimeJar = HashBiMap.create();
-
- /**
* Compilation-args from all dependencies, merged together. This is typically the input to a
* Java compilation action.
*/
@@ -153,9 +142,8 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
GET_PROVIDER));
}
- Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> createProviders() {
- ImmutableMap.Builder<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> result =
- ImmutableMap.builder();
+ TransitiveInfoProviderMap createProviders() {
+ TransitiveInfoProviderMap.Builder result = TransitiveInfoProviderMap.builder();
// Represents the result of compiling the code generated for this proto, including all of its
// dependencies.
@@ -178,16 +166,12 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
NestedSetBuilder.<Artifact>stableOrder().add(sourceJar).build();
transitiveOutputJars.add(outputJar);
- result
- .put(
- JavaRuntimeJarAspectProvider.class,
- new JavaRuntimeJarAspectProvider(
- new JavaRuntimeJarProvider(ImmutableList.of(outputJar))))
- .put(
- JavaSourceJarsAspectProvider.class,
- new JavaSourceJarsAspectProvider(
- JavaSourceJarsProvider.create(
- NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars)));
+ result.add(
+ new JavaRuntimeJarAspectProvider(
+ new JavaRuntimeJarProvider(ImmutableList.of(outputJar))),
+ new JavaSourceJarsAspectProvider(
+ JavaSourceJarsProvider.create(
+ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars)));
} else {
// No sources - this proto_library is an alias library, which exports its dependencies.
// Simply propagate the compilation-args from its dependencies.
@@ -195,11 +179,8 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
}
return result
- .put(
- JavaProtoLibraryTransitiveFilesToBuildProvider.class,
- new JavaProtoLibraryTransitiveFilesToBuildProvider(transitiveOutputJars.build()))
- .put(
- JavaCompilationArgsAspectProvider.class,
+ .add(
+ new JavaProtoLibraryTransitiveFilesToBuildProvider(transitiveOutputJars.build()),
new JavaCompilationArgsAspectProvider(generatedCompilationArgsProvider))
.build();
}
@@ -231,9 +212,6 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
LITE_PROTO_RUNTIME_ATTR, Mode.TARGET, JavaCompilationArgsProvider.class))
.setCompilationStrictDepsMode(StrictDepsMode.OFF);
JavaCompilationArgs artifacts = helper.build(javaSemantics);
- compileTimeJarToRuntimeJar.put(
- Iterables.getOnlyElement(artifacts.getCompileTimeJars()),
- Iterables.getOnlyElement(artifacts.getRuntimeJars()));
return helper.buildCompilationArgsProvider(artifacts, true /* isReportedAsStrict */);
}
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 d5cc658588..a9f61557f3 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
@@ -27,7 +27,6 @@ import static com.google.devtools.build.lib.rules.java.proto.JavaProtoLibraryTra
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.devtools.build.lib.actions.Artifact;
@@ -37,6 +36,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.TransitiveInfoProviderMap;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -60,7 +60,6 @@ import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
import com.google.devtools.build.lib.rules.proto.ProtoSupportDataProvider;
import com.google.devtools.build.lib.rules.proto.SupportData;
import java.util.List;
-import java.util.Map;
import javax.annotation.Nullable;
/** An Aspect which JavaProtoLibrary injects to build Java SPEED protos. */
@@ -193,9 +192,8 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
GET_PROVIDER));
}
- Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> createProviders() {
- ImmutableMap.Builder<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> result =
- ImmutableMap.builder();
+ TransitiveInfoProviderMap createProviders() {
+ TransitiveInfoProviderMap.Builder result = TransitiveInfoProviderMap.builder();
// Represents the result of compiling the code generated for this proto, including all of its
// dependencies.
@@ -218,16 +216,12 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
NestedSetBuilder.<Artifact>stableOrder().add(sourceJar).build();
transitiveOutputJars.add(outputJar);
- result
- .put(
- JavaRuntimeJarAspectProvider.class,
- new JavaRuntimeJarAspectProvider(
- new JavaRuntimeJarProvider(ImmutableList.of(outputJar))))
- .put(
- JavaSourceJarsAspectProvider.class,
- new JavaSourceJarsAspectProvider(
- JavaSourceJarsProvider.create(
- NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars)));
+ result.add(
+ new JavaRuntimeJarAspectProvider(
+ new JavaRuntimeJarProvider(ImmutableList.of(outputJar))),
+ new JavaSourceJarsAspectProvider(
+ JavaSourceJarsProvider.create(
+ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars)));
} else {
// No sources - this proto_library is an alias library, which exports its dependencies.
// Simply propagate the compilation-args from its dependencies.
@@ -235,11 +229,8 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
}
return result
- .put(
- JavaProtoLibraryTransitiveFilesToBuildProvider.class,
- new JavaProtoLibraryTransitiveFilesToBuildProvider(transitiveOutputJars.build()))
- .put(
- JavaCompilationArgsAspectProvider.class,
+ .add(
+ new JavaProtoLibraryTransitiveFilesToBuildProvider(transitiveOutputJars.build()),
new JavaCompilationArgsAspectProvider(generatedCompilationArgsProvider))
.build();
}
@@ -303,10 +294,10 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
*/
private ImmutableList<String> constructJavacOpts() {
JavaToolchainProvider toolchain = JavaToolchainProvider.fromRuleContext(ruleContext);
- ImmutableList.Builder<String> listBuilder = ImmutableList.builder();
- listBuilder.addAll(toolchain.getJavacOptions());
- listBuilder.addAll(toolchain.getCompatibleJavacOptions(JavaSemantics.JAVA7_JAVACOPTS_KEY));
- return listBuilder.build();
+ return ImmutableList.<String>builder()
+ .addAll(toolchain.getJavacOptions())
+ .addAll(toolchain.getCompatibleJavacOptions(JavaSemantics.JAVA7_JAVACOPTS_KEY))
+ .build();
}
private <C extends TransitiveInfoProvider> Iterable<C> getDeps(Class<C> clazz) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java
index bcc4ba0d0d..83735730a9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java
@@ -17,7 +17,6 @@ package com.google.devtools.build.lib.rules.objc;
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.objc.J2ObjcSource.SourceType;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
@@ -34,6 +33,7 @@ import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.NativeAspectClass;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.AppleToolchain;
+import com.google.devtools.build.lib.rules.objc.J2ObjcSource.SourceType;
import com.google.devtools.build.lib.rules.proto.ProtoCommon;
import com.google.devtools.build.lib.rules.proto.ProtoConfiguration;
import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
@@ -169,15 +169,14 @@ public abstract class AbstractJ2ObjcProtoAspect extends NativeAspectClass
ruleContext, classMappingFiles);
return new ConfiguredAspect.Builder(getName(), ruleContext)
- .addProvider(
- J2ObjcMappingFileProvider.class,
+ .addProviders(
new J2ObjcMappingFileProvider(
j2ObjcTransitiveHeaderMappingFiles,
j2ObjcTransitiveClassMappingFiles,
NestedSetBuilder.<Artifact>stableOrder().build(),
- NestedSetBuilder.<Artifact>stableOrder().build()))
- .addProvider(ObjcProvider.class, common.getObjcProvider())
- .addProvider(XcodeProvider.class, xcodeProvider)
+ NestedSetBuilder.<Artifact>stableOrder().build()),
+ common.getObjcProvider(),
+ xcodeProvider)
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
index 0579bd7273..1d71768981 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
@@ -216,10 +216,9 @@ public final class IosTest implements RuleConfiguredTargetFactory {
return new RuleConfiguredTargetBuilder(ruleContext)
.setFilesToBuild(filesToBuildBuilder.build())
- .add(XcodeProvider.class, xcodeProvider)
- .add(RunfilesProvider.class, RunfilesProvider.simple(runfiles))
- .add(
- ExecutionInfoProvider.class,
+ .addProvider(xcodeProvider)
+ .addProvider(RunfilesProvider.simple(runfiles))
+ .addProvider(
new ExecutionInfoProvider(ImmutableMap.of(ExecutionRequirements.REQUIRES_DARWIN, "")))
.addProvider(InstrumentedFilesProvider.class, instrumentedFilesProvider)
.addProviders(testSupport.getExtraProviders())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
index 36aa8d3d5f..62168a4500 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
@@ -235,10 +235,9 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF
}
return builder
- .addProvider(J2ObjcMappingFileProvider.class,
- j2ObjcMappingFileProvider(ruleContext, !javaInputFiles.isEmpty()))
- .addProvider(ObjcProvider.class, common.getObjcProvider())
- .addProvider(XcodeProvider.class, xcodeProvider)
+ .addProvider(j2ObjcMappingFileProvider(ruleContext, !javaInputFiles.isEmpty()))
+ .addProvider(common.getObjcProvider())
+ .addProvider(xcodeProvider)
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java
index a33387479d..4184f704f9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoAspect.java
@@ -85,7 +85,7 @@ public class ObjcProtoAspect extends NativeAspectClass implements ConfiguredAspe
// Only add the provider if it has any values, otherwise skip it.
if (!aspectObjcProtoProvider.isEmpty()) {
- aspectBuilder.addProvider(ObjcProtoProvider.class, aspectObjcProtoProvider.build());
+ aspectBuilder.addProvider(aspectObjcProtoProvider.build());
}
return aspectBuilder.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java
index 50ad82d419..8dcab44fd3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java
@@ -14,8 +14,6 @@
package com.google.devtools.build.lib.rules.objc;
-import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.SimulatorRule;
-
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
@@ -28,22 +26,20 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles.Builder;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction;
import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction.Substitution;
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.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.DottedVersion;
+import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.SimulatorRule;
import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider;
import com.google.devtools.build.lib.rules.test.TestEnvironmentProvider;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.util.Preconditions;
-
import java.util.List;
-import java.util.Map;
-
import javax.annotation.Nullable;
/**
@@ -58,7 +54,8 @@ public class TestSupport {
/**
* Registers actions to create all files needed in order to actually run the test.
- * @throws InterruptedException
+ *
+ * @throws InterruptedException
*/
public TestSupport registerTestRunnerActions() throws InterruptedException {
registerTestScriptSubstitutionAction();
@@ -89,7 +86,7 @@ public class TestSupport {
.add(Substitution.of("%(test_app_name)s", baseNameWithoutIpa(testBundleIpa)))
.add(
Substitution.of("%(plugin_jars)s", Artifact.joinRootRelativePaths(":", plugins())));
-
+
substitutions.add(Substitution.ofSpaceSeparatedMap("%(test_env)s", testEnv));
// testHarnessIpa is the app being tested in the case where testBundleIpa is a .xctest bundle.
@@ -245,7 +242,7 @@ public class TestSupport {
* Returns any additional providers that need to be exported to the rule context to the passed
* builder.
*/
- public Map<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> getExtraProviders() {
+ public TransitiveInfoProviderMap getExtraProviders() {
IosDeviceProvider deviceProvider =
ruleContext.getPrerequisite(IosTest.TARGET_DEVICE, Mode.TARGET, IosDeviceProvider.class);
DottedVersion xcodeVersion = deviceProvider.getXcodeVersion();
@@ -263,8 +260,7 @@ public class TestSupport {
envBuilder.put("APPLE_COVERAGE", "1");
}
- return ImmutableMap.<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>of(
- TestEnvironmentProvider.class, new TestEnvironmentProvider(envBuilder.build()));
+ return TransitiveInfoProviderMap.of(new TestEnvironmentProvider(envBuilder.build()));
}
/**