diff options
author | 2016-12-13 18:49:28 +0000 | |
---|---|---|
committer | 2016-12-13 21:05:01 +0000 | |
commit | e8cecd90c5bf8c064654600a7412e6287b16dfff (patch) | |
tree | 409ad58ccef8abd6978af27994d72ee9c2cd8fc1 /src/main/java | |
parent | 2f31d60d1454cd324196a5159262c1ba32eabda8 (diff) |
Enables the propagation of the XcodeVersionProperties provider for reading from Skylark.
--
PiperOrigin-RevId: 141912220
MOS_MIGRATED_REVID=141912220
Diffstat (limited to 'src/main/java')
5 files changed, 62 insertions, 12 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 879a1bbe18..202be7b633 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 @@ -849,6 +849,18 @@ public final class RuleContext extends TargetContext } /** + * Returns the declared provider (native and Skylark) for the specified constructor under the + * specified attribute of this target in the BUILD file. May return null if there is no + * TransitiveInfoCollection under the specified attribute. + */ + @Nullable + public SkylarkClassObject getPrerequisite( + String attributeName, Mode mode, final SkylarkClassObjectConstructor.Key skylarkKey) { + TransitiveInfoCollection prerequisite = getPrerequisite(attributeName, mode); + return prerequisite == null ? null : prerequisite.get(skylarkKey); + } + + /** * 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. */ diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java index bafddeea75..c0929ea4ee 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java @@ -34,7 +34,7 @@ public class XcodeVersion implements RuleConfiguredTargetFactory { return new RuleConfiguredTargetBuilder(ruleContext) .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY) - .addProvider(XcodeVersionProperties.class, ruleData.getXcodeVersionProperties()) + .addNativeDeclaredProvider(ruleData.getXcodeVersionProperties()) .build(); } -}
\ No newline at end of file +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersionProperties.java b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersionProperties.java index 13b35814b9..719ecf46e2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersionProperties.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersionProperties.java @@ -17,14 +17,25 @@ package com.google.devtools.build.lib.rules.apple; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.base.Strings; +import com.google.common.collect.ImmutableMap; 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 java.util.Map; import javax.annotation.Nullable; -/** - * A tuple containing information about a version of xcode and its properties. - */ -public class XcodeVersionProperties implements TransitiveInfoProvider { +/** A tuple containing information about a version of xcode and its properties. */ +@Immutable +public class XcodeVersionProperties extends SkylarkClassObject implements TransitiveInfoProvider { + + /** Skylark name for the XcodeVersionProperties provider. */ + public static final String SKYLARK_NAME = "XcodeProperties"; + + /** Skylark constructor and identifier for XcodeVersionProperties provider. */ + public static final SkylarkClassObjectConstructor SKYLARK_CONSTRUCTOR = + SkylarkClassObjectConstructor.createNative(SKYLARK_NAME); + @VisibleForTesting public static final String DEFAULT_IOS_SDK_VERSION = "8.4"; @VisibleForTesting public static final String DEFAULT_WATCHOS_SDK_VERSION = "2.0"; @VisibleForTesting public static final String DEFAULT_MACOSX_SDK_VERSION = "10.10"; @@ -57,14 +68,16 @@ public class XcodeVersionProperties implements TransitiveInfoProvider { } /** - * General constructor. Some (nullable) properties may be left unspecified. In these cases, - * a semi-sensible default will be assigned to the property value. + * General constructor. Some (nullable) properties may be left unspecified. In these cases, a + * semi-sensible default will be assigned to the property value. */ - XcodeVersionProperties(DottedVersion xcodeVersion, + XcodeVersionProperties( + DottedVersion xcodeVersion, @Nullable String defaultIosSdkVersion, @Nullable String defaultWatchosSdkVersion, @Nullable String defaultTvosSdkVersion, @Nullable String defaultMacosxSdkVersion) { + super(SKYLARK_CONSTRUCTOR, getSkylarkFields(xcodeVersion)); this.xcodeVersion = Optional.fromNullable(xcodeVersion); this.defaultIosSdkVersion = (Strings.isNullOrEmpty(defaultIosSdkVersion)) ? DottedVersion.fromString(DEFAULT_IOS_SDK_VERSION) @@ -114,4 +127,12 @@ public class XcodeVersionProperties implements TransitiveInfoProvider { public DottedVersion getDefaultMacosxSdkVersion() { return defaultMacosxSdkVersion; } + + private static Map<String, Object> getSkylarkFields(@Nullable DottedVersion xcodeVersion) { + ImmutableMap.Builder<String, Object> skylarkFields = new ImmutableMap.Builder<>(); + if (xcodeVersion != null) { + skylarkFields.put("xcode_version", xcodeVersion.toString()); + } + return skylarkFields.build(); + } } 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 45380b3cd8..1c048fb9d4 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 @@ -17,9 +17,11 @@ 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.packages.SkylarkClassObjectConstructor; import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.apple.Platform; import com.google.devtools.build.lib.rules.apple.Platform.PlatformType; +import com.google.devtools.build.lib.rules.apple.XcodeVersionProperties; import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key; import com.google.devtools.build.lib.skylarkinterface.Param; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; @@ -107,6 +109,17 @@ public class AppleSkylarkCommon { return platform; } + @SkylarkCallable( + name = XcodeVersionProperties.SKYLARK_NAME, + doc = + "Returns the provider constructor for XcodeVersionProperties. If a target propagates " + + "the XcodeVersionProperties provider, use this as the key with which to retrieve it.", + structField = true + ) + public SkylarkClassObjectConstructor getXcodeVersionPropertiesConstructor() { + return XcodeVersionProperties.SKYLARK_CONSTRUCTOR; + } + @SkylarkSignature( name = "new_objc_provider", objectType = AppleSkylarkCommon.class, diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java index 1e3ad31586..a124577dfe 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java @@ -39,8 +39,12 @@ public final class IosDevice implements RuleConfiguredTargetFactory { AppleConfiguration appleConfiguration = context.getFragment(AppleConfiguration.class); String iosVersionAttribute = context.attributes().get(IosDeviceRule.IOS_VERSION_ATTR_NAME, STRING); - XcodeVersionProperties xcodeVersionProperties = context.getPrerequisite( - IosDeviceRule.XCODE_ATTR_NAME, Mode.TARGET, XcodeVersionProperties.class); + XcodeVersionProperties xcodeVersionProperties = + (XcodeVersionProperties) + context.getPrerequisite( + IosDeviceRule.XCODE_ATTR_NAME, + Mode.TARGET, + XcodeVersionProperties.SKYLARK_CONSTRUCTOR.getKey()); DottedVersion xcodeVersion = null; if (xcodeVersionProperties != null && xcodeVersionProperties.getXcodeVersion().isPresent()) { |