aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-05-04 17:16:09 -0400
committerGravatar Kristina Chodorow <kchodorow@google.com>2017-05-04 19:04:04 -0400
commit4b7aae4907dc3fa24659444c28ee984c8a519d36 (patch)
tree62bf41310dacf5c420f283fbf5af4634e1f87d9c /src/main/java/com/google/devtools/build/lib
parente4512805a20234c6dc5775005e9791293ecb108e (diff)
Make TransitiveInfoProviderMap an interface.
PiperOrigin-RevId: 155125357
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/FileConfiguredTarget.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderEffectiveClassHelper.java93
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java167
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java76
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImmutableMapBased.java57
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java9
11 files changed, 251 insertions, 177 deletions
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 116df6153d..25f2026458 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
@@ -130,7 +130,7 @@ public final class ConfiguredAspect implements Iterable<TransitiveInfoProvider>
}
public static ConfiguredAspect forNonapplicableTarget(AspectDescriptor descriptor) {
- return new ConfiguredAspect(descriptor, TransitiveInfoProviderMap.of());
+ return new ConfiguredAspect(descriptor, new TransitiveInfoProviderMapBuilder().add().build());
}
public static Builder builder(
@@ -142,7 +142,8 @@ public final class ConfiguredAspect implements Iterable<TransitiveInfoProvider>
* Builder for {@link ConfiguredAspect}.
*/
public static class Builder {
- private final TransitiveInfoProviderMap.Builder providers = TransitiveInfoProviderMap.builder();
+ private final TransitiveInfoProviderMapBuilder providers =
+ new TransitiveInfoProviderMapBuilder();
private final Map<String, NestedSetBuilder<Artifact>> outputGroupBuilders = new TreeMap<>();
private final ImmutableMap.Builder<String, Object> skylarkProviderBuilder =
ImmutableMap.builder();
@@ -174,7 +175,7 @@ public final class ConfiguredAspect implements Iterable<TransitiveInfoProvider>
/** Adds a provider to the aspect. */
public Builder addProvider(TransitiveInfoProvider provider) {
Preconditions.checkNotNull(provider);
- addProvider(TransitiveInfoProviderMap.getEffectiveProviderClass(provider), provider);
+ addProvider(TransitiveInfoProviderEffectiveClassHelper.get(provider), provider);
return this;
}
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 7f3f9f6887..399ef6afe6 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
@@ -40,8 +40,8 @@ public abstract class FileConfiguredTarget extends AbstractConfiguredTarget
FileProvider fileProvider = new FileProvider(filesToBuild);
FilesToRunProvider filesToRunProvider =
FilesToRunProvider.fromSingleExecutableArtifact(artifact);
- TransitiveInfoProviderMap.Builder builder =
- TransitiveInfoProviderMap.builder()
+ TransitiveInfoProviderMapBuilder builder =
+ new TransitiveInfoProviderMapBuilder()
.put(VisibilityProvider.class, this)
.put(LicensesProvider.class, this)
.add(fileProvider)
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 aff014fe55..f2a8781c07 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
@@ -78,7 +78,7 @@ public final class MergedConfiguredTarget extends AbstractConfiguredTarget {
ExtraActionArtifactsProvider mergedExtraActionProviders = ExtraActionArtifactsProvider.merge(
getAllProviders(base, aspects, ExtraActionArtifactsProvider.class));
- TransitiveInfoProviderMap.Builder aspectProviders = TransitiveInfoProviderMap.builder();
+ TransitiveInfoProviderMapBuilder aspectProviders = new TransitiveInfoProviderMapBuilder();
if (mergedOutputGroupProvider != null) {
aspectProviders.add(mergedOutputGroupProvider);
}
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 7c285aaf15..4c0785e180 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
@@ -52,7 +52,7 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget {
super(ruleContext);
// We don't use ImmutableMap.Builder here to allow augmenting the initial list of 'default'
// providers by passing them in.
- TransitiveInfoProviderMap.Builder providerBuilder = providers.toBuilder();
+ TransitiveInfoProviderMapBuilder providerBuilder = providers.toBuilder();
Preconditions.checkState(providerBuilder.contains(RunfilesProvider.class));
Preconditions.checkState(providerBuilder.contains(FileProvider.class));
Preconditions.checkState(providerBuilder.contains(FilesToRunProvider.class));
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 512f57654b..a0bf3ad4a1 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
@@ -58,8 +58,8 @@ import java.util.TreeMap;
*/
public final class RuleConfiguredTargetBuilder {
private final RuleContext ruleContext;
- private final TransitiveInfoProviderMap.Builder providersBuilder =
- TransitiveInfoProviderMap.builder();
+ private final TransitiveInfoProviderMapBuilder providersBuilder =
+ new TransitiveInfoProviderMapBuilder();
private final ImmutableMap.Builder<String, Object> skylarkProviders = ImmutableMap.builder();
private final ImmutableMap.Builder<ClassObjectConstructor.Key, SkylarkClassObject>
skylarkDeclaredProviders = ImmutableMap.builder();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderEffectiveClassHelper.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderEffectiveClassHelper.java
new file mode 100644
index 0000000000..c92072f7e7
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderEffectiveClassHelper.java
@@ -0,0 +1,93 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis;
+
+import 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.devtools.build.lib.util.Preconditions;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+/**
+ * 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.
+ */
+class TransitiveInfoProviderEffectiveClassHelper {
+
+ private TransitiveInfoProviderEffectiveClassHelper() {}
+
+ 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();
+ }
+ });
+
+ // TODO(arielb): see if these can be made private?
+ static <T extends TransitiveInfoProvider> Class<T> get(T provider) {
+ return get((Class<T>) provider.getClass());
+ }
+
+ static <T extends TransitiveInfoProvider> Class<T> get(Class<T> providerClass) {
+ return (Class<T>) EFFECTIVE_PROVIDER_CLASS_CACHE.getUnchecked(providerClass);
+ }
+}
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
index f0460909fb..6319cf7123 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java
@@ -14,179 +14,24 @@
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();
- }
+public interface TransitiveInfoProviderMap {
/** 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;
- }
+ <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass);
- @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();
- }
- });
+ ImmutableSet<Map.Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>>
+ entrySet();
- /**
- * 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());
- }
+ ImmutableCollection<TransitiveInfoProvider> values();
- private static <T extends TransitiveInfoProvider> Class<T> getEffectiveProviderClass(
- Class<T> providerClass) {
- return (Class<T>) EFFECTIVE_PROVIDER_CLASS_CACHE.getUnchecked(providerClass);
- }
+ TransitiveInfoProviderMapBuilder toBuilder();
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java
new file mode 100644
index 0000000000..ac68e3b4a1
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java
@@ -0,0 +1,76 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.util.Preconditions;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import javax.annotation.Nullable;
+
+/** A builder for {@link TransitiveInfoProviderMap}. */
+public class TransitiveInfoProviderMapBuilder {
+
+ // 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> TransitiveInfoProviderMapBuilder 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 TransitiveInfoProviderMapBuilder add(TransitiveInfoProvider provider) {
+ return put(TransitiveInfoProviderEffectiveClassHelper.get(provider), provider);
+ }
+
+ public TransitiveInfoProviderMapBuilder add(TransitiveInfoProvider... providers) {
+ return addAll(Arrays.asList(providers));
+ }
+
+ public TransitiveInfoProviderMapBuilder addAll(TransitiveInfoProviderMap providers) {
+ return addAll(providers.values());
+ }
+
+ public TransitiveInfoProviderMapBuilder 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 TransitiveInfoProviderMapImmutableMapBased(ImmutableMap.copyOf(providers));
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImmutableMapBased.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImmutableMapBased.java
new file mode 100644
index 0000000000..dcf27077e5
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImmutableMapBased.java
@@ -0,0 +1,57 @@
+// 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.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import java.util.Map;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.Immutable;
+
+/** Provides a mapping between a TransitiveInfoProvider class and an instance. */
+@Immutable
+final class TransitiveInfoProviderMapImmutableMapBased implements TransitiveInfoProviderMap {
+
+ private final ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> map;
+
+ TransitiveInfoProviderMapImmutableMapBased(
+ ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> map) {
+ this.map = map;
+ }
+
+ /** Returns the instance for the provided providerClass, or <tt>null</tt> if not present. */
+ @Override
+ @Nullable
+ public <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass) {
+ return (P) map.get(TransitiveInfoProviderEffectiveClassHelper.get(providerClass));
+ }
+
+ @Override
+ public ImmutableSet<Map.Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>>
+ entrySet() {
+ return map.entrySet();
+ }
+
+ @Override
+ public ImmutableCollection<TransitiveInfoProvider> values() {
+ return map.values();
+ }
+
+ @Override
+ public TransitiveInfoProviderMapBuilder toBuilder() {
+ return new TransitiveInfoProviderMapBuilder().addAll(map.values());
+ }
+}
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 3aaab4df24..ca2595d4ef 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
@@ -35,6 +35,7 @@ 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.TransitiveInfoProviderMap;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.cmdline.Label;
@@ -182,7 +183,7 @@ public final class CcLibraryHelper {
* context.
*/
public static final class Info {
- private final TransitiveInfoProviderMap.Builder providers;
+ private final TransitiveInfoProviderMapBuilder providers;
private final ImmutableMap<String, NestedSet<Artifact>> outputGroups;
private final CcCompilationOutputs compilationOutputs;
private final CcLinkingOutputs linkingOutputs;
@@ -1038,8 +1039,8 @@ 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.
- TransitiveInfoProviderMap.Builder providers =
- TransitiveInfoProviderMap.builder()
+ TransitiveInfoProviderMapBuilder providers =
+ new TransitiveInfoProviderMapBuilder()
.add(
new CppRunfilesProvider(cppStaticRunfiles, cppSharedRunfiles),
cppCompilationContext,
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 ff419be5e4..239d99111e 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
@@ -22,6 +22,7 @@ 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.analysis.TransitiveInfoProviderMapBuilder;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.packages.ClassObjectConstructor;
import com.google.devtools.build.lib.packages.NativeClassObjectConstructor;
@@ -170,14 +171,14 @@ public final class JavaProvider extends SkylarkClassObject implements Transitive
* A Builder for {@link JavaProvider}.
*/
public static class Builder {
- TransitiveInfoProviderMap.Builder providerMap;
-
- private Builder(TransitiveInfoProviderMap.Builder providerMap) {
+ TransitiveInfoProviderMapBuilder providerMap;
+
+ private Builder(TransitiveInfoProviderMapBuilder providerMap) {
this.providerMap = providerMap;
}
public static Builder create() {
- return new Builder(new TransitiveInfoProviderMap.Builder());
+ return new Builder(new TransitiveInfoProviderMapBuilder());
}
public static Builder copyOf(JavaProvider javaProvider) {