Enables the propagation of the XcodeVersionProperties provider for reading from Skylark.

--
PiperOrigin-RevId: 141912220
MOS_MIGRATED_REVID=141912220
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 879a1bb..202be7b 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 @@
   }
 
   /**
+   * 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 bafddee..c0929ea 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 @@
 
     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 13b3581..719ecf4 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 @@
 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 @@
   }
 
   /**
-   * 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 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 45380b3..1c048fb 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 @@
 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 @@
     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 1e3ad31..a124577 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 @@
     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()) {