diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build')
35 files changed, 170 insertions, 133 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java index 966471c37f..a5ad97eff9 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java @@ -14,7 +14,6 @@ package com.google.devtools.build.lib.analysis; -import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; @@ -100,15 +99,19 @@ public final class AnalysisUtils { */ public static <S extends TransitiveInfoCollection, C extends TransitiveInfoProvider> Iterable<S> filterByProvider(Iterable<S> prerequisites, final Class<C> provider) { - return Iterables.filter(prerequisites, new Predicate<S>() { - @Override - public boolean apply(S target) { - return target.getProvider(provider) != null; - } - }); + return Iterables.filter(prerequisites, target -> target.getProvider(provider) != null); } /** + * Returns the iterable of collections that have the specified provider. + */ + public static <S extends TransitiveInfoCollection, C extends SkylarkClassObject> Iterable<S> + filterByProvider(Iterable<S> prerequisites, final NativeClassObjectConstructor<C> provider) { + return Iterables.filter(prerequisites, target -> target.get(provider) != null); + } + + + /** * Returns the path of the associated manifest file for the path of a Fileset. Works for both * exec paths and root relative paths. */ 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 6bf2ee2df3..c4afb4f546 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 @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.ClassObjectConstructor; +import com.google.devtools.build.lib.packages.NativeClassObjectConstructor; import com.google.devtools.build.lib.packages.SkylarkClassObject; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.packages.TargetUtils; @@ -212,7 +213,6 @@ public final class RuleConfiguredTargetBuilder { public <T extends TransitiveInfoProvider> RuleConfiguredTargetBuilder addProvider( TransitiveInfoProvider provider) { providersBuilder.add(provider); - maybeAddSkylarkProvider(provider); return this; } @@ -220,9 +220,6 @@ public final class RuleConfiguredTargetBuilder { public <T extends TransitiveInfoProvider> RuleConfiguredTargetBuilder addProviders( Iterable<TransitiveInfoProvider> providers) { providersBuilder.addAll(providers); - for (TransitiveInfoProvider provider : providers) { - maybeAddSkylarkProvider(provider); - } return this; } @@ -250,14 +247,15 @@ public final class RuleConfiguredTargetBuilder { Preconditions.checkNotNull(key); Preconditions.checkNotNull(value); providersBuilder.put(key, value); - maybeAddSkylarkProvider(value); return this; } - protected <T extends TransitiveInfoProvider> void maybeAddSkylarkProvider(T value) { - if (value instanceof TransitiveInfoProvider.WithLegacySkylarkName) { + private <T extends TransitiveInfoProvider> void maybeAddSkylarkLegacyProvider( + SkylarkClassObject value) { + if (value.getConstructor() instanceof NativeClassObjectConstructor.WithLegacySkylarkName) { addSkylarkTransitiveInfo( - ((TransitiveInfoProvider.WithLegacySkylarkName) value).getSkylarkName(), + ((NativeClassObjectConstructor.WithLegacySkylarkName) value.getConstructor()) + .getSkylarkName(), value); } } @@ -328,6 +326,7 @@ public final class RuleConfiguredTargetBuilder { ClassObjectConstructor constructor = provider.getConstructor(); Preconditions.checkState(constructor.isExported()); providersBuilder.put(provider); + maybeAddSkylarkLegacyProvider(provider); return this; } 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 986a93b308..80b2c4e9ca 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,6 +902,17 @@ public final class RuleContext extends TargetContext } /** + * Returns all the providers of the specified type that are listed under the specified attribute + * of this target in the BUILD file, and that contain the specified provider. + */ + public <C extends SkylarkClassObject> + Iterable<? extends TransitiveInfoCollection> getPrerequisitesIf( + String attributeName, Mode mode, final NativeClassObjectConstructor<C> classType) { + return AnalysisUtils.filterByProvider(getPrerequisites(attributeName, mode), classType); + } + + + /** * Returns the prerequisite referred to by the specified attribute. Also checks whether * the attribute is marked as executable and that the target referred to can actually be * executed. @@ -2094,7 +2105,7 @@ public final class RuleContext extends TargetContext String missingProviders = getMissingMandatoryProviders(prerequisite, attribute); if (missingProviders != null) { unfulfilledRequirements.add( - "'" + prerequisite.getLabel() + "' does not have mandatory provider " + "'" + prerequisite.getLabel() + "' does not have mandatory providers: " + missingProviders); hadAllMandatoryProviders = false; } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProvider.java index 9ee8933366..f2b49195a5 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProvider.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProvider.java @@ -61,18 +61,4 @@ package com.google.devtools.build.lib.analysis; */ public interface TransitiveInfoProvider { - /** - * Implement this to mark that a native provider should be exported with - * certain name to Skylark. - * Broken: only works for rules, not for aspects. - * DO NOT USE FOR NEW CODE! - * - * Use native declared providers - * ({@link com.google.devtools.build.lib.packages.NativeClassObjectConstructor}) to - * expose providers to both native and Skylark code. - */ - @Deprecated - interface WithLegacySkylarkName { - String getSkylarkName(); - } } diff --git a/src/main/java/com/google/devtools/build/lib/packages/NativeClassObjectConstructor.java b/src/main/java/com/google/devtools/build/lib/packages/NativeClassObjectConstructor.java index 935e0044e9..6bcce0fc00 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/NativeClassObjectConstructor.java +++ b/src/main/java/com/google/devtools/build/lib/packages/NativeClassObjectConstructor.java @@ -57,6 +57,20 @@ public abstract class NativeClassObjectConstructor<VALUE extends SkylarkClassObj } /** + * Implement this to mark that a native provider should be exported with + * certain name to Skylark. + * Broken: only works for rules, not for aspects. + * DO NOT USE FOR NEW CODE! + * + * Use native declared providers mechanism + * exclusively to expose providers to both native and Skylark code. + */ + @Deprecated + public static interface WithLegacySkylarkName { + String getSkylarkName(); + } + + /** * A constructor for default {@code struct}s. * * <p>Singleton, instance is {@link #STRUCT}. diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetUtil.java index 3113a4cbfc..8d50183680 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetUtil.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetUtil.java @@ -26,7 +26,6 @@ import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.analysis.RunfilesSupport; import com.google.devtools.build.lib.analysis.SkylarkProviderValidationUtil; -import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.events.Location; @@ -350,9 +349,8 @@ public final class SkylarkRuleConfiguredTargetUtil { SkylarkClassObject insStruct = cast("instrumented_files", oldStyleProviders, SkylarkClassObject.class, loc); addInstrumentedFiles(insStruct, ruleContext, builder); - } else if (oldStyleProviders.getValue(key) - instanceof TransitiveInfoProvider.WithLegacySkylarkName) { - builder.addProvider((TransitiveInfoProvider) oldStyleProviders.getValue(key)); + } else if (isNativeDeclaredProviderWithLegacySkylarkName(oldStyleProviders.getValue(key))) { + builder.addNativeDeclaredProvider((SkylarkClassObject) oldStyleProviders.getValue(key)); } else if (!key.equals("providers")) { // We handled providers already. builder.addSkylarkTransitiveInfo(key, oldStyleProviders.getValue(key), loc); @@ -360,6 +358,14 @@ public final class SkylarkRuleConfiguredTargetUtil { } } + private static boolean isNativeDeclaredProviderWithLegacySkylarkName(Object value) { + if (!(value instanceof SkylarkClassObject)) { + return false; + } + return ((SkylarkClassObject) value).getConstructor() + instanceof NativeClassObjectConstructor.WithLegacySkylarkName; + } + /** * Parses keys of (not necessarily a default) provider. If it is an actual default provider, * throws an {@link EvalException} if there are unknown keys. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java index d296905dfc..4028dc47da 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java @@ -121,7 +121,7 @@ public class AppleBinary implements RuleConfiguredTargetFactory { ApplePlatform platform = appleConfiguration.getMultiArchPlatform(platformType); ImmutableListMultimap<BuildConfiguration, ObjcProvider> configurationToNonPropagatedObjcMap = ruleContext.getPrerequisitesByConfiguration( - "non_propagated_deps", Mode.SPLIT, ObjcProvider.class); + "non_propagated_deps", Mode.SPLIT, ObjcProvider.SKYLARK_CONSTRUCTOR); ImmutableListMultimap<BuildConfiguration, TransitiveInfoCollection> configToDepsCollectionMap = ruleContext.getPrerequisitesByConfiguration("deps", Mode.SPLIT); @@ -165,7 +165,7 @@ public class AppleBinary implements RuleConfiguredTargetFactory { ObjcProvider objcProvider = objcProviderBuilder.build(); // TODO(cparsons): Stop propagating ObjcProvider directly from this rule. - targetBuilder.addProvider(ObjcProvider.class, objcProvider); + targetBuilder.addNativeDeclaredProvider(objcProvider); switch (getBinaryType(ruleContext)) { case EXECUTABLE: @@ -266,7 +266,8 @@ public class AppleBinary implements RuleConfiguredTargetFactory { } ObjcProvider bundleLoaderObjcProvider = - ruleContext.getPrerequisite(BUNDLE_LOADER_ATTR_NAME, Mode.TARGET, ObjcProvider.class); + ruleContext.getPrerequisite( + BUNDLE_LOADER_ATTR_NAME, Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR); if (bundleLoaderObjcProvider != null) { dylibProviders.add(bundleLoaderObjcProvider); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java index 49575aa0de..81e0975a4f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java @@ -81,7 +81,7 @@ public class AppleStaticLibrary implements RuleConfiguredTargetFactory { ruleContext.getPrerequisitesByConfiguration("deps", Mode.SPLIT); ImmutableListMultimap<BuildConfiguration, ObjcProvider> configToObjcAvoidDepsMap = ruleContext.getPrerequisitesByConfiguration(AppleStaticLibraryRule.AVOID_DEPS_ATTR_NAME, - Mode.SPLIT, ObjcProvider.class); + Mode.SPLIT, ObjcProvider.SKYLARK_CONSTRUCTOR); ImmutableListMultimap<BuildConfiguration, CcLinkParamsProvider> configToCcAvoidDepsMap = ruleContext.getPrerequisitesByConfiguration(AppleStaticLibraryRule.AVOID_DEPS_ATTR_NAME, Mode.SPLIT, CcLinkParamsProvider.CC_LINK_PARAMS); @@ -181,7 +181,7 @@ public class AppleStaticLibrary implements RuleConfiguredTargetFactory { targetBuilder // TODO(cparsons): Remove ObjcProvider as a direct provider. - .addProvider(ObjcProvider.class, objcProvider) + .addNativeDeclaredProvider(objcProvider) .addNativeDeclaredProvider( new AppleStaticLibraryProvider( ruleIntermediateArtifacts.combinedArchitectureArchive(), @@ -215,7 +215,7 @@ public class AppleStaticLibrary implements RuleConfiguredTargetFactory { .addDefines(ruleContext.getTokenizedStringListAttr("defines")) .addDeps(propagatedDeps) .addDepObjcProviders( - ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class)) + ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR)) .addDepObjcProviders(protosObjcProvider.asSet()) .setIntermediateArtifacts(intermediateArtifacts) .setAlwayslink(false) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryRule.java index cff1acd722..20bc6656f4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryRule.java @@ -18,11 +18,9 @@ import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST; import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates; -import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; -import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RuleClass; @@ -83,8 +81,7 @@ public class AppleStaticLibraryRule implements RuleDefinition { attr(AVOID_DEPS_ATTR_NAME, LABEL_LIST) .direct_compile_time_input() .allowedRuleClasses(ObjcRuleClasses.CompilingRule.ALLOWED_CC_DEPS_RULE_CLASSES) - .mandatoryNativeProviders( - ImmutableList.<Class<? extends TransitiveInfoProvider>>of(ObjcProvider.class)) + .mandatoryProviders(ObjcProvider.SKYLARK_CONSTRUCTOR.id()) .cfg(splitTransitionProvider) .allowedFileTypes() .aspect(objcProtoAspect)) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java index 00c92f4cb7..6ef4b6a9ac 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java @@ -111,7 +111,8 @@ public class AppleStubBinary implements RuleConfiguredTargetFactory { ApplePlatform platform = appleConfiguration.getMultiArchPlatform(platformType); ImmutableListMultimap<BuildConfiguration, ObjcProvider> configurationToDepsMap = - ruleContext.getPrerequisitesByConfiguration("deps", Mode.SPLIT, ObjcProvider.class); + ruleContext.getPrerequisitesByConfiguration( + "deps", Mode.SPLIT, ObjcProvider.SKYLARK_CONSTRUCTOR); Artifact outputArtifact = ObjcRuleClasses.intermediateArtifacts(ruleContext).combinedArchitectureBinary(); @@ -131,7 +132,7 @@ public class AppleStubBinary implements RuleConfiguredTargetFactory { ObjcProvider objcProvider = objcProviderBuilder.build(); // TODO(cparsons): Stop propagating ObjcProvider directly from this rule. - targetBuilder.addProvider(ObjcProvider.class, objcProvider); + targetBuilder.addNativeDeclaredProvider(objcProvider); targetBuilder.addNativeDeclaredProvider( new AppleExecutableBinaryProvider(outputArtifact, objcProvider)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinaryRule.java index f2e2c59a2d..575f001040 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinaryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinaryRule.java @@ -18,11 +18,9 @@ import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST; import static com.google.devtools.build.lib.syntax.Type.STRING; -import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; -import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; @@ -51,8 +49,7 @@ public class AppleStubBinaryRule implements RuleDefinition { .add( attr("deps", LABEL_LIST) .direct_compile_time_input() - .mandatoryNativeProviders( - ImmutableList.<Class<? extends TransitiveInfoProvider>>of(ObjcProvider.class)) + .mandatoryProviders(ObjcProvider.SKYLARK_CONSTRUCTOR.id()) .allowedFileTypes() .cfg(splitTransitionProvider)) /*<!-- #BLAZE_RULE(apple_stub_binary).IMPLICIT_OUTPUTS --> diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java index 79ae78973a..b78dc3d291 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java @@ -183,7 +183,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory RuleConfiguredTargetBuilder targetBuilder = ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build()) - .addProvider(ObjcProvider.class, objcProvider) + .addNativeDeclaredProvider(objcProvider) .addNativeDeclaredProvider(objcProvider) .addProvider( InstrumentedFilesProvider.class, @@ -193,7 +193,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory if (xcTestAppProvider.isPresent()) { // TODO(bazel-team): Stop exporting an XcTestAppProvider once objc_binary no longer creates an // application bundle. - targetBuilder.addProvider(XcTestAppProvider.class, xcTestAppProvider.get()); + targetBuilder.addNativeDeclaredProvider(xcTestAppProvider.get()); } if (maybeRunfilesSupport.isPresent()) { RunfilesSupport runfilesSupport = maybeRunfilesSupport.get(); @@ -230,7 +230,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory .addDepObjcProviders(protosObjcProvider.asSet()) .addNonPropagatedDepObjcProviders( ruleContext.getPrerequisites( - "non_propagated_deps", Mode.TARGET, ObjcProvider.class)) + "non_propagated_deps", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR)) .setIntermediateArtifacts(intermediateArtifacts) .setAlwayslink(false) .setHasModuleMap() diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java index 01d25fb7b9..aafd755c9c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java @@ -269,14 +269,15 @@ final class CompilationAttributes { // missing, its private headers will be treated as public! if (ruleContext.attributes().has("deps", BuildType.LABEL_LIST)) { Iterable<ObjcProvider> providers = - ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class); + ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR); for (ObjcProvider provider : providers) { moduleMaps.addTransitive(provider.get(TOP_LEVEL_MODULE_MAP)); } } if (ruleContext.attributes().has("non_propagated_deps", BuildType.LABEL_LIST)) { Iterable<ObjcProvider> providers = - ruleContext.getPrerequisites("non_propagated_deps", Mode.TARGET, ObjcProvider.class); + ruleContext.getPrerequisites( + "non_propagated_deps", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR); for (ObjcProvider provider : providers) { moduleMaps.addTransitive(provider.get(TOP_LEVEL_MODULE_MAP)); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java index 299ab73c5b..306e4d460e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java @@ -1097,7 +1097,7 @@ public abstract class CompilationSupport { Artifact dummyArchive = Iterables.getOnlyElement( ruleContext - .getPrerequisite("$dummy_lib", Mode.TARGET, ObjcProvider.class) + .getPrerequisite("$dummy_lib", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR) .get(LIBRARY)); CustomCommandLine commandLine = diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java index 4af8cee48d..cd418a338c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java @@ -60,7 +60,7 @@ public class IosApplication extends ReleaseBundlingTargetFactory { @Override protected void validateAttributes(RuleContext ruleContext) { Iterable<ObjcProvider> extensionProviders = ruleContext.getPrerequisites( - "extensions", Mode.TARGET, ObjcProvider.class); + "extensions", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR); if (hasMoreThanOneWatchExtension(extensionProviders, Flag.HAS_WATCH1_EXTENSION) || hasMoreThanOneWatchExtension(extensionProviders, Flag.HAS_WATCH2_EXTENSION)) { ruleContext.attributeError("extensions", "An iOS application can contain exactly one " 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 d1ddc215a0..908020bea4 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 @@ -268,7 +268,7 @@ public final class IosTest implements RuleConfiguredTargetFactory { .addDepObjcProviders(protosObjcProvider.asSet()) .addNonPropagatedDepObjcProviders( ruleContext.getPrerequisites( - "non_propagated_deps", Mode.TARGET, ObjcProvider.class)) + "non_propagated_deps", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR)) .setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext)) .setHasModuleMap(); @@ -283,7 +283,8 @@ public final class IosTest implements RuleConfiguredTargetFactory { ObjcConfiguration config = ruleContext.getFragment(ObjcConfiguration.class); if (config.runMemleaks()) { builder.addDepObjcProviders( - ruleContext.getPrerequisites(MEMLEAKS_DEP_ATTR, Mode.TARGET, ObjcProvider.class)); + ruleContext.getPrerequisites( + MEMLEAKS_DEP_ATTR, Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR)); } return builder.build(); @@ -295,6 +296,7 @@ public final class IosTest implements RuleConfiguredTargetFactory { /** Returns the {@link XcTestAppProvider} of the {@code xctest_app} attribute. */ protected static XcTestAppProvider xcTestAppProvider(RuleContext ruleContext) { - return ruleContext.getPrerequisite(XCTEST_APP_ATTR, Mode.TARGET, XcTestAppProvider.class); + return ruleContext.getPrerequisite( + XCTEST_APP_ATTR, Mode.TARGET, XcTestAppProvider.SKYLARK_CONSTRUCTOR); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java index 55bfea69c0..78aaba6988 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java @@ -21,11 +21,9 @@ import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST; import static com.google.devtools.build.lib.syntax.Type.BOOLEAN; import static com.google.devtools.build.lib.syntax.Type.STRING_LIST; -import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; -import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.Attribute.ComputedDefault; @@ -92,9 +90,7 @@ public class IosTestRule implements RuleDefinition { } }) .allowedFileTypes() - .mandatoryNativeProviders( - ImmutableList.<Class<? extends TransitiveInfoProvider>>of( - XcTestAppProvider.class))) + .mandatoryProviders(XcTestAppProvider.SKYLARK_CONSTRUCTOR.id())) .override( attr(BundlingRule.INFOPLIST_ATTR, LABEL) .value( 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 219eaa51c7..61e99ec6d9 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 @@ -304,7 +304,7 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF return builder .addProvider( exportedJ2ObjcMappingFileProvider(base, ruleContext, directJ2ObjcMappingFileProvider)) - .addProvider(common.getObjcProvider()) + .addNativeDeclaredProvider(common.getObjcProvider()) .build(); } @@ -806,7 +806,7 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF builder.addDepObjcProviders(ruleContext.getPrerequisites( dependentAttribute.getName(), dependentAttribute.getAccessMode(), - ObjcProvider.class)); + ObjcProvider.SKYLARK_CONSTRUCTOR)); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java index e1537d07cd..810ce017de 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java @@ -72,12 +72,13 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory { .build(); Iterable<ObjcProvider> jreDeps = - ruleContext.getPrerequisites("jre_deps", Mode.TARGET, ObjcProvider.class); + ruleContext.getPrerequisites("jre_deps", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR); ObjcProvider.Builder objcProviderBuilder = new ObjcProvider.Builder() .addTransitiveAndPropagate(jreDeps) .addTransitiveAndPropagate( - ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class)); + ruleContext.getPrerequisites( + "deps", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR)); for (ObjcProvider prereq : jreDeps) { objcProviderBuilder.addTransitiveAndPropagate(JRE_LIBRARY, prereq.get(LIBRARY)); } @@ -109,7 +110,6 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory { .add(RunfilesProvider.class, RunfilesProvider.EMPTY) .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider) .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider) - .addProvider(ObjcProvider.class, objcProvider) .addNativeDeclaredProvider(objcProvider) .build(); } 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 9305e8e64d..dd78199c83 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 @@ -258,7 +258,8 @@ public class MultiArchBinarySupport { Iterable<ObjcProvider> additionalDepProviders = Iterables.concat( dylibObjcProviders, - ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class), + ruleContext.getPrerequisites("bundles", Mode.TARGET, + ObjcProvider.SKYLARK_CONSTRUCTOR), protosObjcProvider.asSet()); ObjcCommon common = diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java index dd7eda81fa..9888805be1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java @@ -45,7 +45,6 @@ public class ObjcBundle implements RuleConfiguredTargetFactory { NestedSet<Artifact> filesToBuild = NestedSetBuilder.emptySet(STABLE_ORDER); return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild) - .addProvider(ObjcProvider.class, common.getObjcProvider()) .addNativeDeclaredProvider(common.getObjcProvider()) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java index aa6d9b3b01..c341593973 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java @@ -75,7 +75,6 @@ public class ObjcBundleLibrary implements RuleConfiguredTargetFactory { .build(); return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build()) - .addProvider(ObjcProvider.class, nestedBundleProvider) .addNativeDeclaredProvider(nestedBundleProvider) .build(); } @@ -113,7 +112,7 @@ public class ObjcBundleLibrary implements RuleConfiguredTargetFactory { return new ObjcCommon.Builder(ruleContext) .setResourceAttributes(new ResourceAttributes(ruleContext)) .addDepObjcProviders( - ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class)) + ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR)) .setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext)) .build(); } 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 443144b571..55ac6df555 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 @@ -67,6 +67,8 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; +import com.google.devtools.build.lib.packages.NativeClassObjectConstructor; +import com.google.devtools.build.lib.packages.SkylarkClassObject; import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; @@ -257,7 +259,7 @@ public final class ObjcCommon { ImmutableList.<CcLinkParamsProvider>builder(); for (TransitiveInfoCollection dep : deps) { - addAnyProviders(propagatedObjcDeps, dep, ObjcProvider.class); + addAnyProviders(propagatedObjcDeps, dep, ObjcProvider.SKYLARK_CONSTRUCTOR); addAnyProviders(cppDeps, dep, CppCompilationContext.class); if (isCcLibrary(dep)) { cppDepLinkParams.add(dep.get(CcLinkParamsProvider.CC_LINK_PARAMS)); @@ -279,7 +281,7 @@ public final class ObjcCommon { ImmutableList.<ObjcProvider>builder(); for (TransitiveInfoCollection dep : runtimeDeps) { - addAnyProviders(propagatedDeps, dep, ObjcProvider.class); + addAnyProviders(propagatedDeps, dep, ObjcProvider.SKYLARK_CONSTRUCTOR); } this.runtimeDepObjcProviders = Iterables.concat( this.runtimeDepObjcProviders, propagatedDeps.build()); @@ -290,12 +292,25 @@ public final class ObjcCommon { ImmutableList.Builder<T> listBuilder, TransitiveInfoCollection collection, Class<T> providerClass) { - if (collection.getProvider(providerClass) != null) { - listBuilder.add(collection.getProvider(providerClass)); + T provider = collection.getProvider(providerClass); + if (provider != null) { + listBuilder.add(provider); } return listBuilder; } + private <T extends SkylarkClassObject> ImmutableList.Builder<T> addAnyProviders( + ImmutableList.Builder<T> listBuilder, + TransitiveInfoCollection collection, + NativeClassObjectConstructor<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 * declaring rule. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java index e11a01ef46..701856b775 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java @@ -68,7 +68,6 @@ public class ObjcFramework implements RuleConfiguredTargetFactory { NestedSetBuilder.<Artifact>linkOrder().addAll(frameworkImports).build()); NestedSet<Artifact> filesToBuild = NestedSetBuilder.emptySet(STABLE_ORDER); return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild) - .addProvider(ObjcProvider.class, objcProvider) .addNativeDeclaredProvider(objcProvider) .addNativeDeclaredProvider(frameworkProvider) .build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java index 37c8cb6f87..a1253f0d11 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java @@ -42,7 +42,8 @@ public class ObjcImport implements RuleConfiguredTargetFactory { .addExtraImportLibraries( ruleContext.getPrerequisiteArtifacts("archives", Mode.TARGET).list()) .addDepObjcProviders( - ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class)) + ruleContext.getPrerequisites( + "bundles", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR)) .build(); NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder(); @@ -64,7 +65,6 @@ public class ObjcImport implements RuleConfiguredTargetFactory { new ResourceSupport(ruleContext).validateAttributes(); return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build()) - .addProvider(ObjcProvider.class, common.getObjcProvider()) .addNativeDeclaredProvider(common.getObjcProvider()) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java index 814e3717bc..c45c378549 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java @@ -46,9 +46,10 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory { .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET)) .addRuntimeDeps(ruleContext.getPrerequisites("runtime_deps", Mode.TARGET)) .addDepObjcProviders( - ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class)) + ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR)) .addNonPropagatedDepObjcProviders( - ruleContext.getPrerequisites("non_propagated_deps", Mode.TARGET, ObjcProvider.class)) + ruleContext.getPrerequisites( + "non_propagated_deps", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR)) .setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext)) .setAlwayslink(ruleContext.attributes().get("alwayslink", Type.BOOLEAN)) .setHasModuleMap() @@ -89,7 +90,6 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory { J2ObjcEntryClassProvider.class)).build(); return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build()) - .addProvider(ObjcProvider.class, common.getObjcProvider()) .addNativeDeclaredProvider(common.getObjcProvider()) .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider) .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider) 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 4b9143e8fe..b386e9b083 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 @@ -98,7 +98,7 @@ public class ObjcProtoAspect extends NativeAspectClass implements ConfiguredAspe // (i.e. objc_binary) don't have to depend on it. ObjcProvider protobufObjcProvider = ruleContext.getPrerequisite( - ObjcRuleClasses.PROTO_LIB_ATTR, Mode.TARGET, ObjcProvider.class); + ObjcRuleClasses.PROTO_LIB_ATTR, Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR); aspectObjcProtoProvider.addProtobufHeaders(protobufObjcProvider.get(ObjcProvider.HEADER)); aspectObjcProtoProvider.addProtobufHeaderSearchPaths( protobufObjcProvider.get(ObjcProvider.INCLUDE)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java index 64bdc18eed..ae0d22be15 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java @@ -14,7 +14,6 @@ package com.google.devtools.build.lib.rules.objc; - import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -67,7 +66,6 @@ public class ObjcProtoLibrary implements RuleConfiguredTargetFactory { .addFilesToBuild(filesToBuild); return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build()) - .addProvider(ObjcProvider.class, protoSupport.getObjcProvider().get()) .addNativeDeclaredProvider(protoSupport.getObjcProvider().get()) .build(); } @@ -110,7 +108,7 @@ public class ObjcProtoLibrary implements RuleConfiguredTargetFactory { .addFilesToBuild(filesToBuild); return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build()) - .addProvider(ObjcProvider.class, protoSupport.getObjcProvider()) + .addNativeDeclaredProvider(protoSupport.getObjcProvider()) .build(); } } 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 dfe934a344..4a2081c7a6 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 @@ -25,12 +25,12 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; 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.NativeClassObjectConstructor; +import com.google.devtools.build.lib.packages.NativeClassObjectConstructor.WithLegacySkylarkName; import com.google.devtools.build.lib.packages.SkylarkClassObject; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; import com.google.devtools.build.lib.rules.cpp.CppModuleMap; @@ -55,17 +55,11 @@ import java.util.Map; category = SkylarkModuleCategory.PROVIDER, doc = "A provider for compilation and linking of objc." ) -public final class ObjcProvider extends SkylarkClassObject - implements TransitiveInfoProvider, TransitiveInfoProvider.WithLegacySkylarkName { +public final class ObjcProvider extends SkylarkClassObject { /** Skylark name for the ObjcProvider. */ public static final String SKYLARK_NAME = "objc"; - @Override - public String getSkylarkName() { - return SKYLARK_NAME; - } - /** * Represents one of the things this provider can provide transitively. Things are provided as * {@link NestedSet}s of type E. @@ -506,12 +500,7 @@ public final class ObjcProvider extends SkylarkClassObject /** Skylark constructor and identifier for ObjcProvider. */ public static final NativeClassObjectConstructor<ObjcProvider> SKYLARK_CONSTRUCTOR = - new NativeClassObjectConstructor<ObjcProvider>(ObjcProvider.class, SKYLARK_NAME) { - @Override - public String getErrorMessageFormatForInstances() { - return "ObjcProvider field %s could not be instantiated"; - } - }; + new Constructor(); private ObjcProvider( ImmutableMap<Key<?>, NestedSet<?>> items, @@ -998,4 +987,22 @@ public final class ObjcProvider extends SkylarkClassObject return new ObjcProvider(propagated, nonPropagated, strictDependency, skylarkFields.build()); } } + + private static class Constructor + extends NativeClassObjectConstructor<ObjcProvider> + implements WithLegacySkylarkName { + public Constructor() { + super(ObjcProvider.class, ObjcProvider.SKYLARK_NAME); + } + + @Override + public String getSkylarkName() { + return SKYLARK_NAME; + } + + @Override + public String getErrorMessageFormatForInstances() { + return "ObjcProvider field %s could not be instantiated"; + } + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java index 411a7957f7..a1138a28d6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java @@ -36,7 +36,6 @@ import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesProvider; -import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.cmdline.Label; @@ -673,9 +672,8 @@ public class ObjcRuleClasses { attr("deps", LABEL_LIST) .direct_compile_time_input() .allowedRuleClasses(ALLOWED_CC_DEPS_RULE_CLASSES) - .mandatoryNativeProviders( - ImmutableList.<Class<? extends TransitiveInfoProvider>>of(ObjcProvider.class)) - .allowedFileTypes()) + .mandatoryProviders(ObjcProvider.SKYLARK_CONSTRUCTOR.id()) + .allowedFileTypes()) /* <!-- #BLAZE_RULE($objc_compiling_rule).ATTRIBUTE(runtime_deps) --> The list of framework targets that are late loaded at runtime. They are included in the app bundle but not linked against at build time. @@ -697,8 +695,7 @@ public class ObjcRuleClasses { attr("non_propagated_deps", LABEL_LIST) .direct_compile_time_input() .allowedRuleClasses(ALLOWED_CC_DEPS_RULE_CLASSES) - .mandatoryNativeProviders( - ImmutableList.<Class<? extends TransitiveInfoProvider>>of(ObjcProvider.class)) + .mandatoryProviders(ObjcProvider.SKYLARK_CONSTRUCTOR.id()) .allowedFileTypes()) /* <!-- #BLAZE_RULE($objc_compiling_rule).ATTRIBUTE(defines) --> Extra <code>-D</code> flags to pass to the compiler. They should be in diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java index 053cd56181..9038e68d78 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java @@ -392,7 +392,7 @@ final class ProtobufSupport { } else { commonBuilder.addDepObjcProviders( ruleContext.getPrerequisites( - ObjcRuleClasses.PROTO_LIB_ATTR, Mode.TARGET, ObjcProvider.class)); + ObjcRuleClasses.PROTO_LIB_ATTR, Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR)); } return commonBuilder.build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java index 8139368952..343aa82741 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java @@ -127,7 +127,7 @@ final class ProtocolBuffers2Support { .addIncludes(getIncludes()) .addDepObjcProviders( ruleContext.getPrerequisites( - ObjcRuleClasses.PROTO_LIB_ATTR, Mode.TARGET, ObjcProvider.class)) + ObjcRuleClasses.PROTO_LIB_ATTR, Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR)) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java index 6aa8f487bc..a6d32b3a0c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java @@ -1174,7 +1174,8 @@ public final class ReleaseBundlingSupport { } for (ObjcProvider provider - : ruleContext.getPrerequisites("binary", Mode.DONT_CHECK, ObjcProvider.class)) { + : ruleContext.getPrerequisites( + "binary", Mode.DONT_CHECK, ObjcProvider.SKYLARK_CONSTRUCTOR)) { if (!provider.get(ObjcProvider.MULTI_ARCH_LINKED_BINARIES).isEmpty()) { return Iterables.getOnlyElement(provider.get(ObjcProvider.MULTI_ARCH_LINKED_BINARIES)); } @@ -1189,7 +1190,8 @@ public final class ReleaseBundlingSupport { NestedSetBuilder<Artifact> linkedBinaries = NestedSetBuilder.stableOrder(); for (ObjcProvider provider - : ruleContext.getPrerequisites("binary", Mode.DONT_CHECK, ObjcProvider.class)) { + : ruleContext.getPrerequisites( + "binary", Mode.DONT_CHECK, ObjcProvider.SKYLARK_CONSTRUCTOR)) { linkedBinaries.addTransitive(provider.get(ObjcProvider.LINKED_BINARY)); } @@ -1267,7 +1269,7 @@ public final class ReleaseBundlingSupport { if (ruleContext.attributes().has("binary", BuildType.LABEL)) { for (TransitiveInfoCollection prerequisite : ruleContext.getPrerequisites("binary", Mode.DONT_CHECK)) { - ObjcProvider prerequisiteProvider = prerequisite.getProvider(ObjcProvider.class); + ObjcProvider prerequisiteProvider = prerequisite.get(ObjcProvider.SKYLARK_CONSTRUCTOR); if (prerequisiteProvider != null) { Artifact sourceArtifact = Iterables.getOnlyElement(prerequisiteProvider.get(key), null); if (sourceArtifact != null) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java index 53820e6281..dc5962b7b9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java @@ -80,7 +80,7 @@ public abstract class ReleaseBundlingTargetFactory implements RuleConfiguredTarg RuleConfiguredTargetBuilder targetBuilder = ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build()) - .addProvider(XcTestAppProvider.class, releaseBundlingSupport.xcTestAppProvider()) + .addNativeDeclaredProvider(releaseBundlingSupport.xcTestAppProvider()) .addProvider( InstrumentedFilesProvider.class, InstrumentedFilesCollector.forward(ruleContext, "binary")); @@ -88,7 +88,6 @@ public abstract class ReleaseBundlingTargetFactory implements RuleConfiguredTarg ObjcProvider exposedObjcProvider = exposedObjcProvider(ruleContext, releaseBundlingSupport); if (exposedObjcProvider != null) { targetBuilder - .addProvider(ObjcProvider.class, exposedObjcProvider) .addNativeDeclaredProvider(exposedObjcProvider); } @@ -143,7 +142,7 @@ public abstract class ReleaseBundlingTargetFactory implements RuleConfiguredTarg for (Attribute attribute : dependencyAttributes) { builder.addDepObjcProviders( ruleContext.getPrerequisites( - attribute.getName(), attribute.getAccessMode(), ObjcProvider.class)); + attribute.getName(), attribute.getAccessMode(), ObjcProvider.SKYLARK_CONSTRUCTOR)); } return builder.build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java index 051bcd5dca..a0a306ffc2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java @@ -16,9 +16,9 @@ package com.google.devtools.build.lib.rules.objc; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.NativeClassObjectConstructor; +import com.google.devtools.build.lib.packages.NativeClassObjectConstructor.WithLegacySkylarkName; import com.google.devtools.build.lib.packages.SkylarkClassObject; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; @@ -33,33 +33,21 @@ import com.google.devtools.build.lib.util.Preconditions; "Deprecated. A provider for XCTest apps for testing. This is a legacy provider and should " + "not be used." ) -public final class XcTestAppProvider extends SkylarkClassObject - implements TransitiveInfoProvider, TransitiveInfoProvider.WithLegacySkylarkName { +public final class XcTestAppProvider extends SkylarkClassObject { /** * The skylark struct key name for a rule implementation to use when exporting an ObjcProvider. */ public static final String XCTEST_APP_SKYLARK_PROVIDER_NAME = "xctest_app"; - @Override - public String getSkylarkName() { - return XCTEST_APP_SKYLARK_PROVIDER_NAME; - } - - private static final NativeClassObjectConstructor<XcTestAppProvider> XCTEST_APP_PROVIDER = - new NativeClassObjectConstructor<XcTestAppProvider>( - XcTestAppProvider.class, "xctest_app_provider") { - @Override - public String getErrorMessageFormatForInstances() { - return "XcTestAppProvider field %s could not be instantiated"; - } - }; + public static final NativeClassObjectConstructor<XcTestAppProvider> SKYLARK_CONSTRUCTOR = + new Constructor(); private final Artifact bundleLoader; private final Artifact ipa; private final ObjcProvider objcProvider; XcTestAppProvider(Artifact bundleLoader, Artifact ipa, ObjcProvider objcProvider) { - super(XCTEST_APP_PROVIDER, getSkylarkFields(bundleLoader, ipa, objcProvider)); + super(SKYLARK_CONSTRUCTOR, getSkylarkFields(bundleLoader, ipa, objcProvider)); this.bundleLoader = Preconditions.checkNotNull(bundleLoader); this.ipa = Preconditions.checkNotNull(ipa); this.objcProvider = Preconditions.checkNotNull(objcProvider); @@ -96,4 +84,23 @@ public final class XcTestAppProvider extends SkylarkClassObject .put("objc", objcProvider) .build(); } + + private static class Constructor + extends NativeClassObjectConstructor<XcTestAppProvider> + implements WithLegacySkylarkName { + + private Constructor() { + super(XcTestAppProvider.class, "xctest_app_provider"); + } + + @Override + public String getSkylarkName() { + return XCTEST_APP_SKYLARK_PROVIDER_NAME; + } + + @Override + public String getErrorMessageFormatForInstances() { + return "XcTestAppProvider field %s could not be instantiated"; + } + } } |