Allow turning off generating Java nullability annotations.
This is needed for Dagger which may not have
the androidx.annotations.Nullable available
on the classpath.
Test: N/A
Change-Id: Ibe0bb61a2459f19392d5371e2bc7af5543a3b4a9
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XFunSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XFunSpec.kt
index 24f9e7b..596c793 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XFunSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XFunSpec.kt
@@ -45,9 +45,7 @@
fun addParameter(parameter: XParameterSpec): Builder
- fun addParameter(typeName: XTypeName, name: String) = apply {
- addParameter(XParameterSpec.builder(name, typeName).build())
- }
+ fun addParameter(name: String, typeName: XTypeName): Builder
fun addParameters(parameters: List<XParameterSpec>) = apply {
parameters.forEach { addParameter(it) }
@@ -99,10 +97,12 @@
name: XName,
visibility: VisibilityModifier,
isOpen: Boolean = false,
- isOverride: Boolean = false
+ isOverride: Boolean = false,
+ addJavaNullabilityAnnotation: Boolean = true
): Builder =
XFunSpecImpl.Builder(
JavaFunSpec.Builder(
+ addJavaNullabilityAnnotation,
JFunSpec.methodBuilder(name.java).apply {
addModifiers(visibility.toJavaVisibilityModifier())
// TODO(b/247242374) Add nullability annotations for non-private params
@@ -128,9 +128,13 @@
)
@JvmStatic
- fun constructorBuilder(visibility: VisibilityModifier): Builder =
+ fun constructorBuilder(
+ visibility: VisibilityModifier,
+ addJavaNullabilityAnnotation: Boolean = true
+ ): Builder =
XFunSpecImpl.Builder(
JavaFunSpec.Builder(
+ addJavaNullabilityAnnotation,
JFunSpec.constructorBuilder().apply {
addModifiers(visibility.toJavaVisibilityModifier())
}
@@ -147,9 +151,16 @@
)
@JvmStatic
- fun overridingBuilder(element: XMethodElement, owner: XType): Builder =
+ fun overridingBuilder(
+ element: XMethodElement,
+ owner: XType,
+ addJavaNullabilityAnnotation: Boolean = true
+ ): Builder =
XFunSpecImpl.Builder(
- JavaFunSpec.Builder(MethodSpecHelper.overridingWithFinalParams(element, owner)),
+ JavaFunSpec.Builder(
+ addJavaNullabilityAnnotation,
+ MethodSpecHelper.overridingWithFinalParams(element, owner)
+ ),
KotlinFunSpec.Builder(FunSpecHelper.overriding(element, owner))
)
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XParameterSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XParameterSpec.kt
index a4dc87c..2f0f8eb 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XParameterSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XParameterSpec.kt
@@ -39,10 +39,16 @@
}
companion object {
- @JvmStatic fun of(name: String, typeName: XTypeName) = builder(name, typeName).build()
+ @JvmStatic
+ fun of(name: String, typeName: XTypeName, addJavaNullabilityAnnotation: Boolean = true) =
+ builder(name, typeName, addJavaNullabilityAnnotation).build()
@JvmStatic
- fun builder(name: String, typeName: XTypeName): Builder {
+ fun builder(
+ name: String,
+ typeName: XTypeName,
+ addJavaNullabilityAnnotation: Boolean = true
+ ): Builder {
return XParameterSpecImpl.Builder(
name,
typeName,
@@ -51,13 +57,15 @@
typeName,
JParameterSpec.builder(typeName.java, name).apply {
addModifiers(JModifier.FINAL)
- // Adding nullability annotation to primitive parameters is redundant as
- // primitives can never be null.
- if (!typeName.isPrimitive) {
- when (typeName.nullability) {
- XNullability.NULLABLE -> addAnnotation(NULLABLE_ANNOTATION)
- XNullability.NONNULL -> addAnnotation(NONNULL_ANNOTATION)
- XNullability.UNKNOWN -> {}
+ if (addJavaNullabilityAnnotation) {
+ // Adding nullability annotation to primitive parameters is redundant as
+ // primitives can never be null.
+ if (!typeName.isPrimitive) {
+ when (typeName.nullability) {
+ XNullability.NULLABLE -> addAnnotation(NULLABLE_ANNOTATION)
+ XNullability.NONNULL -> addAnnotation(NONNULL_ANNOTATION)
+ XNullability.UNKNOWN -> {}
+ }
}
}
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/compat/XConverters.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/compat/XConverters.kt
index e506c6c..594868b 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/compat/XConverters.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/compat/XConverters.kt
@@ -378,11 +378,12 @@
@JvmStatic
fun toXPoet(
+ addJavaNullabilityAnnotation: Boolean,
jFunSpecBuilder: JFunSpecBuilder,
kFunSpecBuilder: KFunSpecBuilder
): XFunSpec.Builder =
XFunSpecImpl.Builder(
- JavaFunSpec.Builder(jFunSpecBuilder),
+ JavaFunSpec.Builder(addJavaNullabilityAnnotation, jFunSpecBuilder),
KotlinFunSpec.Builder(kFunSpecBuilder)
)
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/impl/XFunSpecImpl.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/impl/XFunSpecImpl.kt
index 938d8b0..b93c931 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/impl/XFunSpecImpl.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/impl/XFunSpecImpl.kt
@@ -54,6 +54,10 @@
delegates.forEach { it.addParameter(parameter) }
}
+ override fun addParameter(name: String, typeName: XTypeName) = apply {
+ delegates.forEach { it.addParameter(name, typeName) }
+ }
+
override fun addCode(code: XCodeBlock) = apply { delegates.forEach { it.addCode(code) } }
override fun callSuperConstructor(vararg args: XCodeBlock) = apply {
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaFunSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaFunSpec.kt
index e355dd6..9066106 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaFunSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaFunSpec.kt
@@ -41,8 +41,10 @@
override fun toString() = actual.toString()
- internal class Builder(internal val actual: JFunSpecBuilder) :
- XSpec.Builder(), XFunSpec.Builder {
+ internal class Builder(
+ private val addJavaNullabilityAnnotation: Boolean,
+ internal val actual: JFunSpecBuilder
+ ) : XSpec.Builder(), XFunSpec.Builder {
override fun addAnnotation(annotation: XAnnotationSpec) = apply {
require(annotation is XAnnotationSpecImpl)
@@ -61,6 +63,11 @@
actual.addParameter(parameter.java.actual)
}
+ override fun addParameter(name: String, typeName: XTypeName) =
+ addParameter(
+ XParameterSpec.builder(name, typeName, addJavaNullabilityAnnotation).build()
+ )
+
override fun addCode(code: XCodeBlock) = apply {
require(code is XCodeBlockImpl)
actual.addCode(code.java.actual)
@@ -83,12 +90,14 @@
if (typeName.java == JTypeName.VOID) {
return@apply
}
- // TODO(b/247242374) Add nullability annotations for non-private methods
- if (!actual.modifiers.contains(Modifier.PRIVATE)) {
- if (typeName.nullability == XNullability.NULLABLE) {
- actual.addAnnotation(NULLABLE_ANNOTATION)
- } else if (typeName.nullability == XNullability.NONNULL) {
- actual.addAnnotation(NONNULL_ANNOTATION)
+ if (addJavaNullabilityAnnotation) {
+ // TODO(b/247242374) Add nullability annotations for non-private methods
+ if (!actual.modifiers.contains(Modifier.PRIVATE)) {
+ if (typeName.nullability == XNullability.NULLABLE) {
+ actual.addAnnotation(NULLABLE_ANNOTATION)
+ } else if (typeName.nullability == XNullability.NONNULL) {
+ actual.addAnnotation(NONNULL_ANNOTATION)
+ }
}
}
actual.returns(typeName.java)
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinFunSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinFunSpec.kt
index 9d6a905..8c68cfc 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinFunSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinFunSpec.kt
@@ -56,6 +56,9 @@
actual.addParameter(parameter.kotlin.actual)
}
+ override fun addParameter(name: String, typeName: XTypeName) =
+ addParameter(XParameterSpec.builder(name, typeName).build())
+
override fun addCode(code: XCodeBlock) = apply {
require(code is XCodeBlockImpl)
actual.addCode(code.kotlin.actual)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/ext/xpoet_ext.kt b/room/room-compiler/src/main/kotlin/androidx/room/ext/xpoet_ext.kt
index c6f51d1..07a1f63 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/ext/xpoet_ext.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/ext/xpoet_ext.kt
@@ -393,7 +393,7 @@
isOverride = true
)
.apply {
- addParameter(parameterTypeName, parameterName)
+ addParameter(parameterName, parameterTypeName)
returns(returnTypeName)
callBody()
}
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/PositionalDataSourceQueryResultBinder.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/PositionalDataSourceQueryResultBinder.kt
index 9dd9b07..360af30 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/PositionalDataSourceQueryResultBinder.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/PositionalDataSourceQueryResultBinder.kt
@@ -73,7 +73,7 @@
.apply {
returns(LIST.parametrizedBy(itemTypeName))
val cursorParamName = "cursor"
- addParameter(CURSOR, cursorParamName)
+ addParameter(cursorParamName, CURSOR)
val resultVar = scope.getTmpVar("_res")
val rowsScope = scope.fork()
listAdapter?.convert(resultVar, cursorParamName, rowsScope)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/types/EnumColumnTypeAdapter.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/types/EnumColumnTypeAdapter.kt
index ea84124..fafec01 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/types/EnumColumnTypeAdapter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/types/EnumColumnTypeAdapter.kt
@@ -149,7 +149,7 @@
}
builder.apply {
returns(CommonTypeNames.STRING.copy(nullable = false))
- addParameter(enumTypeElement.asClassName(), paramName)
+ addParameter(paramName, enumTypeElement.asClassName())
addCode(body)
}
}
@@ -219,7 +219,7 @@
}
builder.apply {
returns(enumTypeElement.asClassName())
- addParameter(CommonTypeNames.STRING.copy(nullable = false), paramName)
+ addParameter(paramName, CommonTypeNames.STRING.copy(nullable = false))
addCode(body)
}
}
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
index 4680f70..7d0e36f 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
@@ -538,11 +538,11 @@
)
returns(CommonTypeNames.LIST.parametrizedBy(RoomTypeNames.MIGRATION))
addParameter(
+ specsMapParamName,
CommonTypeNames.MAP.parametrizedBy(
classOfAutoMigrationSpecTypeName,
RoomTypeNames.AUTO_MIGRATION_SPEC,
- ),
- specsMapParamName
+ )
)
addCode(body)
}
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityCursorConverterWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityCursorConverterWriter.kt
index 8219eb0..fae09f5 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityCursorConverterWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityCursorConverterWriter.kt
@@ -47,9 +47,9 @@
builder.apply {
val cursorParamName = if (userDriverApi) "statement" else "cursor"
if (userDriverApi) {
- addParameter(SQLiteDriverTypeNames.STATEMENT, cursorParamName)
+ addParameter(cursorParamName, SQLiteDriverTypeNames.STATEMENT)
} else {
- addParameter(AndroidTypeNames.CURSOR, cursorParamName)
+ addParameter(cursorParamName, AndroidTypeNames.CURSOR)
}
returns(entity.typeName)
addCode(buildConvertMethodBody(writer, cursorParamName))
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityDeleteAdapterWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityDeleteAdapterWriter.kt
index aa1390c8..6dd65a5 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityDeleteAdapterWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityDeleteAdapterWriter.kt
@@ -88,15 +88,15 @@
.apply {
val stmtParam = "statement"
addParameter(
+ stmtParam,
if (useDriverApi) {
SQLiteDriverTypeNames.STATEMENT
} else {
SupportDbTypeNames.SQLITE_STMT
- },
- stmtParam
+ }
)
val entityParam = "entity"
- addParameter(pojoTypeName, entityParam)
+ addParameter(entityParam, pojoTypeName)
val mapped = FieldWithIndex.byOrder(fields)
val bindScope =
CodeGenScope(writer = typeWriter, useDriverApi = useDriverApi)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityInsertAdapterWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityInsertAdapterWriter.kt
index ce616aa..527e92e 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityInsertAdapterWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityInsertAdapterWriter.kt
@@ -126,15 +126,15 @@
returns(XTypeName.UNIT_VOID)
val stmtParam = "statement"
addParameter(
+ stmtParam,
if (useDriverApi) {
SQLiteDriverTypeNames.STATEMENT
} else {
SupportDbTypeNames.SQLITE_STMT
- },
- stmtParam
+ }
)
val entityParam = "entity"
- addParameter(pojo.typeName, entityParam)
+ addParameter(entityParam, pojo.typeName)
val mapped = FieldWithIndex.byOrder(pojo.fields)
val bindScope =
CodeGenScope(writer = typeWriter, useDriverApi = useDriverApi)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpdateAdapterWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpdateAdapterWriter.kt
index 472771f9..7cda73c 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpdateAdapterWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpdateAdapterWriter.kt
@@ -95,15 +95,15 @@
.apply {
val stmtParam = "statement"
addParameter(
+ stmtParam,
if (useDriverApi) {
SQLiteDriverTypeNames.STATEMENT
} else {
SupportDbTypeNames.SQLITE_STMT
- },
- stmtParam
+ }
)
val entityParam = "entity"
- addParameter(pojo.typeName, entityParam)
+ addParameter(entityParam, pojo.typeName)
val mappedField = FieldWithIndex.byOrder(pojo.fields)
val bindScope =
CodeGenScope(writer = typeWriter, useDriverApi = useDriverApi)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/OpenDelegateWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/OpenDelegateWriter.kt
index 1880e6df..855737a 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/OpenDelegateWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/OpenDelegateWriter.kt
@@ -94,7 +94,7 @@
)
.apply {
returns(RoomTypeNames.ROOM_OPEN_DELEGATE_VALIDATION_RESULT)
- addParameter(SQLiteDriverTypeNames.CONNECTION, connectionParamName)
+ addParameter(connectionParamName, SQLiteDriverTypeNames.CONNECTION)
var statementCount = 0
while (!entities.isEmpty() && statementCount < VALIDATE_CHUNK_SIZE) {
val methodScope = scope.fork()
@@ -178,7 +178,7 @@
visibility = VisibilityModifier.PUBLIC,
isOverride = true
)
- .apply { addParameter(SQLiteDriverTypeNames.CONNECTION, connectionParamName) }
+ .apply { addParameter(connectionParamName, SQLiteDriverTypeNames.CONNECTION) }
.build()
}
@@ -189,7 +189,7 @@
isOverride = true
)
.apply {
- addParameter(SQLiteDriverTypeNames.CONNECTION, connectionParamName)
+ addParameter(connectionParamName, SQLiteDriverTypeNames.CONNECTION)
if (database.enableForeignKeys) {
addStatement(
"%L",
@@ -212,7 +212,7 @@
isOverride = true
)
.apply {
- addParameter(SQLiteDriverTypeNames.CONNECTION, connectionParamName)
+ addParameter(connectionParamName, SQLiteDriverTypeNames.CONNECTION)
database.bundle.buildCreateQueries().forEach { createQuery ->
addStatement(
"%L",
@@ -234,7 +234,7 @@
isOverride = true
)
.apply {
- addParameter(SQLiteDriverTypeNames.CONNECTION, connectionParamName)
+ addParameter(connectionParamName, SQLiteDriverTypeNames.CONNECTION)
database.entities.forEach {
addStatement(
"%L",
@@ -266,7 +266,7 @@
isOverride = true
)
.apply {
- addParameter(SQLiteDriverTypeNames.CONNECTION, connectionParamName)
+ addParameter(connectionParamName, SQLiteDriverTypeNames.CONNECTION)
addStatement(
"%M(%L)",
RoomMemberNames.DB_UTIL_DROP_FTS_SYNC_TRIGGERS,
@@ -283,7 +283,7 @@
isOverride = true
)
.apply {
- addParameter(SQLiteDriverTypeNames.CONNECTION, connectionParamName)
+ addParameter(connectionParamName, SQLiteDriverTypeNames.CONNECTION)
database.entities
.filterIsInstance(FtsEntity::class.java)
.filter { it.ftsOptions.contentEntity != null }
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/RelationCollectorFunctionWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/RelationCollectorFunctionWriter.kt
index 9ab9ddb..36d6c80 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/RelationCollectorFunctionWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/RelationCollectorFunctionWriter.kt
@@ -107,9 +107,9 @@
}
builder.apply {
if (useDriverApi) {
- addParameter(SQLiteDriverTypeNames.CONNECTION, PARAM_CONNECTION_VARIABLE)
+ addParameter(PARAM_CONNECTION_VARIABLE, SQLiteDriverTypeNames.CONNECTION)
}
- addParameter(collector.mapTypeName, PARAM_MAP_VARIABLE)
+ addParameter(PARAM_MAP_VARIABLE, collector.mapTypeName)
addCode(scope.generate())
}
}
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt
index 17f761a..f4ff34f 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt
@@ -375,7 +375,7 @@
.build()
)
.returns(to)
- .addParameter(from, "input")
+ .addParameter("input", from)
.apply {
if (to.isPrimitive) {
addStatement("return 0")
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/solver/CustomTypeConverterResolutionTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/solver/CustomTypeConverterResolutionTest.kt
index 3f95f66..59f2647 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/solver/CustomTypeConverterResolutionTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/solver/CustomTypeConverterResolutionTest.kt
@@ -402,7 +402,7 @@
createConvertersAnnotation(useCollection = useCollection)
)
}
- addParameter(customType, "custom")
+ addParameter("custom", customType)
.apply {
if (hasParameterConverters) {
addAnnotation(