diff options
author | corysmith <corysmith@google.com> | 2018-08-03 13:08:49 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-08-03 13:10:14 -0700 |
commit | 50eb6a4aba6630f2deb9a634022789f9e766980b (patch) | |
tree | f979d80edf948a0ba06375b7a11d5365a1a4548b /src/main/java/com/google/devtools/build/lib/rules | |
parent | 6c304abb788b4fd35dd2eb4bb83983985e84c076 (diff) |
Introduce the DataBindingContext interface as part of centralizing the data binding processing pipeline.
RELNOTES: None
PiperOrigin-RevId: 207312398
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
8 files changed, 128 insertions, 21 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java index a22abd58ea..ebe36bc995 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java @@ -28,6 +28,7 @@ import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.RuleErrorConsumer; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; +import com.google.devtools.build.lib.rules.android.DataBinding.DataBindingContext; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.Arrays; import java.util.LinkedHashSet; @@ -135,24 +136,32 @@ public class AndroidResources { return from( ruleContext, ruleContext.getPrerequisites(resourcesAttr, Mode.TARGET, FileProvider.class), - resourcesAttr); + resourcesAttr, + DataBinding.contextFrom(ruleContext)); } public static AndroidResources from( RuleErrorConsumer errorConsumer, Iterable<FileProvider> resourcesTargets, - String resourcesAttr) + String resourcesAttr, + DataBindingContext dataBindingContext) throws RuleErrorException { - return forResources(errorConsumer, getResources(resourcesTargets), resourcesAttr); + return forResources( + errorConsumer, getResources(resourcesTargets), resourcesAttr, dataBindingContext); } /** Returns an {@link AndroidResources} for a list of resource artifacts. */ @VisibleForTesting public static AndroidResources forResources( - RuleErrorConsumer ruleErrorConsumer, ImmutableList<Artifact> resources, String resourcesAttr) + RuleErrorConsumer ruleErrorConsumer, + ImmutableList<Artifact> resources, + String resourcesAttr, + DataBindingContext dataBindingContext) throws RuleErrorException { return new AndroidResources( - resources, getResourceRoots(ruleErrorConsumer, resources, resourcesAttr)); + resources, + getResourceRoots(ruleErrorConsumer, resources, resourcesAttr), + dataBindingContext); } /** @@ -165,7 +174,8 @@ public class AndroidResources { } static AndroidResources empty() { - return new AndroidResources(ImmutableList.of(), ImmutableList.of()); + return new AndroidResources( + ImmutableList.of(), ImmutableList.of(), DataBinding.asDisabledDataBindingContext()); } /** @@ -182,7 +192,8 @@ public class AndroidResources { Preconditions.checkArgument(resourcesDir.isTreeArtifact()); return new AndroidResources( ImmutableList.of(resourcesDir), - ImmutableList.of(resourcesDir.getExecPath().getChild("res"))); + ImmutableList.of(resourcesDir.getExecPath().getChild("res")), + DataBinding.asDisabledDataBindingContext()); } /** @@ -305,16 +316,20 @@ public class AndroidResources { private final ImmutableList<Artifact> resources; private final ImmutableList<PathFragment> resourceRoots; + private final DataBindingContext dataBindingContext; AndroidResources(AndroidResources other) { - this(other.resources, other.resourceRoots); + this(other.resources, other.resourceRoots, other.dataBindingContext); } @VisibleForTesting public AndroidResources( - ImmutableList<Artifact> resources, ImmutableList<PathFragment> resourceRoots) { + ImmutableList<Artifact> resources, + ImmutableList<PathFragment> resourceRoots, + DataBindingContext dataBindingContext) { this.resources = resources; this.resourceRoots = resourceRoots; + this.dataBindingContext = dataBindingContext; } private static ImmutableList<Artifact> getResources(Iterable<FileProvider> targets) { @@ -396,7 +411,8 @@ public class AndroidResources { return Optional.of( new AndroidResources( filtered.get(), - getResourceRoots(errorConsumer, filtered.get(), DEFAULT_RESOURCES_ATTR))); + getResourceRoots(errorConsumer, filtered.get(), DEFAULT_RESOURCES_ATTR), + dataBindingContext)); } /** Parses these resources. */ diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java index 97583f4def..58fb920d4d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java @@ -169,7 +169,14 @@ public abstract class AndroidSkylarkData AndroidAaptVersion aaptVersion = ctx.getAndroidConfig().getAndroidAaptVersion(); ValidatedAndroidResources validated = - AndroidResources.from(errorReporter, getFileProviders(resources), "resources") + AndroidResources.from( + errorReporter, + getFileProviders(resources), + "resources", + enableDataBinding + ? DataBinding.asEnabledDataBindingContextFrom( + ctx.getActionConstructionContext()) + : DataBinding.asDisabledDataBindingContext()) .process( ctx, manifest.asStampedManifest(), @@ -422,7 +429,11 @@ public abstract class AndroidSkylarkData ctx, getAndroidSemantics(), rawManifest, - AndroidResources.from(errorReporter, getFileProviders(resources), "resource_files"), + AndroidResources.from( + errorReporter, + getFileProviders(resources), + "resource_files", + DataBinding.asDisabledDataBindingContext()), AndroidAssets.from( errorReporter, listFromNoneable(assets, ConfiguredTarget.class), @@ -564,7 +575,13 @@ public abstract class AndroidSkylarkData manifestValues, settings.aaptVersion, AndroidResources.from( - errorReporter, getFileProviders(resources), "resource_files"), + errorReporter, + getFileProviders(resources), + "resource_files", + dataBindingEnabled + ? DataBinding.asEnabledDataBindingContextFrom( + ctx.getActionConstructionContext()) + : DataBinding.asDisabledDataBindingContext()), AndroidAssets.from( errorReporter, listFromNoneable(assets, ConfiguredTarget.class), diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java b/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java index 9ff066a499..86cd131a49 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java @@ -32,6 +32,7 @@ import com.google.devtools.build.lib.vfs.PathFragment; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; /** * Support logic for Bazel's <a @@ -55,15 +56,58 @@ import java.util.List; * * <p>For data binding to work, the corresponding support libraries must be checked into the depot * via the implicit dependencies specified inside this class. - * - * <p>Unless otherwise specified, all methods in this class assume the current rule applies data - * binding. Callers can intelligently trigger this logic by checking {@link #isEnabled}. */ public final class DataBinding { /** The rule attribute supplying data binding's annotation processor. */ public static final String DATABINDING_ANNOTATION_PROCESSOR_ATTR = "$databinding_annotation_processor"; + /** Contains Android Databinding configuration and resource generation information. */ + public interface DataBindingContext { + void supplyLayoutInfo(Consumer<Artifact> consumer); + } + + private static final class EnabledDataBindingContext implements DataBindingContext { + + private final ActionConstructionContext actionConstructionContext; + + private EnabledDataBindingContext(ActionConstructionContext actionConstructionContext) { + this.actionConstructionContext = actionConstructionContext; + } + + @Override + public void supplyLayoutInfo(Consumer<Artifact> consumer) { + consumer.accept(getLayoutInfoFile(actionConstructionContext)); + } + } + + private static final class DisabledDataBindingContext implements DataBindingContext { + + @Override + public void supplyLayoutInfo(Consumer<Artifact> consumer) { + // pass + } + } + + /** Supplies a databinding context from a rulecontext. */ + public static DataBindingContext contextFrom(RuleContext ruleContext) { + if (isEnabled(ruleContext)) { + return asEnabledDataBindingContextFrom(ruleContext); + } + return asDisabledDataBindingContext(); + } + + /** Supplies an enabled DataBindingContext from the action context. */ + public static DataBindingContext asEnabledDataBindingContextFrom( + ActionConstructionContext actionContext) { + return new EnabledDataBindingContext(actionContext); + } + + /** Supplies a disabled (no-op) DataBindingContext from the action context. */ + public static DataBindingContext asDisabledDataBindingContext() { + return new DisabledDataBindingContext(); + } + /** * Annotation processing creates the following metadata files that describe how data binding is * applied. The full file paths include prefixes as implemented in {@link #getMetadataOutputs}. @@ -138,8 +182,7 @@ public final class DataBinding { /** Gets a layout info file with the specified suffix (for use in having different outputs) */ static Artifact getSuffixedInfoFile(ActionConstructionContext context, String suffix) { - return context.getUniqueDirectoryArtifact( - "databinding", "layout-info" + suffix + ".zip"); + return context.getUniqueDirectoryArtifact("databinding", "layout-info" + suffix + ".zip"); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java index 29da58659f..ce3bc207e5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java @@ -96,7 +96,7 @@ public class MergedAndroidResources extends ParsedAndroidResources { other.manifest); } - private MergedAndroidResources( + protected MergedAndroidResources( ParsedAndroidResources other, Artifact mergedResources, Artifact classJar, diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java index 83b49b62d1..e1b2d4c6c6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java @@ -72,7 +72,7 @@ public class ParsedAndroidResources extends AndroidResources this(other, other.symbols, other.compiledSymbols, other.label, manifest); } - private ParsedAndroidResources( + protected ParsedAndroidResources( AndroidResources resources, Artifact symbols, @Nullable Artifact compiledSymbols, diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java index 0a62aea8d2..ab59a6869c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java @@ -264,7 +264,9 @@ public final class ResourceDependencies { .addTransitive(transitiveResourceContainers) .addTransitive(directResourceContainers) .build(), - NestedSetBuilder.<ValidatedAndroidData>naiveLinkOrder().add(newDirectResource).build(), + NestedSetBuilder.<ValidatedAndroidData>naiveLinkOrder() + .add(newDirectResource.export()) + .build(), NestedSetBuilder.<Artifact>naiveLinkOrder() .addTransitive(transitiveResources) .addAll(newDirectResource.getResources()) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidData.java b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidData.java index 4f18b35899..81a5579fed 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidData.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidData.java @@ -62,4 +62,9 @@ public interface ValidatedAndroidData extends CompiledMergableAndroidData, Valid Artifact getMergedResources(); ProcessedAndroidManifest getProcessedManifest(); + + /** Exports an immutable version of this data. */ + default ValidatedAndroidData export() { + return this; + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java index b84803e4f0..de1d6f49b8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java @@ -188,4 +188,28 @@ public class ValidatedAndroidResources extends MergedAndroidResources return Objects.hash( super.hashCode(), rTxt, sourceJar, apk, aapt2RTxt, aapt2SourceJar, staticLibrary); } + + @Override + public ValidatedAndroidData export() { + return new ValidatedAndroidResources( + new MergedAndroidResources( + new ParsedAndroidResources( + // Null out databinding to avoid accidentally propagating ActionCreationContext + new AndroidResources(getResources(), getResourceRoots(), null), + getSymbols(), + getCompiledSymbols(), + getLabel(), + getStampedManifest()), + getMergedResources(), + getClassJar(), + getDataBindingInfoZip(), + getResourceDependencies(), + getProcessedManifest()), + getRTxt(), + getJavaSourceJar(), + getApk(), + getAapt2RTxt(), + getAapt2SourceJar(), + getStaticLibrary()); + } } |