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(