diff options
author | Yigit Boyar <yboyar@google.com> | 2018-05-17 14:59:47 -0700 |
---|---|---|
committer | Yigit Boyar <yboyar@google.com> | 2018-06-01 08:26:30 -0700 |
commit | 7cd9d9b7906d5343259b1cde424ccb25c2e24cb1 (patch) | |
tree | 58272d77fc2d649c289f097701ca8d3ced19a080 /compiler/src/main/kotlin/android/databinding | |
parent | 8ab52508c8536b916c76c3476cf573eafe794e90 (diff) | |
download | data-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.kt | 34 | ||||
-rw-r--r-- | compiler/src/main/kotlin/android/databinding/tool/writer/MergedBindingMapperWriter.kt | 17 |
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), |