From 029dcc7929493f9a2c72daa8720c9ff06e003483 Mon Sep 17 00:00:00 2001 From: Dmitry Lomov Date: Wed, 24 Feb 2016 22:20:34 +0000 Subject: Expose Android resources in Skylark API. Also expose functionality to calculate resource source directory from Android resource artifact. -- MOS_MIGRATED_REVID=115492705 --- .../rules/android/AndroidSkylarkApiProvider.java | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java') diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java index 2580a05b85..707e8ed794 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java @@ -13,9 +13,16 @@ // limitations under the License. package com.google.devtools.build.lib.rules.android; +import com.google.common.base.Function; import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.Iterables; 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.collect.nestedset.Order; import com.google.devtools.build.lib.rules.SkylarkApiProvider; +import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceContainer; +import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceType; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; @@ -100,6 +107,35 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider { return idlInfo; } + @SkylarkCallable( + name = "resources", + structField = true, + doc = "Returns resources defined by this target." + ) + public NestedSet getResources() { + return collectDirectArtifacts(ResourceType.RESOURCES); + } + + private NestedSet collectDirectArtifacts(final ResourceType resources) { + AndroidResourcesProvider provider = getInfo().getProvider(AndroidResourcesProvider.class); + if (provider == null) { + return NestedSetBuilder.emptySet(Order.STABLE_ORDER); + } + // This will iterate over all (direct) resources. If this turns out to be a performance + // problem, {@link ResourceContainer#getArtifacts} can be changed to return NestedSets. + return NestedSetBuilder.wrap( + Order.STABLE_ORDER, + Iterables.concat( + Iterables.transform( + provider.getDirectAndroidResources(), + new Function>() { + @Override + public Iterable apply(ResourceContainer resourceContainer) { + return resourceContainer.getArtifacts(resources); + } + }))); + } + /** * Helper class to provide information about IDLs related to this rule. */ -- cgit v1.2.3