Make ObjcProvider keys accessible to skylark.  This is necessary to allow
skylark native access to ObjcProvider instances.

--
MOS_MIGRATED_REVID=119782586
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 371db1c..ef0bca7 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
@@ -98,6 +98,7 @@
 import com.google.devtools.build.lib.rules.java.JavaToolchainRule;
 import com.google.devtools.build.lib.rules.java.JvmConfigurationLoader;
 import com.google.devtools.build.lib.rules.java.ProguardLibraryRule;
+import com.google.devtools.build.lib.rules.objc.AppleSkylarkCommon;
 import com.google.devtools.build.lib.rules.objc.AppleWatch1ExtensionRule;
 import com.google.devtools.build.lib.rules.objc.AppleWatchExtensionBinaryRule;
 import com.google.devtools.build.lib.rules.objc.ExperimentalObjcLibraryRule;
@@ -235,9 +236,8 @@
   public static final ImmutableMap<String, SkylarkType> skylarkBuiltinJavaObects =
       ImmutableMap.of(
           "android_common", SkylarkType.of(AndroidSkylarkCommon.class),
-          "apple_toolchain", SkylarkType.of(AppleToolchain.class));
-
-
+          "apple_common", SkylarkType.of(AppleSkylarkCommon.class));
+          
   public static void setup(ConfiguredRuleClassProvider.Builder builder) {
     builder
         .addBuildInfoFactory(new BazelJavaBuildInfoFactory())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java
index 99d31f2..8b87724 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java
@@ -44,6 +44,7 @@
   doc = "Utilities for resolving items from the Apple toolchain."
 )
 public class AppleToolchain {
+  
   // These next two strings are shared secrets with the xcrunwrapper.sh to allow
   // expansion of DeveloperDir and SDKRoot and runtime, since they aren't known
   // until compile time on any given build machine.
@@ -78,10 +79,6 @@
           .put("GCC_WARN_UNUSED_VARIABLE", "-Wunused-variable")
           .build();
 
-  private AppleToolchain() {
-    throw new UnsupportedOperationException("static-only");
-  }
-
   /**
    * Returns the platform plist name (for example, iPhoneSimulator) for the platform corresponding
    * to the value of {@code --ios_cpu} in the given configuration.
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
new file mode 100644
index 0000000..4de5488
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
@@ -0,0 +1,46 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.objc;
+
+import com.google.devtools.build.lib.rules.apple.AppleToolchain;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+
+/**
+ * A class that exposes apple rule implementation internals to skylark.
+ */
+@SkylarkModule(
+  name = "apple_common",
+  doc = "Functions for skylark to access internals of the apple rule implementations."
+)
+public class AppleSkylarkCommon {
+  
+  @SkylarkCallable(
+      name = "apple_toolchain",
+      doc = "Utilities for resolving items from the apple toolchain."
+  )
+  public static AppleToolchain getAppleToolchain() {
+    return new AppleToolchain();
+  }
+  
+  @SkylarkCallable(
+      name = "keys",
+      doc = "Retrieves ObjcProvider keys"
+  )
+  public static SkylarkKeyStore getKeys() {
+    return new SkylarkKeyStore();
+  } 
+}
+
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 99968e9..5a33f69 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
@@ -28,6 +28,8 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
 import com.google.devtools.build.lib.rules.cpp.LinkerInputs;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.syntax.ClassObject.SkylarkClassObject;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 import com.google.devtools.build.lib.util.Preconditions;
@@ -64,6 +66,7 @@
    * Represents one of the things this provider can provide transitively. Things are provided as
    * {@link NestedSet}s of type E.
    */
+  @SkylarkModule(name = "Key", doc = "An ObjcProvider key.")
   public static class Key<E> {
     private final Order order;
     private final String skylarkKeyName;
@@ -78,6 +81,7 @@
     /**
      * Returns the name of the collection represented by this key in the Skylark provider.
      */
+    @SkylarkCallable(name = "name", structField = true)
     public String getSkylarkKeyName() {
       return skylarkKeyName;
     }
@@ -331,18 +335,6 @@
     HAS_WATCH1_EXTENSION
   }
 
-  /**
-   * All keys in ObjcProvider that will be passed in the corresponding Skylark provider.
-   */
-  // Only keys for Artifact or primitive types can be in the Skylark provider, as other types
-  // are not supported as Skylark types.
-  private static final ImmutableList<Key<?>> KEYS_FOR_SKYLARK =
-    ImmutableList.<Key<?>>of(LIBRARY, IMPORTED_LIBRARY, LINKED_BINARY, FORCE_LOAD_LIBRARY,
-        FORCE_LOAD_FOR_XCODEGEN, HEADER, SOURCE, DEFINE, ASSET_CATALOG, GENERAL_RESOURCE_FILE,
-        SDK_DYLIB, XCDATAMODEL, MODULE_MAP, MERGE_ZIP, FRAMEWORK_FILE, DEBUG_SYMBOLS,
-        DEBUG_SYMBOLS_PLIST, BREAKPAD_FILE, STORYBOARD, XIB, STRINGS, LINKOPT, J2OBJC_LIBRARY,
-        ROOT_MERGE_ZIP);
-
   private final ImmutableMap<Key<?>, NestedSet<?>> items;
 
   // Items which should be passed to direct dependers, but not transitive dependers.
@@ -392,7 +384,7 @@
    */
   public SkylarkClassObject toSkylarkProvider() {
     ImmutableMap.Builder<String, Object> providerBuilder = ImmutableMap.<String, Object>builder();
-    for (Key<?> key : KEYS_FOR_SKYLARK) {
+    for (Key<?> key : SkylarkKeyStore.KEYS_FOR_SKYLARK) {
       providerBuilder.put(key.getSkylarkKeyName(), new SkylarkNestedSet(key.getType(), get(key)));
     }
     return new SkylarkClassObject(providerBuilder.build(), "No such attribute '%s'");
@@ -405,7 +397,7 @@
    */
   public static ObjcProvider fromSkylarkProvider(SkylarkClassObject skylarkProvider) {
     Builder builder = new Builder();
-    for (Key<?> key : KEYS_FOR_SKYLARK) {
+    for (Key<?> key : SkylarkKeyStore.KEYS_FOR_SKYLARK) {
       SkylarkNestedSet skylarkSet =
           (SkylarkNestedSet) skylarkProvider.getValue(key.getSkylarkKeyName());
       if (skylarkSet != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/SkylarkKeyStore.java b/src/main/java/com/google/devtools/build/lib/rules/objc/SkylarkKeyStore.java
new file mode 100644
index 0000000..0b99bdc
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/SkylarkKeyStore.java
@@ -0,0 +1,246 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.objc;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+
+/**
+ * A container for valid ObjcProvider keys, to be provided to skylark.
+ */
+@SkylarkModule(
+  name = "objc_provider_keys_store",
+  doc = "A container for valid ObjcProvider keys."
+)
+public class SkylarkKeyStore {
+  
+  @SkylarkCallable(
+      name = "library",
+      doc = "Returns a key that gives libraries in this target"
+  )
+  public static Key<Artifact> getLibrary() {
+    return ObjcProvider.LIBRARY;
+  }
+  
+  @SkylarkCallable(
+      name = "imported_library",
+      doc = "Returns a key that gives imported libraries in this target"
+  )
+  public static Key<Artifact> getImportedLibrary() {
+    return ObjcProvider.IMPORTED_LIBRARY;
+  }
+  
+  @SkylarkCallable(
+      name = "linked_binary",
+      doc = "Returns a key that gives single-architecture linked binaries to "
+          + "be combined into a multi-architecture binary"
+  )
+  public static Key<Artifact> getLinkedBinary() {
+    return ObjcProvider.LINKED_BINARY;
+  }
+  
+  @SkylarkCallable(
+      name = "force_load_library",
+      doc = "Returns a key that  gives libraries to laod with the "
+          + "'-force_load' flag."
+  )
+  public static Key<Artifact> getForceLoadLibrary() {
+    return ObjcProvider.FORCE_LOAD_LIBRARY;
+  }
+  
+  @SkylarkCallable(
+      name = "header",
+      doc = "Returns a key that gives all header files."
+  )
+  public static Key<Artifact> getHeader() {
+    return ObjcProvider.HEADER;
+  }
+ 
+  @SkylarkCallable(
+      name = "source",
+      doc = "Returns a key that gives all source files."
+  )
+  public static Key<Artifact> getSource() {
+    return ObjcProvider.SOURCE;
+  }
+
+  @SkylarkCallable(
+      name = "define",
+      doc = "Returns a key that  gives all values in 'defines' attributes."
+  )
+  public static Key<String> getDefine() {
+    return ObjcProvider.DEFINE;
+  }
+
+  @SkylarkCallable(
+      name = "asset_catalog",
+      doc = "Returns the 'ASSET_CATALOG' key."
+  )
+  public static Key<Artifact> getAssetCatalog() {
+    return ObjcProvider.ASSET_CATALOG;
+  }
+  
+  @SkylarkCallable(
+      name = "sdk_dylib",
+      doc = "Returns the 'SDK_DYLIB' key."
+  )
+  public static Key<String> getSdkDylib() {
+    return ObjcProvider.SDK_DYLIB;
+  }
+  
+  @SkylarkCallable(
+      name = "xcdatamodel",
+      doc = "Returns the 'XCDATAMODEL' key."
+  )
+  public static Key<Artifact> getXcDataModel() {
+    return ObjcProvider.XCDATAMODEL;
+  }
+
+  @SkylarkCallable(
+      name = "module_map",
+      doc = "Returns a key that gives clang module maps."
+  )
+  public static Key<Artifact> getModuleMap() {
+    return ObjcProvider.MODULE_MAP;
+  }
+
+  @SkylarkCallable(
+      name = "merge_zip",
+      doc = "Returns a key that gives zips to include in the bundle."
+  )
+  public static Key<Artifact> getMergeZip() {
+    return ObjcProvider.MERGE_ZIP;
+  }
+
+  @SkylarkCallable(
+      name = "root_merge_zip",
+      doc = "Returns a key that gives zips to include outside the bundle."
+  )
+  public static Key<Artifact> getRootMergeZip() {
+    return ObjcProvider.ROOT_MERGE_ZIP;
+  }
+
+  @SkylarkCallable(
+      name = "framework_file",
+      doc = "Returns a key that gives .framework files to be included in "
+          + "compilation and linking."
+  )
+  public static Key<Artifact> getFrameworkFile() {
+    return ObjcProvider.FRAMEWORK_FILE;
+  }
+
+  @SkylarkCallable(
+      name = "debug_symbols",
+      doc = "Returns a key that gives an artifact containing debug symbol "
+          + "information."
+  )
+  public static Key<Artifact> getDebugSymbols() {
+    return ObjcProvider.DEBUG_SYMBOLS;
+  }
+
+  @SkylarkCallable(
+      name = "debug_symbols_plist",
+      doc = "Returns a key that gives an artifact containing the plist "
+          + "on debug symbols."
+  )
+  public static Key<Artifact> getDebugSymbolsPlist() {
+    return ObjcProvider.DEBUG_SYMBOLS_PLIST;
+  }
+  
+  @SkylarkCallable(
+      name = "breakpad_file",
+      doc = "Returns a key that gives the generated breakpad file for crash "
+          + "reporting."
+  )
+  public static Key<Artifact> getBreakpadFile() {
+    return ObjcProvider.BREAKPAD_FILE;
+  }
+  
+  @SkylarkCallable(
+      name = "storyboard",
+      doc = "Returns a key that gives artifacts for storyboard sources."
+  )
+  public static Key<Artifact> getStoryboard() {
+    return ObjcProvider.STORYBOARD;
+  }
+
+  @SkylarkCallable(
+      name = "xib",
+      doc = "Returns a key that gives artifacts for .xib file sources."
+  )
+  public static Key<Artifact> getXib() {
+    return ObjcProvider.XIB;
+  }
+
+  @SkylarkCallable(
+      name = "strings",
+      doc = "Returns a key that gives artifacts for strings source files."
+  )
+  public static Key<Artifact> getStrings() {
+    return ObjcProvider.STRINGS;
+  }
+  
+  @SkylarkCallable(
+      name = "linkopt",
+      doc = "Returns a key that gives linking options from dependencies."
+  )
+  public static Key<String> getLinkopt() {
+    return ObjcProvider.LINKOPT;
+  }
+ 
+  @SkylarkCallable(
+      name = "j2objc_library",
+      doc = "Returns a key that gives static libraries that are built from "
+          + "J2ObjC-translated Java code."
+  )
+  public static Key<Artifact> getJ2ObjcLibrary() {
+    return ObjcProvider.J2OBJC_LIBRARY;
+  }
+  
+  /**
+   * All keys in ObjcProvider that will be passed in the corresponding Skylark provider.
+   */
+  // Only keys for Artifact or primitive types can be in the Skylark provider, as other types
+  // are not supported as Skylark types.
+  // Note: This list is only required to support objcprovider <-> skylarkprovider conversion, which
+  // will be removed in favor of native skylark ObjcProvider access once that is implemented.
+  static final ImmutableList<ObjcProvider.Key<?>> KEYS_FOR_SKYLARK =
+      ImmutableList.<ObjcProvider.Key<?>>of(
+          ObjcProvider.LIBRARY,
+          ObjcProvider.IMPORTED_LIBRARY,
+          ObjcProvider.LINKED_BINARY,
+          ObjcProvider.FORCE_LOAD_LIBRARY,
+          ObjcProvider.HEADER,
+          ObjcProvider.SOURCE,
+          ObjcProvider.DEFINE,
+          ObjcProvider.ASSET_CATALOG,
+          ObjcProvider.SDK_DYLIB,
+          ObjcProvider.XCDATAMODEL,
+          ObjcProvider.MODULE_MAP,
+          ObjcProvider.MERGE_ZIP,
+          ObjcProvider.FRAMEWORK_FILE,
+          ObjcProvider.DEBUG_SYMBOLS,
+          ObjcProvider.DEBUG_SYMBOLS_PLIST,
+          ObjcProvider.BREAKPAD_FILE,
+          ObjcProvider.STORYBOARD,
+          ObjcProvider.XIB,
+          ObjcProvider.STRINGS,
+          ObjcProvider.LINKOPT,
+          ObjcProvider.J2OBJC_LIBRARY,
+          ObjcProvider.ROOT_MERGE_ZIP);
+}