diff options
author | 2016-11-04 21:03:25 +0000 | |
---|---|---|
committer | 2016-11-07 09:52:58 +0000 | |
commit | 6e8e9c081ed9d0fbbc77b3da5248d49ca034e5e8 (patch) | |
tree | ab71b31f430a0bfb86bd1a0cf889fb9fc0e1536c /src | |
parent | a0994dc961eb5a4021d6563cc9ac4a22f5c85000 (diff) |
Adds Skylark support to XcTestAppProvider
--
MOS_MIGRATED_REVID=138231767
Diffstat (limited to 'src')
3 files changed, 84 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index 10f3903741..4560718c22 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -146,6 +146,7 @@ import com.google.devtools.build.lib.rules.objc.ObjcProtoLibraryRule; import com.google.devtools.build.lib.rules.objc.ObjcProvider; import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses; import com.google.devtools.build.lib.rules.objc.ObjcXcodeprojRule; +import com.google.devtools.build.lib.rules.objc.XcTestAppProvider; import com.google.devtools.build.lib.rules.proto.BazelProtoLibraryRule; import com.google.devtools.build.lib.rules.proto.ProtoConfiguration; import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainRule; @@ -551,6 +552,8 @@ public class BazelRuleClassProvider { builder.addBuildInfoFactory(new ObjcBuildInfoFactory()); builder.registerSkylarkProvider( ObjcProvider.OBJC_SKYLARK_PROVIDER_NAME, ObjcProvider.class); + builder.registerSkylarkProvider( + XcTestAppProvider.XCTEST_APP_SKYLARK_PROVIDER_NAME, XcTestAppProvider.class); builder.addSkylarkAccessibleTopLevels("apple_common", new AppleSkylarkCommon()); builder.addConfig(ObjcCommandLineOptions.class, new ObjcConfigurationLoader()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java index 5583c4ece6..45380b3cd8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.objc; import com.google.common.annotations.VisibleForTesting; +import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.packages.SkylarkClassObject; import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.apple.Platform; @@ -156,6 +157,49 @@ public class AppleSkylarkCommon { } }; + @SkylarkSignature( + name = "new_xctest_app_provider", + objectType = AppleSkylarkCommon.class, + returnType = XcTestAppProvider.class, + doc = "Creates a new XcTestAppProvider instance.", + parameters = { + @Param(name = "self", type = AppleSkylarkCommon.class, doc = "The apple_common instance."), + @Param( + name = "bundle_loader", + type = Artifact.class, + named = true, + positional = false, + doc = "The bundle loader for the test. Corresponds to the binary inside the test IPA." + ), + @Param( + name = "ipa", + type = Artifact.class, + named = true, + positional = false, + doc = "The test IPA." + ), + @Param( + name = "objc_provider", + type = ObjcProvider.class, + named = true, + positional = false, + doc = "An ObjcProvider that should be included by tests using this test bundle." + ) + } + ) + public static final BuiltinFunction NEW_XCTEST_APP_PROVIDER = + new BuiltinFunction("new_xctest_app_provider") { + @SuppressWarnings("unused") + // This method is registered statically for skylark, and never called directly. + public XcTestAppProvider invoke( + AppleSkylarkCommon self, + Artifact bundleLoader, + Artifact ipa, + ObjcProvider objcProvider) { + return new XcTestAppProvider(bundleLoader, ipa, objcProvider); + } + }; + static { SkylarkSignatureProcessor.configureSkylarkFunctions(AppleSkylarkCommon.class); } 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 3d47454e2e..3a9656d244 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 @@ -14,21 +14,41 @@ 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.SkylarkClassObject; +import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; import com.google.devtools.build.lib.util.Preconditions; -/** - * Supplies information needed when a dependency serves as an {@code xctest_app}. - */ +/** Supplies information needed when a dependency serves as an {@code xctest_app}. */ @Immutable -public final class XcTestAppProvider implements TransitiveInfoProvider { +@SkylarkModule( + name = "XcTestAppProvider", + category = SkylarkModuleCategory.PROVIDER, + doc = "A provider for XCTest apps for testing." +) +public final class XcTestAppProvider extends SkylarkClassObject implements TransitiveInfoProvider { + /** + * 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"; + + private static final SkylarkClassObjectConstructor XCTEST_APP_PROVIDER = + SkylarkClassObjectConstructor.createNative("xctest_app_provider"); + 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), + "XcTestAppProvider field %s could not be instantiated"); this.bundleLoader = Preconditions.checkNotNull(bundleLoader); this.ipa = Preconditions.checkNotNull(ipa); this.objcProvider = Preconditions.checkNotNull(objcProvider); @@ -41,6 +61,7 @@ public final class XcTestAppProvider implements TransitiveInfoProvider { return bundleLoader; } + /** The test app's IPA. */ public Artifact getIpa() { return ipa; } @@ -50,8 +71,20 @@ public final class XcTestAppProvider implements TransitiveInfoProvider { * {@code xctest_app}. This is <strong>not</strong> a typical {@link ObjcProvider} - it has * certain linker-releated keys omitted, such as {@link ObjcProvider#LIBRARY}, since XcTests have * access to symbols in their test rig without linking them into the main test binary. + * + * <p>The current list of whitelisted values can be found in + * {@link ReleaseBundlingSupport#xcTestAppProvider}. */ public ObjcProvider getObjcProvider() { return objcProvider; } + + private static ImmutableMap<String, Object> getSkylarkFields( + Artifact bundleLoader, Artifact ipa, ObjcProvider objcProvider) { + return new ImmutableMap.Builder<String, Object>() + .put("bundle_loader", bundleLoader) + .put("ipa", ipa) + .put("objc", objcProvider) + .build(); + } } |