summaryrefslogtreecommitdiff
path: root/compiler/src/main/kotlin/android/databinding
diff options
context:
space:
mode:
authorYigit Boyar <yboyar@google.com>2018-01-09 15:05:49 -0800
committerYigit Boyar <yboyar@google.com>2018-02-16 18:02:17 -0800
commit9cebca2653f79e323860ffd2ddcc791f05516dce (patch)
treed1ab949de7027fcf11b4d9b247aee9d848b8d861 /compiler/src/main/kotlin/android/databinding
parent8920b3aa9835fd19e553da48754efaa8695f778d (diff)
downloaddata-binding-9cebca2653f79e323860ffd2ddcc791f05516dce.tar.gz
Enable features
This CL adds a new build type called FEATURE, which is a new version where we generate BR classes for only runtime dependencies (dependencies that are not inherited from base or any other feature). This new BR file generation logic looks up the existing ids and re-uses if the BR id matches the id in a dependency. For any other id, we generate them with an offset (provided by gradle) so that it cannot conflict w/ other features. The integration test app is not a real test app right now because features do not support instrumentation tests. It is more of a manual testing ground until features have the capability. Bug: 63814741 Test: in the other CL Change-Id: I6f3feda908b3925a29ff76a29cd3659cab3f8f8d
Diffstat (limited to 'compiler/src/main/kotlin/android/databinding')
-rw-r--r--compiler/src/main/kotlin/android/databinding/tool/writer/BRWriter.kt48
-rw-r--r--compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriter.kt27
-rw-r--r--compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriterV2.kt22
-rw-r--r--compiler/src/main/kotlin/android/databinding/tool/writer/MergedBindingMapperWriter.kt6
4 files changed, 61 insertions, 42 deletions
diff --git a/compiler/src/main/kotlin/android/databinding/tool/writer/BRWriter.kt b/compiler/src/main/kotlin/android/databinding/tool/writer/BRWriter.kt
index 8eb31bd1..bc1bfa66 100644
--- a/compiler/src/main/kotlin/android/databinding/tool/writer/BRWriter.kt
+++ b/compiler/src/main/kotlin/android/databinding/tool/writer/BRWriter.kt
@@ -16,21 +16,41 @@
package android.databinding.tool.writer
-import android.databinding.tool.util.StringUtils
+import android.databinding.annotationprocessor.BindableBag
+import android.databinding.tool.ext.L
+import android.databinding.tool.ext.S
+import android.databinding.tool.reflection.ModelAnalyzer
+import com.squareup.javapoet.AnnotationSpec
+import com.squareup.javapoet.FieldSpec
+import com.squareup.javapoet.JavaFile
+import com.squareup.javapoet.TypeName
+import com.squareup.javapoet.TypeSpec
+import javax.annotation.Generated
+import javax.lang.model.element.Modifier
-class BRWriter(val properties: Set<String>, val useFinal : Boolean) {
- val indexedProps = properties.sorted().withIndex()
- fun write(pkg : String): String = "package $pkg;${StringUtils.LINE_SEPARATOR}$klass"
- val klass: String by lazy {
- kcode("") {
- val prefix = if (useFinal) "final " else "";
- annotateWithGenerated()
- block("public class BR") {
- tab("public static ${prefix}int _all = 0;")
- indexedProps.forEach {
- tab ("public static ${prefix}int ${it.value} = ${it.index + 1};")
- }
+class BRWriter(private val useFinal : Boolean) {
+ fun write(values : BindableBag.BRWithValues): String {
+ val spec = TypeSpec.classBuilder("BR").apply {
+ addModifiers(Modifier.PUBLIC)
+ if (ModelAnalyzer.getInstance().hasGeneratedAnnotation()) {
+ addAnnotation(AnnotationSpec.builder(Generated::class.java)
+ .addMember("value", S,"Android Data Binding").build())
}
- }.generate()
+ values.props.forEach {
+ addField(
+ FieldSpec.builder(TypeName.INT, it.first, Modifier.PUBLIC,
+ Modifier.STATIC).apply {
+ if (useFinal) {
+ addModifiers(Modifier.FINAL)
+ }
+ initializer(L, it.second)
+ }.build()
+ )
+ }
+ }.build()
+ val sb = StringBuilder()
+ JavaFile.builder(values.pkg, spec).build()
+ .writeTo(sb)
+ return sb.toString()
}
}
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 44ddbfc3..66f39e4c 100644
--- a/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriter.kt
+++ b/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriter.kt
@@ -15,6 +15,7 @@ package android.databinding.tool.writer
import android.databinding.tool.DataBindingCompilerArgs
import android.databinding.tool.LayoutBinder
+import android.databinding.tool.ext.N
class BindingMapperWriter(var pkg : String, var className: String,
val layoutBinders : List<LayoutBinder>,
@@ -29,9 +30,10 @@ class BindingMapperWriter(var pkg : String, var className: String,
className = "Test${className}"
}
}
- fun write(brWriter : BRWriter) = kcode("") {
+ fun write(brValueLookup: MutableMap<String, Int>) = kcode("") {
nl("package $pkg;")
nl("import ${compilerArgs.modulePackage}.BR;")
+ nl("import android.util.SparseArray;")
val extends = if (generateAsTest) {
"extends $appClassName"
} else {
@@ -145,24 +147,23 @@ class BindingMapperWriter(var pkg : String, var className: String,
}
nl("@Override")
block("public String convertBrIdToString(int id)") {
- block("if (id < 0 || id >= InnerBrLookup.sKeys.length)") {
- if (generateTestOverride) {
- block("if(mTestOverride != null)") {
- nl("return mTestOverride.convertBrIdToString(id);")
- }
+ nl("final String value = InnerBrLookup.sKeys.get(id);")
+ if (generateTestOverride) {
+ block("if(value == null && mTestOverride != null)") {
+ nl("return mTestOverride.convertBrIdToString(id);")
}
- nl("return null;")
}
- nl("return InnerBrLookup.sKeys[id];")
+ nl("return value;")
}
block("private static class InnerBrLookup") {
- nl("static String[] sKeys = new String[]{") {
- tab("\"_all\"")
- brWriter.indexedProps.forEach {
- tab(",\"${it.value}\"")
+ nl("static final SparseArray<String> sKeys = new SparseArray();")
+ block("static") {
+ tab("sKeys.put(0, \"_all\");")
+ brValueLookup.forEach {
+ tab("sKeys.put(${it.value}, \"${it.key}\");")
}
- }.app("};")
+ }
}
}
}.generate()
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 302769e3..40deff3a 100644
--- a/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriterV2.kt
+++ b/compiler/src/main/kotlin/android/databinding/tool/writer/BindingMapperWriterV2.kt
@@ -119,7 +119,7 @@ class BindingMapperWriterV2(private val genClassInfoLog: GenClassInfoLog,
return layoutId.fieldSpec
}
- fun write(brWriter: BRWriter): TypeSpec = TypeSpec.classBuilder(className).apply {
+ fun write(brValueLookup: MutableMap<String, Int>): TypeSpec = TypeSpec.classBuilder(className).apply {
superclass(DATA_BINDER_MAPPER)
addModifiers(Modifier.PUBLIC)
if (ModelAnalyzer.getInstance().hasGeneratedAnnotation()) {
@@ -131,7 +131,7 @@ class BindingMapperWriterV2(private val genClassInfoLog: GenClassInfoLog,
addMethod(generateGetViewArrayDataBinder())
addMethod(generateGetLayoutId())
addMethod(generateConvertBrIdToString())
- addType(generateInnerBrLookup(brWriter))
+ addType(generateInnerBrLookup(brValueLookup))
// must write this at the end
createLocalizedLayoutIds(this)
}.build()
@@ -171,7 +171,7 @@ class BindingMapperWriterV2(private val genClassInfoLog: GenClassInfoLog,
}
}
- private fun generateInnerBrLookup(brWriter: BRWriter) = TypeSpec
+ private fun generateInnerBrLookup(brValueLookup: MutableMap<String, Int>) = TypeSpec
.classBuilder("InnerBrLookup").apply {
/**
* generated code looks like:
@@ -187,21 +187,15 @@ class BindingMapperWriterV2(private val genClassInfoLog: GenClassInfoLog,
)
val keysField = FieldSpec.builder(keysTypeName, "sKeys").apply {
addModifiers(Modifier.STATIC, Modifier.FINAL)
- initializer("new $T($L)", keysTypeName, brWriter.properties.size + 1)
+ initializer("new $T($L)", keysTypeName, brValueLookup.size + 1)
}.build()
addField(keysField)
addStaticBlock(CodeBlock.builder().apply {
- addStatement("$N.put($L.BR.$L, $S)",
- keysField,
- compilerArgs.modulePackage,
- "_all",
- "_all")
- brWriter.properties.forEach {
- addStatement("$N.put($L.BR.$L, $S)",
+ brValueLookup.forEach {
+ addStatement("$N.put($L, $S)",
keysField,
- compilerArgs.modulePackage,
- it,
- it)
+ it.value,
+ it.key)
}
}.build())
}.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 b60b6d41..f0d7e59b 100644
--- a/compiler/src/main/kotlin/android/databinding/tool/writer/MergedBindingMapperWriter.kt
+++ b/compiler/src/main/kotlin/android/databinding/tool/writer/MergedBindingMapperWriter.kt
@@ -28,7 +28,8 @@ import com.squareup.javapoet.TypeSpec
import javax.lang.model.element.Modifier
class MergedBindingMapperWriter(private val packages: List<String>,
- compilerArgs: DataBindingCompilerArgs) {
+ compilerArgs: DataBindingCompilerArgs,
+ private val featurePackages : Set<String>) {
private val generateAsTest = compilerArgs.isTestVariant && compilerArgs.isApp
private val generateTestOverride = !generateAsTest && compilerArgs.isEnabledForTests
private val overrideField = FieldSpec.builder(BindingMapperWriterV2.DATA_BINDER_MAPPER,
@@ -58,6 +59,9 @@ class MergedBindingMapperWriter(private val packages: List<String>,
val mapper = ClassName.get(pkg, APP_CLASS_NAME)
addStatement("addMapper(new $T())", mapper)
}
+ featurePackages.forEach {
+ addStatement("addMapper($S)", it)
+ }
if (generateTestOverride) {
beginControlFlow("if($N != null)", overrideField).apply {
addStatement("addMapper($N)", overrideField)