summaryrefslogtreecommitdiff
path: root/compiler/src/main/kotlin/android/databinding
diff options
context:
space:
mode:
authorYigit Boyar <yboyar@google.com>2018-05-17 14:59:47 -0700
committerYigit Boyar <yboyar@google.com>2018-06-01 08:26:30 -0700
commit7cd9d9b7906d5343259b1cde424ccb25c2e24cb1 (patch)
tree58272d77fc2d649c289f097701ca8d3ced19a080 /compiler/src/main/kotlin/android/databinding
parent8ab52508c8536b916c76c3476cf573eafe794e90 (diff)
downloaddata-binding-7cd9d9b7906d5343259b1cde424ccb25c2e24cb1.tar.gz
Data Binding gradle implementation API support
This CL adds support for using "implementation" dependencies in gradle, greatly reducing compilation times if app is setup properly. There are 2 big changes: * SetterStore will not use an adapter if it is not available in the compile classpath * MergedDataBindingMapper will only initialize the App's mapper. Each time a mapper is added, we ask it to provide it's dependencies. This way, an app can initialize all of its dependencies w/o directly calling them out. Bug: 77539932 Test: MutliModuleTestApp#connectedCheck Change-Id: I686b06180a062c071f1577cb782897ff6cce1199
Diffstat (limited to 'compiler/src/main/kotlin/android/databinding')
-rw-r--r--compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriterV2.kt34
-rw-r--r--compiler/src/main/kotlin/android/databinding/tool/writer/MergedBindingMapperWriter.kt17
2 files changed, 39 insertions, 12 deletions
diff --git a/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriterV2.kt b/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriterV2.kt
index ea7ec269..d61d03ca 100644
--- a/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriterV2.kt
+++ b/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriterV2.kt
@@ -42,7 +42,8 @@ import javax.lang.model.element.Modifier
class BindingMapperWriterV2(genClassInfoLog: GenClassInfoLog,
compilerArgs: CompilerArguments,
- libTypes: LibTypes) {
+ libTypes: LibTypes,
+ modulePackages: MutableSet<String>) {
companion object {
private val VIEW = ClassName
.get("android.view", "View")
@@ -72,7 +73,6 @@ class BindingMapperWriterV2(genClassInfoLog: GenClassInfoLog,
}
private val rClassMap = mutableMapOf<String, ClassName>()
-
private val viewDataBinding = ClassName.bestGuess(libTypes.viewDataBinding)
private val bindingComponent = ClassName.bestGuess(libTypes.dataBindingComponent)
private val dataBinderMapper: ClassName = ClassName.bestGuess(libTypes.dataBinderMapper)
@@ -137,6 +137,9 @@ class BindingMapperWriterV2(genClassInfoLog: GenClassInfoLog,
}
val qualifiedName = "$pkg.$className"
+ private val dependencyModulePackages = modulePackages.filter {
+ it != pkg
+ }
private fun getRClass(pkg: String): ClassName {
return rClassMap.getOrPut(pkg) {
@@ -155,7 +158,8 @@ class BindingMapperWriterV2(genClassInfoLog: GenClassInfoLog,
val genClass: GenClassInfoLog.GenClass)
- fun write(brValueLookup: MutableMap<String, Int>) = TypeSpec.classBuilder(className).apply {
+ fun write(brValueLookup: MutableMap<String, Int>): TypeSpec
+ = TypeSpec.classBuilder(className).apply {
superclass(dataBinderMapper)
addModifiers(Modifier.PUBLIC)
if (ModelAnalyzer.getInstance().hasGeneratedAnnotation()) {
@@ -167,6 +171,7 @@ class BindingMapperWriterV2(genClassInfoLog: GenClassInfoLog,
addMethod(generateGetViewArrayDataBinder())
addMethod(generateGetLayoutId())
addMethod(generateConvertBrIdToString())
+ addMethod(generateCollectDependencies())
addType(generateInnerBrLookup(brValueLookup))
addType(generateInnerLayoutIdLookup())
// must write this at the end
@@ -514,4 +519,27 @@ class BindingMapperWriterV2(genClassInfoLog: GenClassInfoLog,
addStatement("return null")
}.build()
+
+ // generate the code that will load all dependencies that are possibly not visible to the app
+ private fun generateCollectDependencies() : MethodSpec {
+ return MethodSpec.methodBuilder("collectDependencies").apply {
+ addAnnotation(Override::class.java)
+ addModifiers(Modifier.PUBLIC)
+ val listType = ParameterizedTypeName.get(
+ ClassName.get(ArrayList::class.java),
+ dataBinderMapper
+ )
+ returns(ParameterizedTypeName.get(
+ ClassName.get(List::class.java),
+ dataBinderMapper
+ ))
+ addStatement("$T result = new $T($L)",
+ listType, listType, dependencyModulePackages.size)
+ dependencyModulePackages.forEach {
+ val mapperType = ClassName.get(it, IMPL_CLASS_NAME)
+ addStatement("result.add(new $T())", mapperType)
+ }
+ addStatement("return result")
+ }.build()
+ }
}
diff --git a/compiler/src/main/kotlin/android/databinding/tool/writer/MergedBindingMapperWriter.kt b/compiler/src/main/kotlin/android/databinding/tool/writer/MergedBindingMapperWriter.kt
index b703f686..051c32be 100644
--- a/compiler/src/main/kotlin/android/databinding/tool/writer/MergedBindingMapperWriter.kt
+++ b/compiler/src/main/kotlin/android/databinding/tool/writer/MergedBindingMapperWriter.kt
@@ -28,11 +28,11 @@ import com.squareup.javapoet.MethodSpec
import com.squareup.javapoet.TypeSpec
import javax.lang.model.element.Modifier
-class MergedBindingMapperWriter(private val packages: List<String>,
- compilerArgs: CompilerArguments,
- private val featurePackages : Set<String>,
- private val hasV1CompatMapper: Boolean,
- private val libTypes: LibTypes) {
+class MergedBindingMapperWriter(
+ compilerArgs: CompilerArguments,
+ private val featurePackages : Set<String>,
+ private val hasV1CompatMapper: Boolean,
+ private val libTypes: LibTypes) {
private val generateAsTest = compilerArgs.isTestVariant && compilerArgs.isApp
private val generateTestOverride = !generateAsTest && compilerArgs.isEnabledForTests
private val overrideField = FieldSpec.builder(ClassName.bestGuess(libTypes.dataBinderMapper),
@@ -47,6 +47,7 @@ class MergedBindingMapperWriter(private val packages: List<String>,
val pkg = libTypes.bindingPackage
val qualifiedName = "$pkg.$APP_CLASS_NAME"
+ private val appPkg: String = compilerArgs.modulePackage
private val dataBinderMapper: ClassName = ClassName.bestGuess(libTypes.dataBinderMapper)
private val mergedMapperBase: ClassName = ClassName.get(
@@ -61,10 +62,8 @@ class MergedBindingMapperWriter(private val packages: List<String>,
superclass(mergedMapperBase)
addModifiers(Modifier.PUBLIC)
addMethod(MethodSpec.constructorBuilder().apply {
- packages.forEach { pkg ->
- val mapper = ClassName.get(pkg, APP_CLASS_NAME)
- addStatement("addMapper(new $T())", mapper)
- }
+ val mapper = ClassName.get(appPkg, APP_CLASS_NAME)
+ addStatement("addMapper(new $T())", mapper)
if (hasV1CompatMapper) {
val compatMapper = ClassName.get(
BindingMapperWriter.v1CompatMapperPkg(libTypes.useAndroidX),