diff options
author | Yigit Boyar <yboyar@google.com> | 2018-03-07 09:32:00 -0800 |
---|---|---|
committer | Yigit Boyar <yboyar@google.com> | 2018-03-09 14:08:47 -0800 |
commit | 213ad9c850a29829f2f61f0cec73944f5f178d05 (patch) | |
tree | 6db4db79b052a9d3a7fcf5eb47150fcf567d292c /compiler/src/main/kotlin/android/databinding | |
parent | b5afc9d80f4b7b7c49e1058632d9399ac1db92f3 (diff) | |
download | data-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')
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) } |