diff options
5 files changed, 59 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java index 9e2ca2924e..3eebb2d037 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java @@ -902,10 +902,34 @@ public final class RuleContext extends TargetContext * For a given attribute, returns all declared provider provided by targets of that attribute. * Each declared provider is keyed by the {@link BuildConfiguration} under which the provider was * created. + * + * @deprecated use {@link #getPrerequisitesByConfiguration(String, Mode, BuiltinProvider)} + * instead + */ + @Deprecated + public <C extends Info> + ImmutableListMultimap<BuildConfiguration, C> getPrerequisitesByConfiguration( + String attributeName, Mode mode, final NativeProvider<C> provider) { + ImmutableListMultimap.Builder<BuildConfiguration, C> result = + ImmutableListMultimap.builder(); + for (ConfiguredTargetAndData prerequisite : + getPrerequisiteConfiguredTargetAndTargets(attributeName, mode)) { + C prerequisiteProvider = prerequisite.getConfiguredTarget().get(provider); + if (prerequisiteProvider != null) { + result.put(prerequisite.getConfiguration(), prerequisiteProvider); + } + } + return result.build(); + } + + /** + * For a given attribute, returns all declared provider provided by targets of that attribute. + * Each declared provider is keyed by the {@link BuildConfiguration} under which the provider was + * created. */ public <C extends Info> ImmutableListMultimap<BuildConfiguration, C> getPrerequisitesByConfiguration( - String attributeName, Mode mode, final NativeProvider<C> provider) { + String attributeName, Mode mode, final BuiltinProvider<C> provider) { ImmutableListMultimap.Builder<BuildConfiguration, C> result = ImmutableListMultimap.builder(); for (ConfiguredTargetAndData prerequisite : diff --git a/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java b/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java index b880c97fa8..039f1ef763 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java +++ b/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java @@ -98,4 +98,11 @@ public abstract class BuiltinProvider<T extends Info> implements Provider { throw new EvalException( loc, String.format("'%s' cannot be constructed from Skylark", getPrintableName())); } + + /** + * Returns the identifier of this provider. + */ + public SkylarkProviderIdentifier id() { + return SkylarkProviderIdentifier.forKey(getKey()); + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java index 83d02c1874..2b055fe1f7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTa import com.google.devtools.build.lib.analysis.platform.ToolchainInfo; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.packages.BuiltinProvider; import com.google.devtools.build.lib.packages.Info; import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; @@ -326,6 +327,7 @@ public class MultiArchBinarySupport { return avoidArtifacts.build(); } + @Deprecated // Use BuiltinProvider instead. private static <T extends Info> Iterable<T> getTypedProviders( Iterable<TransitiveInfoCollection> infoCollections, NativeProvider<T> providerClass) { @@ -335,6 +337,15 @@ public class MultiArchBinarySupport { .collect(ImmutableList.toImmutableList()); } + private static <T extends Info> Iterable<T> getTypedProviders( + Iterable<TransitiveInfoCollection> infoCollections, + BuiltinProvider<T> providerClass) { + return Streams.stream(infoCollections) + .filter(infoCollection -> infoCollection.get(providerClass) != null) + .map(infoCollection -> infoCollection.get(providerClass)) + .collect(ImmutableList.toImmutableList()); + } + private static <T extends TransitiveInfoProvider> Iterable<T> getTypedProviders( Iterable<TransitiveInfoCollection> infoCollections, Class<T> providerClass) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java index 6a31693cc4..998971d4e5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java @@ -62,6 +62,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode; +import com.google.devtools.build.lib.packages.BuiltinProvider; import com.google.devtools.build.lib.packages.Info; import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.rules.apple.AppleToolchain; @@ -302,6 +303,7 @@ public final class ObjcCommon { return this; } + @Deprecated // Use the BuiltinProvider method instead. private <T extends Info> ImmutableList.Builder<T> addAnyProviders( ImmutableList.Builder<T> listBuilder, TransitiveInfoCollection collection, @@ -313,6 +315,16 @@ public final class ObjcCommon { return listBuilder; } + private <T extends Info> ImmutableList.Builder<T> addAnyProviders( + ImmutableList.Builder<T> listBuilder, + TransitiveInfoCollection collection, + BuiltinProvider<T> providerClass) { + T provider = collection.get(providerClass); + if (provider != null) { + listBuilder.add(provider); + } + return listBuilder; + } /** * Add providers which will be exposed both to the declaring rule and to any dependers on the diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java index d67064750b..b700620850 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java @@ -30,8 +30,8 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.packages.BuiltinProvider; import com.google.devtools.build.lib.packages.NativeInfo; -import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.packages.NativeProvider.WithLegacySkylarkName; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore; import com.google.devtools.build.lib.rules.cpp.CcLinkingInfo; @@ -661,7 +661,7 @@ public final class ObjcProvider extends NativeInfo implements ObjcProviderApi<Ar private final ImmutableMap<Key<?>, NestedSet<?>> strictDependencyItems; /** Skylark constructor and identifier for ObjcProvider. */ - public static final NativeProvider<ObjcProvider> SKYLARK_CONSTRUCTOR = new Constructor(); + public static final BuiltinProvider<ObjcProvider> SKYLARK_CONSTRUCTOR = new Constructor(); private ObjcProvider( SkylarkSemantics semantics, @@ -1124,10 +1124,10 @@ public final class ObjcProvider extends NativeInfo implements ObjcProviderApi<Ar } } - private static class Constructor extends NativeProvider<ObjcProvider> + private static class Constructor extends BuiltinProvider<ObjcProvider> implements WithLegacySkylarkName { public Constructor() { - super(ObjcProvider.class, ObjcProvider.SKYLARK_NAME); + super(ObjcProvider.SKYLARK_NAME, ObjcProvider.class); } @Override |