diff options
author | 2016-07-14 17:20:25 +0000 | |
---|---|---|
committer | 2016-07-14 17:46:24 +0000 | |
commit | e3dc62f2b520d6698776754ef70e916300895330 (patch) | |
tree | c7f1a958523ecf7a92131fa8ef080c4016aad15e /src/main/java | |
parent | f52976220cfb4a94c862df4d8fb0aa30c900b583 (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')
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) { |