aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java104
1 files changed, 100 insertions, 4 deletions
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 9f295ba832..cb99971ea5 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
@@ -33,6 +33,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.function.BiConsumer;
import java.util.function.Consumer;
/**
@@ -67,7 +68,52 @@ public final class DataBinding {
/** Contains Android Databinding configuration and resource generation information. */
public interface DataBindingContext {
+
+ /**
+ * Returns the file where data binding's resource processing produces binding xml. For example,
+ * given:
+ *
+ * <pre>{@code
+ * <layout>
+ * <data>
+ * <variable name="foo" type="String" />
+ * </data>
+ * </layout>
+ * <LinearLayout>
+ * ...
+ * </LinearLayout>
+ * }</pre>
+ *
+ * <p>data binding strips out and processes this part:
+ *
+ * <pre>{@code
+ * <data>
+ * <variable name="foo" type="String" />
+ * </data>
+ * }</pre>
+ *
+ * for each layout file with data binding expressions. Since this may produce multiple files,
+ * outputs are zipped up into a single container.
+ */
void supplyLayoutInfo(Consumer<Artifact> consumer);
+
+ /** The javac flags that are needed to configure data binding's annotation processor. */
+ void supplyJavaCoptsUsing(
+ RuleContext ruleContext, boolean isBinary, Consumer<Iterable<String>> consumer);
+
+ /**
+ * Adds data binding's annotation processor as a plugin to the given Java compilation context.
+ *
+ * <p>This, in conjunction with {@link #createAnnotationFile} extends the Java compilation to
+ * translate data binding .xml into corresponding classes.
+ */
+ void supplyAnnotationProcessor(
+ RuleContext ruleContext, BiConsumer<JavaPluginInfoProvider, Iterable<Artifact>> consumer);
+
+ ImmutableList<Artifact> processDeps(RuleContext ruleContext);
+
+ ImmutableList<Artifact> addAnnotationFileToSrcs(
+ ImmutableList<Artifact> srcs, RuleContext ruleContext);
}
private static final class EnabledDataBindingContext implements DataBindingContext {
@@ -84,6 +130,38 @@ public final class DataBinding {
}
@Override
+ public void supplyJavaCoptsUsing(
+ RuleContext ruleContext, boolean isBinary, Consumer<Iterable<String>> consumer) {
+ consumer.accept(getJavacOpts(ruleContext, isBinary));
+ }
+
+ @Override
+ public void supplyAnnotationProcessor(
+ RuleContext ruleContext, BiConsumer<JavaPluginInfoProvider, Iterable<Artifact>> consumer) {
+ consumer.accept(
+ JavaInfo.getProvider(
+ JavaPluginInfoProvider.class,
+ ruleContext.getPrerequisite(
+ DATABINDING_ANNOTATION_PROCESSOR_ATTR, RuleConfiguredTarget.Mode.HOST)),
+ getMetadataOutputs(ruleContext));
+ }
+
+ @Override
+ public ImmutableList<Artifact> processDeps(RuleContext ruleContext) {
+ return DataBinding.processDeps(ruleContext);
+ }
+
+ @Override
+ public ImmutableList<Artifact> addAnnotationFileToSrcs(
+ ImmutableList<Artifact> srcs, RuleContext ruleContext) {
+ final Artifact annotationFile = createAnnotationFile(ruleContext);
+ if (annotationFile != null) {
+ return ImmutableList.<Artifact>builder().addAll(srcs).add(annotationFile).build();
+ }
+ return ImmutableList.of();
+ }
+
+ @Override
public boolean equals(Object o) {
if (this == o) {
return true;
@@ -102,11 +180,29 @@ public final class DataBinding {
}
private static final class DisabledDataBindingContext implements DataBindingContext {
-
@Override
public void supplyLayoutInfo(Consumer<Artifact> consumer) {
// pass
}
+
+ @Override
+ public void supplyJavaCoptsUsing(
+ RuleContext ruleContext, boolean isBinary, Consumer<Iterable<String>> consumer) {}
+
+ @Override
+ public void supplyAnnotationProcessor(
+ RuleContext ruleContext, BiConsumer<JavaPluginInfoProvider, Iterable<Artifact>> consumer) {}
+
+ @Override
+ public ImmutableList<Artifact> processDeps(RuleContext ruleContext) {
+ return ImmutableList.of();
+ }
+
+ @Override
+ public ImmutableList<Artifact> addAnnotationFileToSrcs(
+ ImmutableList<Artifact> srcs, RuleContext ruleContext) {
+ return srcs;
+ }
}
/** Supplies a databinding context from a rulecontext. */
@@ -117,7 +213,7 @@ public final class DataBinding {
return asDisabledDataBindingContext();
}
- /** Supplies a databinding context from a rulecontext. */
+ /** Supplies a databinding context from an action context. */
public static DataBindingContext contextFrom(boolean enabled, ActionConstructionContext context) {
if (enabled) {
return asEnabledDataBindingContextFrom(context);
@@ -131,7 +227,7 @@ public final class DataBinding {
return new EnabledDataBindingContext(actionContext);
}
- /** Supplies a disabled (no-op) DataBindingContext from the action context. */
+ /** Supplies a disabled (no-op) DataBindingContext. */
public static DataBindingContext asDisabledDataBindingContext() {
return new DisabledDataBindingContext();
}
@@ -370,7 +466,7 @@ public final class DataBinding {
* @return the deps' metadata outputs. These need to be staged as compilation inputs to the
* current rule.
*/
- static ImmutableList<Artifact> processDeps(RuleContext ruleContext) {
+ private static ImmutableList<Artifact> processDeps(RuleContext ruleContext) {
ImmutableList.Builder<Artifact> dataBindingJavaInputs = ImmutableList.<Artifact>builder();
if (AndroidResources.definesAndroidResources(ruleContext.attributes())) {
dataBindingJavaInputs.add(DataBinding.getLayoutInfoFile(ruleContext));