aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
authorGravatar corysmith <corysmith@google.com>2018-08-03 13:08:49 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-08-03 13:10:14 -0700
commit50eb6a4aba6630f2deb9a634022789f9e766980b (patch)
treef979d80edf948a0ba06375b7a11d5365a1a4548b /src/main/java/com/google/devtools/build/lib/rules
parent6c304abb788b4fd35dd2eb4bb83983985e84c076 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java36
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java53
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceDependencies.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidData.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java24
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());
+ }
}