aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-07-14 17:20:25 +0000
committerGravatar Yue Gan <yueg@google.com>2016-07-14 17:46:24 +0000
commite3dc62f2b520d6698776754ef70e916300895330 (patch)
treec7f1a958523ecf7a92131fa8ef080c4016aad15e /src/main/java
parentf52976220cfb4a94c862df4d8fb0aa30c900b583 (diff)
Expose some additional ObjcProvider fields to Skylark.
The new packaging rules need these in order to access resources included in objc_library dependencies of an application. RELNOTES: -- MOS_MIGRATED_REVID=127445152
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BundleableFile.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderSkylarkConverters.java53
4 files changed, 65 insertions, 1 deletions
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 3405fc4131..eff55009d5 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
@@ -54,7 +54,10 @@ public class AppleSkylarkCommon {
@VisibleForTesting
public static final String NOT_SET_ERROR = "Value for key %s must be a set, instead found %s.";
-
+
+ @VisibleForTesting
+ public static final String MISSING_KEY_ERROR = "No value for required key %s was present.";
+
@SkylarkCallable(
name = "apple_toolchain",
doc = "Utilities for resolving items from the apple toolchain."
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleableFile.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleableFile.java
index a6dfeb33fb..bbd3effcbd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleableFile.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleableFile.java
@@ -34,6 +34,12 @@ public final class BundleableFile extends Value<BundleableFile> {
static final int EXECUTABLE_EXTERNAL_FILE_ATTRIBUTE = 0100755 << 16;
static final int DEFAULT_EXTERNAL_FILE_ATTRIBUTE = 0100644 << 16;
+ /** The field in the Skylark struct that holds the {@code bundled} artifact. */
+ static final String BUNDLED_FIELD = "file";
+
+ /** The field in the Skylark struct that holds the {@code bundlePath} string. */
+ static final String BUNDLE_PATH_FIELD = "bundle_path";
+
private final Artifact bundled;
private final String bundlePath;
private final int zipExternalFileAttribute;
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 7bf91b8353..067d2acb8f 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
@@ -383,6 +383,8 @@ public final class ObjcProvider extends SkylarkClassObject implements Transitive
INCLUDE,
INCLUDE_SYSTEM,
GENERAL_RESOURCE_DIR,
+ GENERAL_RESOURCE_FILE,
+ BUNDLE_FILE,
BUNDLE_IMPORT_DIR,
XCASSETS_DIR,
FRAMEWORK_DIR);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderSkylarkConverters.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderSkylarkConverters.java
index 36db3185e5..8d379e7f1c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderSkylarkConverters.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderSkylarkConverters.java
@@ -15,13 +15,18 @@
package com.google.devtools.build.lib.rules.objc;
import static com.google.devtools.build.lib.rules.objc.AppleSkylarkCommon.BAD_SET_TYPE_ERROR;
+import static com.google.devtools.build.lib.rules.objc.AppleSkylarkCommon.MISSING_KEY_ERROR;
import static com.google.devtools.build.lib.rules.objc.AppleSkylarkCommon.NOT_SET_ERROR;
+import static com.google.devtools.build.lib.rules.objc.BundleableFile.BUNDLED_FIELD;
+import static com.google.devtools.build.lib.rules.objc.BundleableFile.BUNDLE_PATH_FIELD;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
+import com.google.devtools.build.lib.syntax.ClassObject.SkylarkClassObject;
+import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.EvalUtils;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
import com.google.devtools.build.lib.syntax.SkylarkType;
@@ -41,6 +46,7 @@ public class ObjcProviderSkylarkConverters {
.put(Artifact.class, new DirectConverter())
.put(String.class, new DirectConverter())
.put(PathFragment.class, new PathFragmentToStringConverter())
+ .put(BundleableFile.class, new BundleableFileToStructConverter())
.build();
/**
@@ -118,6 +124,53 @@ public class ObjcProviderSkylarkConverters {
}
/**
+ * A converter that that translates between a java BundleableFile and a skylark struct.
+ */
+ private static class BundleableFileToStructConverter implements Converter {
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object valueForSkylark(Key<?> javaKey, NestedSet<?> javaValue) {
+ NestedSetBuilder<SkylarkClassObject> result = NestedSetBuilder.stableOrder();
+ for (BundleableFile bundleableFile : (Iterable<BundleableFile>) javaValue) {
+ result.add(new SkylarkClassObject(
+ ImmutableMap.<String, Object>of(
+ BUNDLED_FIELD, bundleableFile.getBundled(),
+ BUNDLE_PATH_FIELD, bundleableFile.getBundlePath()
+ ),
+ "No such attribute '%s'"
+ ));
+ }
+ return SkylarkNestedSet.of(SkylarkClassObject.class, result.build());
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Iterable<?> valueForJava(Key<?> javaKey, Object skylarkValue) {
+ validateTypes(skylarkValue, SkylarkClassObject.class, javaKey.getSkylarkKeyName());
+ NestedSetBuilder<BundleableFile> result = NestedSetBuilder.stableOrder();
+ for (SkylarkClassObject struct : (Iterable<SkylarkClassObject>) skylarkValue) {
+ Artifact artifact;
+ String path;
+ try {
+ artifact = struct.getValue(BUNDLED_FIELD, Artifact.class);
+ path = struct.getValue(BUNDLE_PATH_FIELD, String.class);
+ } catch (EvalException e) {
+ throw new IllegalArgumentException(e.getMessage());
+ }
+ if (artifact == null) {
+ throw new IllegalArgumentException(String.format(MISSING_KEY_ERROR, BUNDLED_FIELD));
+ }
+ if (path == null) {
+ throw new IllegalArgumentException(String.format(MISSING_KEY_ERROR, BUNDLE_PATH_FIELD));
+ }
+ result.add(new BundleableFile(artifact, path));
+ }
+ return result.build();
+ }
+ }
+
+ /**
* Throws an error if the given object is not a nested set of the given type.
*/
private static void validateTypes(Object toCheck, Class<?> expectedSetType, String keyName) {