diff options
author | corysmith <corysmith@google.com> | 2018-08-06 09:03:18 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-08-06 09:05:02 -0700 |
commit | 1bb38e101456cd610d0a692595700197a21ce1df (patch) | |
tree | a5db5da9f427313fa724d3c30b566ec6ca2c2a30 /src/main/java/com/google/devtools/build/lib/rules | |
parent | e74c1e91e68ce7c8eca6ab62100647d4b49f4597 (diff) |
Move maybeAddProvider to be part of the EnabledDataBindingContext.
RELNOTES: None
PiperOrigin-RevId: 207553449
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
3 files changed, 55 insertions, 29 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java index b8dce663d3..9466d7060a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java @@ -707,7 +707,8 @@ public class AndroidCommon { javaCommon.addGenJarsProvider(builder, javaInfoBuilder, genClassJar, genSourceJar); - DataBinding.maybeAddProvider(builder, ruleContext); + resourceApk.asDataBindingContext().addProvider(builder, ruleContext); + JavaInfo javaInfo = javaInfoBuilder .addProvider(JavaCompilationArgsProvider.class, compilationArgsProvider) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java index fc2b5e28aa..03e0c1a8c7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java @@ -248,6 +248,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { // Start building the configured target by adding all the necessary transitive providers/infos. // Includes databinding, IDE, Java. Also declares the output groups and sets the files to build. RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext); + System.out.println(ruleContext.getLabel() + " adding transitive providers"); androidCommon.addTransitiveInfoProviders( builder, aar.getAar(), @@ -258,6 +259,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { // TODO(elenairina): Use JavaCommon.isNeverlink(ruleContext) for consistency among rules. androidCommon.isNeverLink(), /* isLibrary = */ true); + System.out.println(builder); NestedSetBuilder<Artifact> transitiveResourcesJars = collectTransitiveResourceJars(ruleContext); if (resourceApk.getResourceJavaClassJar() != null) { @@ -286,6 +288,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { builder.addNativeDeclaredProvider(aar.toProvider(ruleContext, definesLocalResources)); } + return builder.build(); } 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 cb99971ea5..744a36cb77 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 @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; @@ -25,7 +26,6 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.rules.java.JavaInfo; import com.google.devtools.build.lib.rules.java.JavaPluginInfoProvider; -import com.google.devtools.build.lib.rules.java.JavaTargetAttributes; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.ResourceFileLoader; import com.google.devtools.build.lib.vfs.PathFragment; @@ -110,10 +110,33 @@ public final class DataBinding { void supplyAnnotationProcessor( RuleContext ruleContext, BiConsumer<JavaPluginInfoProvider, Iterable<Artifact>> consumer); + /** + * Processes deps that also apply data binding. + * + * @param ruleContext the current rule + * @return the deps' metadata outputs. These need to be staged as compilation inputs to the + * current rule. + */ ImmutableList<Artifact> processDeps(RuleContext ruleContext); + /** + * Creates and adds the generated Java source for data binding annotation processor to read and + * translate layout info xml (from {@link #supplyLayoutInfo(Consumer)} into the classes that end + * user code consumes. + * + * <p>This triggers the annotation processor. Annotation processor settings are configured + * separately in {@link #supplyJavaCoptsUsing(RuleContext, boolean, Consumer)}. + */ ImmutableList<Artifact> addAnnotationFileToSrcs( ImmutableList<Artifact> srcs, RuleContext ruleContext); + + /** + * Adds the appropriate {@link UsesDataBindingProvider} for a rule if it should expose one. + * + * <p>A rule exposes {@link UsesDataBindingProvider} if either it or its deps set {@code + * enable_data_binding = 1}. + */ + void addProvider(RuleConfiguredTargetBuilder builder, RuleContext ruleContext); } private static final class EnabledDataBindingContext implements DataBindingContext { @@ -154,6 +177,14 @@ public final class DataBinding { @Override public ImmutableList<Artifact> addAnnotationFileToSrcs( ImmutableList<Artifact> srcs, RuleContext ruleContext) { + // Add this rule's annotation processor input. If the rule doesn't have direct resources, + // there's no direct data binding info, so there's strictly no need for annotation processing. + // But it's still important to process the deps' .bin files so any Java class references get + // re-referenced so they don't get filtered out of the compilation classpath by JavaBuilder + // (which filters out classpath .jars that "aren't used": see --reduce_classpath). If data + // binding didn't reprocess a library's data binding expressions redundantly up the dependency + // chain (meaning each depender processes them again as if they were its own), this problem + // wouldn't happen. final Artifact annotationFile = createAnnotationFile(ruleContext); if (annotationFile != null) { return ImmutableList.<Artifact>builder().addAll(srcs).add(annotationFile).build(); @@ -162,6 +193,13 @@ public final class DataBinding { } @Override + public void addProvider(RuleConfiguredTargetBuilder builder, RuleContext ruleContext) { + List<Artifact> dataBindingMetadataOutputs = + Lists.newArrayList(getMetadataOutputs(ruleContext)); + maybeAddProvider(dataBindingMetadataOutputs, builder, ruleContext); + } + + @Override public boolean equals(Object o) { if (this == o) { return true; @@ -203,6 +241,11 @@ public final class DataBinding { ImmutableList<Artifact> srcs, RuleContext ruleContext) { return srcs; } + + @Override + public void addProvider(RuleConfiguredTargetBuilder builder, RuleContext ruleContext) { + maybeAddProvider(new ArrayList<>(), builder, ruleContext); + } } /** Supplies a databinding context from a rulecontext. */ @@ -309,24 +352,6 @@ public final class DataBinding { return context.getUniqueDirectoryArtifact("databinding", "layout-info" + suffix + ".zip"); } - /** - * 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. - */ - static void addAnnotationProcessor( - RuleContext ruleContext, JavaTargetAttributes.Builder attributes) { - JavaPluginInfoProvider plugin = - JavaInfo.getProvider( - JavaPluginInfoProvider.class, - ruleContext.getPrerequisite( - DATABINDING_ANNOTATION_PROCESSOR_ATTR, RuleConfiguredTarget.Mode.HOST)); - - attributes.addPlugin(plugin); - attributes.addAdditionalOutputs(getMetadataOutputs(ruleContext)); - } - /** The javac flags that are needed to configure data binding's annotation processor. */ static ImmutableList<String> getJavacOpts(RuleContext ruleContext, boolean isBinary) { ImmutableList.Builder<String> flags = ImmutableList.builder(); @@ -374,7 +399,7 @@ public final class DataBinding { * consumes. * * <p>This mostly just triggers the annotation processor. Annotation processor settings are - * configured separately in {@link #getJavacopts}. + * configured separately. */ static Artifact createAnnotationFile(RuleContext ruleContext) { String contents; @@ -396,14 +421,11 @@ public final class DataBinding { * <p>A rule exposes {@link UsesDataBindingProvider} if either it or its deps set {@code * enable_data_binding = 1}. */ - public static void maybeAddProvider( - RuleConfiguredTargetBuilder builder, RuleContext ruleContext) { - // Expose the data binding provider if this rule either applies data binding or exports a dep - // that applies it. - List<Artifact> dataBindingMetadataOutputs = new ArrayList<>(); - if (DataBinding.isEnabled(ruleContext)) { - dataBindingMetadataOutputs.addAll(getMetadataOutputs(ruleContext)); - } + private static void maybeAddProvider( + List<Artifact> dataBindingMetadataOutputs, + RuleConfiguredTargetBuilder builder, + RuleContext ruleContext) { + // Expose the data binding provider if there are outputs. dataBindingMetadataOutputs.addAll(getTransitiveMetadata(ruleContext, "exports")); if (!AndroidResources.definesAndroidResources(ruleContext.attributes())) { // If this rule doesn't declare direct resources, no resource processing is run so no data |