summaryrefslogtreecommitdiff
path: root/compiler/src/main/kotlin/android/databinding
diff options
context:
space:
mode:
authorYigit Boyar <yboyar@google.com>2018-03-07 09:32:00 -0800
committerYigit Boyar <yboyar@google.com>2018-03-09 14:08:47 -0800
commit213ad9c850a29829f2f61f0cec73944f5f178d05 (patch)
tree6db4db79b052a9d3a7fcf5eb47150fcf567d292c /compiler/src/main/kotlin/android/databinding
parentb5afc9d80f4b7b7c49e1058632d9399ac1db92f3 (diff)
downloaddata-binding-213ad9c850a29829f2f61f0cec73944f5f178d05.tar.gz
Support v1 dependencies in v1 compilation
This CL adds backward compatibility into data binding v2 such that it can consume dependencies that were compiled with v1. We achieve this in 2 steps: * Inside the gradle task, we deserialize v1 layout info and convert it into GenClassLog. This allows gradle task to generate the right code. (albeit, it might depend on not yet existing classes but that is how v1 works anyways). * Then in the annotation processor, we reload the same layout info, create a CompilerChef that thinks it is in v1 and let it generate the code. Finally, we create 1 mapper for all v1 compat classes. All code generated for v1 is stripped for libraries. This is necessary because if 2 separate libraries in an app depend on the same v1 lbirary, both of them will generate code for it, causing duplicate class issues. For apps compiled w/ v2 and has v2 dependencies, cost is almost none (is just the gradle task has 1 more dependency). For apps compiled w/ v1 and has v1 dependencies, it is as slow as v1 is, + a bit more since we end up writing mode classes than we would but it is negligible. Bug: 74264651 Test: MultiModuleTestApp (gradle invokes it w/ v1 - v2 setup) Change-Id: I0e04e7f04b67eb010d4a1bf32e0fce32586a4b90
Diffstat (limited to 'compiler/src/main/kotlin/android/databinding')
-rw-r--r--compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriter.kt6
-rw-r--r--compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriterV2.kt3
-rw-r--r--compiler/src/main/kotlin/android/databinding/tool/writer/MergedBindingMapperWriter.kt13
3 files changed, 19 insertions, 3 deletions
diff --git a/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriter.kt b/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriter.kt
index 66f39e4c..70921a52 100644
--- a/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriter.kt
+++ b/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriter.kt
@@ -167,4 +167,10 @@ class BindingMapperWriter(var pkg : String, var className: String,
}
}
}.generate()
+
+ companion object {
+ const val V1_COMPAT_MAPPER_NAME = "V1CompatDataBinderMapperImpl"
+ const val V1_COMPAT_MAPPER_PKG = "android.databinding"
+ const val V1_COMPAT_QNAME = V1_COMPAT_MAPPER_PKG + "." + V1_COMPAT_MAPPER_NAME
+ }
}
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 40deff3a..baa30b6a 100644
--- a/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriterV2.kt
+++ b/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriterV2.kt
@@ -65,6 +65,9 @@ class BindingMapperWriterV2(private val genClassInfoLog: GenClassInfoLog,
ClassName.get("android.util", "SparseIntArray")
private val SPARSE_ARRAY =
ClassName.get("android.util", "SparseArray")
+
+ @JvmStatic
+ fun createMapperQName(modulePackage : String) = modulePackage + "." + IMPL_CLASS_NAME
}
private val rClassMap = mutableMapOf<String, ClassName>()
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 f0d7e59b..8517c234 100644
--- a/compiler/src/main/kotlin/android/databinding/tool/writer/MergedBindingMapperWriter.kt
+++ b/compiler/src/main/kotlin/android/databinding/tool/writer/MergedBindingMapperWriter.kt
@@ -29,7 +29,8 @@ import javax.lang.model.element.Modifier
class MergedBindingMapperWriter(private val packages: List<String>,
compilerArgs: DataBindingCompilerArgs,
- private val featurePackages : Set<String>) {
+ private val featurePackages : Set<String>,
+ private val hasV1CompatMapper: Boolean) {
private val generateAsTest = compilerArgs.isTestVariant && compilerArgs.isApp
private val generateTestOverride = !generateAsTest && compilerArgs.isEnabledForTests
private val overrideField = FieldSpec.builder(BindingMapperWriterV2.DATA_BINDER_MAPPER,
@@ -38,8 +39,8 @@ class MergedBindingMapperWriter(private val packages: List<String>,
.build()
companion object {
- private val APP_CLASS_NAME = "DataBinderMapperImpl"
- private val TEST_CLASS_NAME = "Test$APP_CLASS_NAME"
+ const val APP_CLASS_NAME = "DataBinderMapperImpl"
+ private const val TEST_CLASS_NAME = "Test$APP_CLASS_NAME"
val MERGED_MAPPER_BASE: ClassName = ClassName.get(
"android.databinding",
"MergedDataBinderMapper")
@@ -59,6 +60,12 @@ class MergedBindingMapperWriter(private val packages: List<String>,
val mapper = ClassName.get(pkg, APP_CLASS_NAME)
addStatement("addMapper(new $T())", mapper)
}
+ if (hasV1CompatMapper) {
+ val compatMapper = ClassName.get(
+ BindingMapperWriter.V1_COMPAT_MAPPER_PKG,
+ BindingMapperWriter.V1_COMPAT_MAPPER_NAME)
+ addStatement("addMapper(new $T())", compatMapper)
+ }
featurePackages.forEach {
addStatement("addMapper($S)", it)
}