Pass the java packages of direct dependencies with databinding to databinding's
annotation processor so that it can distinguish between transitive and direct
BR files.
RELNOTES: None.
PiperOrigin-RevId: 228249266
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingProcessorArgsBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingProcessorArgsBuilder.java
index 89e78db..3854054 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingProcessorArgsBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingProcessorArgsBuilder.java
@@ -13,10 +13,16 @@
// limitations under the License.
package com.google.devtools.build.lib.rules.android.databinding;
+import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
+import java.util.Set;
-/** Builder for annotation processor arguments that can be passed down to data binding. */
+/**
+ * Builder for annotation processor arguments that can be passed down to data binding.
+ *
+ * TODO: Refactor the names of the setter methods in this class to include "set".
+ */
public class DataBindingProcessorArgsBuilder {
private final boolean useUpdatedArgs;
private final ImmutableList.Builder<String> flags = ImmutableList.builder();
@@ -135,6 +141,15 @@
return this;
}
+ /**
+ * Sets the Java packages of the direct dependencies.
+ */
+ public DataBindingProcessorArgsBuilder directDependencyPkgs(Set<String> packages) {
+ String value = String.format("[%s]", Joiner.on(",").join(packages));
+ flags.add(createProcessorFlag("directDependencyPkgs", value));
+ return this;
+ }
+
/** Builds annotation processor arguments for Data Binding */
public ImmutableList<String> build() {
return flags.build();
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 ff3a497..2b53316 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
@@ -16,6 +16,7 @@
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSetMultimap;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.Artifact;
@@ -39,6 +40,7 @@
import java.util.Collection;
import java.util.List;
import java.util.Map.Entry;
+import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
@@ -79,6 +81,7 @@
// Unused.
args.exportClassListTo("/tmp/exported_classes");
args.modulePackage(AndroidCommon.getJavaPackage(ruleContext));
+ args.directDependencyPkgs(getJavaPackagesOfDirectDependencies(ruleContext));
// The minimum Android SDK compatible with this rule.
// TODO(bazel-team): This probably should be based on the actual min-sdk from the manifest,
@@ -97,6 +100,23 @@
consumer.accept(args.build());
}
+ private static Set<String> getJavaPackagesOfDirectDependencies(RuleContext ruleContext) {
+
+ ImmutableSet.Builder<String> javaPackagesOfDirectDependencies = ImmutableSet.builder();
+ if (ruleContext.attributes().has("deps", BuildType.LABEL_LIST)) {
+ Iterable<DataBindingV2Provider> providers = ruleContext.getPrerequisites(
+ "deps", RuleConfiguredTarget.Mode.TARGET, DataBindingV2Provider.PROVIDER);
+
+ for (DataBindingV2Provider provider : providers) {
+ for (LabelJavaPackagePair labelJavaPackagePair : provider.getLabelAndJavaPackages()) {
+ javaPackagesOfDirectDependencies.add(labelJavaPackagePair.javaPackage());
+ }
+ }
+ }
+
+ return javaPackagesOfDirectDependencies.build();
+ }
+
@Override
public void supplyAnnotationProcessor(
RuleContext ruleContext,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java
index c3e2bee..38d2449 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java
@@ -22,6 +22,7 @@
import com.google.devtools.build.lib.skylarkbuildapi.android.DataBindingV2ProviderApi;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.SkylarkList;
+import javax.annotation.Nullable;
/**
* A provider that exposes this enables <a
@@ -39,17 +40,25 @@
private final NestedSet<Artifact> transitiveBRFiles;
+ /**
+ * The label and java package of this rule and any rules that this rule exports.
+ */
+ @Nullable
+ private final ImmutableList<LabelJavaPackagePair> labelAndJavaPackages;
+
private final NestedSet<LabelJavaPackagePair> transitiveLabelAndJavaPackages;
public DataBindingV2Provider(
ImmutableList<Artifact> classInfos,
ImmutableList<Artifact> setterStores,
NestedSet<Artifact> transitiveBRFiles,
+ ImmutableList<LabelJavaPackagePair> labelAndJavaPackages,
NestedSet<LabelJavaPackagePair> transitiveLabelAndJavaPackages) {
super(PROVIDER);
this.classInfos = classInfos;
this.setterStores = setterStores;
this.transitiveBRFiles = transitiveBRFiles;
+ this.labelAndJavaPackages = labelAndJavaPackages;
this.transitiveLabelAndJavaPackages = transitiveLabelAndJavaPackages;
}
@@ -69,6 +78,12 @@
}
@Override
+ @Nullable
+ public ImmutableList<LabelJavaPackagePair> getLabelAndJavaPackages() {
+ return labelAndJavaPackages;
+ }
+
+ @Override
public NestedSet<LabelJavaPackagePair> getTransitiveLabelAndJavaPackages() {
return transitiveLabelAndJavaPackages;
}
@@ -97,24 +112,31 @@
brFiles.add(brFile);
}
- NestedSetBuilder<LabelJavaPackagePair> labelAndJavaPackages = NestedSetBuilder.stableOrder();
- labelAndJavaPackages.add(LabelJavaPackagePair.create(label, javaPackage));
+ NestedSetBuilder<LabelJavaPackagePair> transitiveLabelAndJavaPackages =
+ NestedSetBuilder.stableOrder();
+ ImmutableList.Builder<LabelJavaPackagePair> labelAndJavaPackages = ImmutableList.builder();
+ LabelJavaPackagePair labelAndJavaPackage = LabelJavaPackagePair.create(label, javaPackage);
+ labelAndJavaPackages.add(labelAndJavaPackage);
+ transitiveLabelAndJavaPackages.add(labelAndJavaPackage);
if (databindingV2ProvidersInDeps != null) {
for (DataBindingV2ProviderApi<Artifact> provider : databindingV2ProvidersInDeps) {
brFiles.addTransitive(provider.getTransitiveBRFiles());
- labelAndJavaPackages.addTransitive(provider.getTransitiveLabelAndJavaPackages());
+ transitiveLabelAndJavaPackages.addTransitive(provider.getTransitiveLabelAndJavaPackages());
}
}
if (databindingV2ProvidersInExports != null) {
+ // Add all of the information from providers from exported targets, so that targets which
+ // depend on this target appear to depend on the exported targets.
for (DataBindingV2ProviderApi<Artifact> provider : databindingV2ProvidersInExports) {
setterStoreFiles.addAll(provider.getSetterStores());
classInfoFiles.addAll(provider.getClassInfos());
brFiles.addTransitive(provider.getTransitiveBRFiles());
- labelAndJavaPackages.addTransitive(provider.getTransitiveLabelAndJavaPackages());
+ labelAndJavaPackages.addAll(provider.getLabelAndJavaPackages());
+ transitiveLabelAndJavaPackages.addTransitive(provider.getTransitiveLabelAndJavaPackages());
}
}
@@ -122,7 +144,8 @@
classInfoFiles.build(),
setterStoreFiles.build(),
brFiles.build(),
- labelAndJavaPackages.build());
+ labelAndJavaPackages.build(),
+ transitiveLabelAndJavaPackages.build());
}
/** The provider can construct the DataBindingV2Provider provider. */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DisabledDataBindingV2Context.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DisabledDataBindingV2Context.java
index ddbdbb9..dd71b8f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DisabledDataBindingV2Context.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DisabledDataBindingV2Context.java
@@ -53,6 +53,7 @@
ImmutableList.Builder<Artifact> setterStores = ImmutableList.builder();
ImmutableList.Builder<Artifact> classInfos = ImmutableList.builder();
NestedSetBuilder<Artifact> brFiles = NestedSetBuilder.stableOrder();
+ ImmutableList.Builder<LabelJavaPackagePair> exportedLabelJavaPackages = ImmutableList.builder();
NestedSetBuilder<LabelJavaPackagePair> targetNameAndJavaPackages =
NestedSetBuilder.stableOrder();
@@ -65,6 +66,7 @@
setterStores.addAll(provider.getSetterStores());
classInfos.addAll(provider.getClassInfos());
brFiles.addTransitive(provider.getTransitiveBRFiles());
+ exportedLabelJavaPackages.addAll(provider.getLabelAndJavaPackages());
targetNameAndJavaPackages.addTransitive(provider.getTransitiveLabelAndJavaPackages());
}
}
@@ -82,6 +84,7 @@
classInfos.build(),
setterStores.build(),
brFiles.build(),
+ exportedLabelJavaPackages.build(),
targetNameAndJavaPackages.build()));
}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java
index 466788f..0c3f2c0 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java
@@ -25,6 +25,7 @@
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.SkylarkList;
+import javax.annotation.Nullable;
/**
* An interface for a provider that exposes the use of <a
@@ -78,7 +79,10 @@
@SkylarkCallable(name = "transitive_br_files", structField = true, doc = "", documented = false)
NestedSet<T> getTransitiveBRFiles();
- /** Returns the java package for this rule. */
+ /**
+ * Returns a NestedSet containing the label and java package for this rule and its transitive
+ * dependencies.
+ * */
@SkylarkCallable(
name = "transitive_label_and_java_packages",
structField = true,
@@ -86,6 +90,17 @@
documented = false)
NestedSet<LabelJavaPackagePair> getTransitiveLabelAndJavaPackages();
+ /**
+ * Returns the label and java package for this rule and any rules that this rule exports.
+ */
+ @SkylarkCallable(
+ name = "label_and_java_packages",
+ structField = true,
+ doc = "",
+ documented = false)
+ @Nullable
+ ImmutableList<LabelJavaPackagePair> getLabelAndJavaPackages();
+
/** The provider implementing this can construct the DataBindingV2Info provider. */
@SkylarkModule(
name = "Provider",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java
index f922547..1f64d83 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingV2Test.java
@@ -48,9 +48,20 @@
private void writeDataBindingFiles() throws Exception {
scratch.file(
+ "java/android/library2/BUILD",
+ "android_library(",
+ " name = 'lib2_with_databinding',",
+ " enable_data_binding = 1,",
+ " manifest = 'AndroidManifest.xml',",
+ " srcs = ['MyLib2.java'],",
+ " resource_files = [],",
+ ")");
+
+ scratch.file(
"java/android/library/BUILD",
"android_library(",
- " name = 'lib_with_data_binding',",
+ " name = 'lib_with_databinding',",
+ " deps = ['//java/android/library2:lib2_with_databinding'],",
" enable_data_binding = 1,",
" manifest = 'AndroidManifest.xml',",
" srcs = ['MyLib.java'],",
@@ -67,7 +78,7 @@
" enable_data_binding = 1,",
" manifest = 'AndroidManifest.xml',",
" srcs = ['MyApp.java'],",
- " deps = ['//java/android/library:lib_with_data_binding'],",
+ " deps = ['//java/android/library:lib_with_databinding'],",
")");
scratch.file(
@@ -126,7 +137,7 @@
// output:
Artifact libResourceInfoOutput =
getFirstArtifactEndingWith(
- allArtifacts, "databinding/lib_with_data_binding/layout-info.zip");
+ allArtifacts, "databinding/lib_with_databinding/layout-info.zip");
assertThat(getGeneratingSpawnActionArgs(libResourceInfoOutput))
.containsAllOf("--dataBindingInfoOut", libResourceInfoOutput.getExecPathString())
.inOrder();
@@ -143,13 +154,13 @@
SpawnAction libCompileAction =
(SpawnAction)
getGeneratingAction(
- getFirstArtifactEndingWith(allArtifacts, "lib_with_data_binding.jar"));
+ getFirstArtifactEndingWith(allArtifacts, "lib_with_databinding.jar"));
assertThat(getProcessorNames(libCompileAction))
.contains("android.databinding.annotationprocessor.ProcessDataBinding");
assertThat(prettyArtifactNames(libCompileAction.getInputs()))
.containsAllOf(
- "java/android/library/databinding/lib_with_data_binding/layout-info.zip",
- "java/android/library/databinding/lib_with_data_binding/DataBindingInfo.java");
+ "java/android/library/databinding/lib_with_databinding/layout-info.zip",
+ "java/android/library/databinding/lib_with_databinding/DataBindingInfo.java");
SpawnAction binCompileAction =
(SpawnAction) getGeneratingAction(getFirstArtifactEndingWith(allArtifacts, "app.jar"));
@@ -175,7 +186,7 @@
SpawnAction libCompileAction =
(SpawnAction)
getGeneratingAction(
- getFirstArtifactEndingWith(allArtifacts, "lib_with_data_binding.jar"));
+ getFirstArtifactEndingWith(allArtifacts, "lib2_with_databinding.jar"));
assertThat(
Iterables.filter(
libCompileAction.getInputs(), ActionsTestUtil.getArtifactSuffixMatcher(".bin")))
@@ -187,15 +198,21 @@
Iterable<Artifact> depMetadataInputs =
Iterables.filter(
binCompileAction.getInputs(), ActionsTestUtil.getArtifactSuffixMatcher(".bin"));
- final String depMetadataBaseDir =
- Iterables.getFirst(depMetadataInputs, null).getExecPath().getParentDirectory().toString();
+
+ final String appDependentLibArtifacts =
+ Iterables.getFirst(depMetadataInputs, null).getRoot().getExecPathString()
+ + "/java/android/binary/databinding/app/dependent-lib-artifacts/";
ActionsTestUtil.execPaths(
Iterables.filter(
binCompileAction.getInputs(), ActionsTestUtil.getArtifactSuffixMatcher(".bin")));
assertThat(ActionsTestUtil.execPaths(depMetadataInputs))
.containsExactly(
- depMetadataBaseDir + "/android.library-android.library-setter_store.bin",
- depMetadataBaseDir + "/android.library-android.library-br.bin");
+ appDependentLibArtifacts + "java/android/library/databinding/"
+ + "lib_with_databinding/bin-files/android.library-android.library-br.bin",
+ appDependentLibArtifacts + "java/android/library/databinding/"
+ + "lib_with_databinding/bin-files/android.library-android.library-setter_store.bin",
+ appDependentLibArtifacts + "java/android/library2/databinding/"
+ + "lib2_with_databinding/bin-files/android.library2-android.library2-br.bin");
}
@Test
@@ -222,7 +239,9 @@
"-Aandroid.databinding.exportClassListTo=/tmp/exported_classes",
"-Aandroid.databinding.modulePackage=android.binary",
"-Aandroid.databinding.minApi=14",
- "-Aandroid.databinding.enableV2=1");
+ "-Aandroid.databinding.enableV2=1",
+ // Note that this includes only android.library and not android.library2
+ "-Aandroid.databinding.directDependencyPkgs=[android.library]");
assertThat(paramFileArgsForAction(binCompileAction)).containsAllIn(expectedJavacopts);
// Regression test for b/63134122
@@ -260,7 +279,9 @@
"-Aandroid.databinding.exportClassListOutFile=/tmp/exported_classes",
"-Aandroid.databinding.modulePackage=android.binary",
"-Aandroid.databinding.minApi=14",
- "-Aandroid.databinding.enableV2=1");
+ "-Aandroid.databinding.enableV2=1",
+ // Note that this includes only android.library and not android.library2
+ "-Aandroid.databinding.directDependencyPkgs=[android.library]");
assertThat(paramFileArgsForAction(binCompileAction)).containsAllIn(expectedJavacopts);
JavaCompileInfo javaCompileInfo =
@@ -347,7 +368,7 @@
scratch.file(
"java/android/library/BUILD",
"android_library(",
- " name = 'lib_with_data_binding',",
+ " name = 'lib_with_databinding',",
" enable_data_binding = 1,",
" manifest = 'AndroidManifest.xml',",
" srcs = ['MyLib.java'],",
@@ -364,7 +385,7 @@
" enable_data_binding = 0,",
" manifest = 'AndroidManifest.xml',",
" srcs = ['MyApp.java'],",
- " deps = ['//java/android/library:lib_with_data_binding'],",
+ " deps = ['//java/android/library:lib_with_databinding'],",
")");
scratch.file(
@@ -637,7 +658,9 @@
checkError(
"//java/com/bin:bin",
- "Java package com.lib:\n" + " //java/com/lib:lib\n" + " //java/com/lib:lib2");
+ "Java package com.lib:\n"
+ + " //java/com/lib:lib\n"
+ + " //java/com/lib:lib2");
}
@Test
@@ -780,7 +803,10 @@
")");
checkError(
- "//java/com/bin:bin", "Java package com.foo:\n" + " //libA:libA\n" + " //libB:libB");
+ "//java/com/bin:bin",
+ "Java package com.foo:\n"
+ + " //libA:libA\n"
+ + " //libB:libB");
}
@Test
@@ -823,7 +849,9 @@
checkError(
"//java/com/bin:bin",
- "Java package com.bin:\n" + " //java/com/bin:bin\n" + " //java/com/bin:lib");
+ "Java package com.bin:\n"
+ + " //java/com/bin:bin\n"
+ + " //java/com/bin:lib");
}
@Test
@@ -837,8 +865,8 @@
"//third_party/java/android/android_sdk_linux/extras/android/compatibility/annotations"
+ ":annotations";
- // The bin target depends on this twice target indirectly and separately through the libraries
- // in middleA and middleB, but this should not be a problem.
+ // The bin target depends on this target twice: indirectly and separately through the libraries
+ // in middleA and middleB, but this should not be a problem because it's the same library.
scratch.file(
"java/com/bottom/BUILD",
"android_library(",
@@ -892,4 +920,143 @@
// Should not throw error.
getConfiguredTarget("//java/com/bin:bin");
}
+
+
+ private void writeDataBindingFilesWithExports() throws Exception {
+
+ scratch.file(
+ "java/android/library1/BUILD",
+ "android_library(",
+ " name = 'lib1_with_databinding',",
+ " enable_data_binding = 1,",
+ " manifest = 'AndroidManifest.xml',",
+ " srcs = ['MyLib1.java'],",
+ ")");
+
+ scratch.file(
+ "java/android/library2/BUILD",
+ "android_library(",
+ " name = 'lib2_with_databinding',",
+ " enable_data_binding = 1,",
+ " manifest = 'AndroidManifest.xml',",
+ " srcs = ['MyLib2.java'],",
+ ")");
+
+ scratch.file(
+ "java/android/library3/BUILD",
+ "android_library(",
+ " name = 'lib3',",
+ " manifest = 'AndroidManifest.xml',",
+ " srcs = ['MyLib3.java'],",
+ ")");
+
+ scratch.file(
+ "java/android/lib_with_exports/BUILD",
+ "android_library(",
+ " name = 'lib_with_exports_no_databinding',",
+ " exports = [",
+ " '//java/android/library1:lib1_with_databinding',",
+ " '//java/android/library2:lib2_with_databinding',",
+ " '//java/android/library3:lib3',",
+ " ],",
+ " manifest = 'AndroidManifest.xml',",
+ ")",
+ "",
+ "android_library(",
+ " name = 'lib_with_exports_and_databinding',",
+ " exports = [",
+ " '//java/android/library1:lib1_with_databinding',",
+ " '//java/android/library2:lib2_with_databinding',",
+ " '//java/android/library3:lib3',",
+ " ],",
+ " manifest = 'AndroidManifest.xml',",
+ " enable_data_binding = 1,",
+ ")");
+
+ scratch.file(
+ "java/android/binary/BUILD",
+ "android_binary(",
+ " name = 'app_dep_on_exports_no_databinding',",
+ " enable_data_binding = 1,",
+ " manifest = 'AndroidManifest.xml',",
+ " srcs = ['MyApp.java'],",
+ " deps = ['//java/android/lib_with_exports:lib_with_exports_no_databinding'],",
+ ")",
+ "",
+ "android_binary(",
+ " name = 'app_dep_on_exports_and_databinding',",
+ " enable_data_binding = 1,",
+ " manifest = 'AndroidManifest.xml',",
+ " srcs = ['MyApp.java'],",
+ " deps = ['//java/android/lib_with_exports:lib_with_exports_and_databinding'],",
+ ")");
+ }
+
+ @Test
+ public void testDependentLibraryJavaPackagesPassedFromLibraryWithExportsNoDatabinding()
+ throws Exception {
+
+ writeDataBindingFilesWithExports();
+
+ ConfiguredTarget ctapp =
+ getConfiguredTarget("//java/android/binary:app_dep_on_exports_no_databinding");
+ Set<Artifact> allArtifacts = actionsTestUtil().artifactClosureOf(getFilesToBuild(ctapp));
+ SpawnAction binCompileAction =
+ (SpawnAction) getGeneratingAction(getFirstArtifactEndingWith(
+ allArtifacts, "app_dep_on_exports_no_databinding.jar"));
+
+ ImmutableList<String> expectedJavacopts =
+ ImmutableList.of(
+ "-Aandroid.databinding.directDependencyPkgs=[android.library1,android.library2]");
+ assertThat(paramFileArgsForAction(binCompileAction)).containsAllIn(expectedJavacopts);
+
+ }
+
+ @Test
+ public void testDependentLibraryJavaPackagesPassedFromLibraryWithExportsAndDatabinding()
+ throws Exception {
+
+ writeDataBindingFilesWithExports();
+
+ ConfiguredTarget ctapp =
+ getConfiguredTarget("//java/android/binary:app_dep_on_exports_and_databinding");
+ Set<Artifact> allArtifacts = actionsTestUtil().artifactClosureOf(getFilesToBuild(ctapp));
+ SpawnAction binCompileAction =
+ (SpawnAction) getGeneratingAction(getFirstArtifactEndingWith(
+ allArtifacts, "app_dep_on_exports_and_databinding.jar"));
+
+ ImmutableList<String> expectedJavacopts =
+ ImmutableList.of("-Aandroid.databinding.directDependencyPkgs="
+ + "[android.lib_with_exports,android.library1,android.library2]");
+ assertThat(paramFileArgsForAction(binCompileAction)).containsAllIn(expectedJavacopts);
+
+ }
+
+ @Test
+ public void testNoDependentLibraryJavaPackagesIsEmptyBrackets()
+ throws Exception {
+
+ scratch.file(
+ "java/android/binary/BUILD",
+ "android_binary(",
+ " name = 'app_databinding_no_deps',",
+ " enable_data_binding = 1,",
+ " manifest = 'AndroidManifest.xml',",
+ " srcs = ['MyApp.java'],",
+ " deps = [],",
+ ")");
+
+ ConfiguredTarget ctapp =
+ getConfiguredTarget("//java/android/binary:app_databinding_no_deps");
+ Set<Artifact> allArtifacts = actionsTestUtil().artifactClosureOf(getFilesToBuild(ctapp));
+ SpawnAction binCompileAction =
+ (SpawnAction) getGeneratingAction(getFirstArtifactEndingWith(
+ allArtifacts, "app_databinding_no_deps.jar"));
+
+ ImmutableList<String> expectedJavacopts =
+ ImmutableList.of("-Aandroid.databinding.directDependencyPkgs=[]");
+ assertThat(paramFileArgsForAction(binCompileAction)).containsAllIn(expectedJavacopts);
+
+ }
+
}