From a68d88935beea541379d3fd846e7977bda8ff951 Mon Sep 17 00:00:00 2001 From: Googler Date: Tue, 27 Apr 2021 16:16:02 -0700 Subject: [PATCH] Get databinding artifacts from Starlark prerequisite if the prerequisite does the Java compilation. PiperOrigin-RevId: 370784802 --- .../lib/rules/android/AndroidBinary.java | 1 + .../lib/rules/android/AndroidCommon.java | 44 +++++++++++++------ .../lib/rules/android/AndroidLibrary.java | 1 + .../databinding/DataBindingV2Context.java | 22 +++++++++- 4 files changed, 52 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index 9e2b630560be67..b4576de36258cb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -320,6 +320,7 @@ private static RuleConfiguredTargetBuilder init( ruleContext.getConfiguration().isCodeCoverageEnabled(), /* collectJavaCompilationArgs= */ true, /* isBinary= */ true, + shouldCompileJavaSrcs, excludedRuntimeArtifacts, /* generateExtensionRegistry= */ true); ruleContext.assertNoErrors(); 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 1649f4e060d2d1..dab78c62bcc54d 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 @@ -48,6 +48,7 @@ import com.google.devtools.build.lib.packages.Type; import com.google.devtools.build.lib.rules.android.ZipFilterBuilder.CheckHashMismatchMode; import com.google.devtools.build.lib.rules.android.databinding.DataBindingContext; +import com.google.devtools.build.lib.rules.android.databinding.DataBindingV2Provider; import com.google.devtools.build.lib.rules.cpp.CcInfo; import com.google.devtools.build.lib.rules.cpp.CcLinkingContext; import com.google.devtools.build.lib.rules.cpp.CcLinkingContext.LinkOptions; @@ -438,6 +439,7 @@ public JavaTargetAttributes init( boolean addCoverageSupport, boolean collectJavaCompilationArgs, boolean isBinary, + boolean shouldCompileJavaSrcs, NestedSet excludedRuntimeArtifacts, boolean generateExtensionRegistry) throws InterruptedException, RuleErrorException { @@ -462,22 +464,26 @@ public JavaTargetAttributes init( ImmutableList.Builder javacopts = ImmutableList.builder(); javacopts.addAll(androidSemantics.getCompatibleJavacOptions(ruleContext)); - resourceApk - .asDataBindingContext() - .supplyJavaCoptsUsing(ruleContext, isBinary, javacopts::addAll); + if (shouldCompileJavaSrcs) { + resourceApk + .asDataBindingContext() + .supplyJavaCoptsUsing(ruleContext, isBinary, javacopts::addAll); + } JavaTargetAttributes.Builder attributesBuilder = javaCommon .initCommon(idlHelper.getIdlGeneratedJavaSources(), javacopts.build()) .setBootClassPath(bootClassPathInfo); - resourceApk - .asDataBindingContext() - .supplyAnnotationProcessor( - ruleContext, - (plugin, additionalOutputs) -> { - attributesBuilder.addPlugin(plugin); - attributesBuilder.addAdditionalOutputs(additionalOutputs); - }); + if (shouldCompileJavaSrcs) { + resourceApk + .asDataBindingContext() + .supplyAnnotationProcessor( + ruleContext, + (plugin, additionalOutputs) -> { + attributesBuilder.addPlugin(plugin); + attributesBuilder.addAdditionalOutputs(additionalOutputs); + }); + } if (excludedRuntimeArtifacts != null) { attributesBuilder.addExcludedArtifacts(excludedRuntimeArtifacts); @@ -505,9 +511,19 @@ public JavaTargetAttributes init( jarsProducedForRuntime.add(resourceApk.getResourceJavaClassJar()); } - // Databinding metadata that the databinding annotation processor reads. - ImmutableList additionalJavaInputsFromDatabinding = - resourceApk.asDataBindingContext().processDeps(ruleContext, isBinary); + ImmutableList additionalJavaInputsFromDatabinding = null; + if (shouldCompileJavaSrcs) { + // Databinding metadata that the databinding annotation processor reads. + additionalJavaInputsFromDatabinding = + resourceApk.asDataBindingContext().processDeps(ruleContext, isBinary); + } else { + ImmutableList.Builder outputs = ImmutableList.builder(); + DataBindingV2Provider p = + ruleContext.getPrerequisite("application_resources", DataBindingV2Provider.PROVIDER); + outputs.addAll(p.getSetterStores()); + outputs.addAll(p.getTransitiveBRFiles().toList()); + additionalJavaInputsFromDatabinding = outputs.build(); + } JavaCompilationHelper helper = initAttributes(attributesBuilder, javaSemantics, additionalJavaInputsFromDatabinding); 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 f7b91eb226532a..bb6a7915818508 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 @@ -203,6 +203,7 @@ public ConfiguredTarget create(RuleContext ruleContext) /* addCoverageSupport= */ false, /* collectJavaCompilationArgs= */ true, /* isBinary= */ false, + /* shouldCompileJavaSrcs= */ true, /* excludedRuntimeArtifacts= */ null, /* generateExtensionRegistry= */ false); if (javaTargetAttributes == null) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java index 5a89643ff8a23a..63b493729f339a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Context.java @@ -28,6 +28,7 @@ import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.rules.android.AndroidApplicationResourceInfo; import com.google.devtools.build.lib.rules.android.AndroidCommon; import com.google.devtools.build.lib.rules.android.AndroidDataBindingProcessorBuilder; import com.google.devtools.build.lib.rules.android.AndroidDataContext; @@ -334,7 +335,14 @@ private static List getDirectClassInfo(RuleContext context) { @Override public void addProvider(RuleConfiguredTargetBuilder builder, RuleContext ruleContext) { - + if (shouldGetDatabindingArtifactsFromApplicationResources(ruleContext)) { + DataBindingV2Provider p = + ruleContext.getPrerequisite("application_resources", DataBindingV2Provider.PROVIDER); + if (p != null) { + builder.addNativeDeclaredProvider(p); + return; + } + } Artifact setterStoreFile = DataBinding.getMetadataOutput(ruleContext, useUpdatedArgs, setterStoreName); @@ -395,7 +403,7 @@ public boolean usesAndroidX() { return useAndroidX; } - private static Artifact getClassInfoFile(ActionConstructionContext context) { + private static Artifact getClassInfoFile(RuleContext context) { return context.getUniqueDirectoryArtifact("databinding", "class-info.zip"); } @@ -405,4 +413,14 @@ private Artifact getLayoutInfoFile() { } return injectedLayoutInfoZip; } + + private static boolean shouldGetDatabindingArtifactsFromApplicationResources( + RuleContext context) { + if (!context.attributes().isAttributeValueExplicitlySpecified("application_resources")) { + return false; + } + AndroidApplicationResourceInfo androidApplicationResourceInfo = + context.getPrerequisite("application_resources", AndroidApplicationResourceInfo.PROVIDER); + return !androidApplicationResourceInfo.shouldCompileJavaSrcs(); + } }