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/com/google/devtools/build/lib/rules/objc/ObjcProviderSkylarkConverters.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/com/google/devtools/build/lib/rules/objc/ObjcProviderSkylarkConverters.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderSkylarkConverters.java | 53 |
1 files changed, 53 insertions, 0 deletions
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) { |