Merge "Use new JvmDefaultMode values for Kotlin 1.6.20" into androidx-main
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableElementTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableElementTest.kt
index 05b489d..fda9147 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableElementTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableElementTest.kt
@@ -156,9 +156,6 @@
fun withDefaultWithTypeArgs(param1: List<String>): String {
return param1.first()
}
- private fun privateWithDefault(): String {
- return ""
- }
}
interface Sub : Base
@@ -200,12 +197,6 @@
element.getMethodByJvmName("withDefaultWithTypeArgs").let { method ->
assertThat(method.hasKotlinDefaultImpl()).isTrue()
}
- // private functions in interfaces don't appear in kapt stubs
- if (invocation.isKsp && className == "Base") {
- element.getMethodByJvmName("privateWithDefault").let { method ->
- assertThat(method.hasKotlinDefaultImpl()).isFalse()
- }
- }
}
}
}
@@ -237,9 +228,6 @@
fun withDefaultWithTypeArgs(param1: List<String>): String {
return param1.first()
}
- private fun privateWithDefault(): String {
- return ""
- }
}
interface Sub : Base<Int, String>
@@ -295,12 +283,6 @@
element.getMethodByJvmName("withDefaultWithTypeArgs").let { method ->
assertThat(method.hasKotlinDefaultImpl()).isTrue()
}
- // private functions in interfaces don't appear in kapt stubs
- if (invocation.isKsp && className == "Base") {
- element.getMethodByJvmName("privateWithDefault").let { method ->
- assertThat(method.hasKotlinDefaultImpl()).isFalse()
- }
- }
}
listOf("Base2", "Sub2").forEach { className ->
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/writer/DefaultsInDaoTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/writer/DefaultsInDaoTest.kt
index c6620bd..6f5d816 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/writer/DefaultsInDaoTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/writer/DefaultsInDaoTest.kt
@@ -27,7 +27,8 @@
import org.jetbrains.kotlin.config.JvmDefaultMode
import org.junit.Test
import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.junit.runners.Parameterized
+import org.junit.runners.Parameterized.Parameters
/**
* Tests that we generate the right calls for default method implementations.
@@ -37,10 +38,19 @@
*
* For Java default method tests, we have DefaultDaoMethodsTest in TestApp.
*/
-@RunWith(JUnit4::class)
-class DefaultsInDaoTest {
+@RunWith(Parameterized::class)
+class DefaultsInDaoTest(
+ private val jvmDefaultMode: JvmDefaultMode
+) {
@Test
fun abstractDao() {
+ val defaultWithCompatibilityAnnotation =
+ if (jvmDefaultMode == JvmDefaultMode.ALL_COMPATIBILITY) {
+ "@JvmDefaultWithoutCompatibility"
+ } else {
+ ""
+ }
+
val source = Source.kotlin(
"Foo.kt",
"""
@@ -53,11 +63,12 @@
}
}
+ $defaultWithCompatibilityAnnotation
@Dao
abstract class SubjectDao : BaseDao<User>
""".trimIndent()
)
- compileInEachDefaultsMode(source) { _, generated ->
+ compileInEachDefaultsMode(source) { generated ->
generated.contains("public void upsert(final User obj)")
generated.contains("SubjectDao_Impl.super.upsert(")
generated.doesNotContain("SubjectDao.super.upsert")
@@ -83,12 +94,12 @@
interface SubjectDao : BaseDao<User>
""".trimIndent()
)
- compileInEachDefaultsMode(source) { mode, generated ->
+ compileInEachDefaultsMode(source) { generated ->
generated.contains("public void upsert(final User obj)")
- if (mode == JvmDefaultMode.ALL_INCOMPATIBLE) {
- generated.contains("SubjectDao.super.upsert(")
- } else {
+ if (jvmDefaultMode == JvmDefaultMode.DISABLE) {
generated.contains("SubjectDao.DefaultImpls.upsert(SubjectDao_Impl.this")
+ } else {
+ generated.contains("SubjectDao.super.upsert(")
}
generated.doesNotContain("SubjectDao_Impl.super.upsert")
@@ -114,13 +125,13 @@
interface SubjectDao : BaseDao<User>
""".trimIndent()
)
- compileInEachDefaultsMode(source) { mode, generated ->
+ compileInEachDefaultsMode(source) { generated ->
generated.contains("public Object upsert(final User obj, " +
"final Continuation<? super Unit> continuation)")
- if (mode == JvmDefaultMode.ALL_INCOMPATIBLE) {
- generated.contains("SubjectDao.super.upsert(")
- } else {
+ if (jvmDefaultMode == JvmDefaultMode.DISABLE) {
generated.contains("SubjectDao.DefaultImpls.upsert(SubjectDao_Impl.this")
+ } else {
+ generated.contains("SubjectDao.super.upsert(")
}
generated.doesNotContain("SubjectDao_Impl.super.upsert")
@@ -130,41 +141,45 @@
private fun compileInEachDefaultsMode(
source: Source,
- handler: (JvmDefaultMode, StringSubject) -> Unit
+ handler: (StringSubject) -> Unit
) {
- listOf(
- JvmDefaultMode.ENABLE,
- JvmDefaultMode.ENABLE_WITH_DEFAULT_IMPLS,
- JvmDefaultMode.ALL_INCOMPATIBLE
- ).forEach { jvmDefaultMode ->
- // TODO should run these with KSP as well. https://github.com/google/ksp/issues/627
- runKaptTest(
- sources = listOf(source, COMMON.COROUTINES_ROOM, COMMON.ROOM_DATABASE_KTX),
- kotlincArguments = listOf("-Xjvm-default=${jvmDefaultMode.description}")
- ) { invocation ->
- invocation.roundEnv
- .getElementsAnnotatedWith(
- androidx.room.Dao::class.qualifiedName!!
- ).filterIsInstance<XTypeElement>()
- .forEach { dao ->
- val db = invocation.context.processingEnv
- .requireTypeElement(RoomTypeNames.ROOM_DB)
- val dbType = db.type
- val parser = DaoProcessor(
- baseContext = invocation.context,
- element = dao,
- dbType = dbType,
- dbVerifier = createVerifierFromEntitiesAndViews(invocation)
- )
- val parsedDao = parser.process()
- DaoWriter(parsedDao, db, invocation.processingEnv)
- .write(invocation.processingEnv)
- invocation.assertCompilationResult {
- val relativePath = parsedDao.implTypeName.simpleName() + ".java"
- handler(jvmDefaultMode, generatedSourceFileWithPath(relativePath))
- }
+ // TODO should run these with KSP as well. https://github.com/google/ksp/issues/627
+ runKaptTest(
+ sources = listOf(source, COMMON.COROUTINES_ROOM, COMMON.ROOM_DATABASE_KTX),
+ kotlincArguments = listOf("-Xjvm-default=${jvmDefaultMode.description}")
+ ) { invocation ->
+ invocation.roundEnv
+ .getElementsAnnotatedWith(
+ androidx.room.Dao::class.qualifiedName!!
+ ).filterIsInstance<XTypeElement>()
+ .forEach { dao ->
+ val db = invocation.context.processingEnv
+ .requireTypeElement(RoomTypeNames.ROOM_DB)
+ val dbType = db.type
+ val parser = DaoProcessor(
+ baseContext = invocation.context,
+ element = dao,
+ dbType = dbType,
+ dbVerifier = createVerifierFromEntitiesAndViews(invocation)
+ )
+ val parsedDao = parser.process()
+ DaoWriter(parsedDao, db, invocation.processingEnv)
+ .write(invocation.processingEnv)
+ invocation.assertCompilationResult {
+ val relativePath = parsedDao.implTypeName.simpleName() + ".java"
+ handler(generatedSourceFileWithPath(relativePath))
}
- }
+ }
}
}
+
+ companion object {
+ @JvmStatic
+ @Parameters(name = "jvmDefaultMode={0}")
+ fun modes() = listOf(
+ JvmDefaultMode.ALL_COMPATIBILITY,
+ JvmDefaultMode.ALL_INCOMPATIBLE,
+ JvmDefaultMode.DISABLE,
+ )
+ }
}
\ No newline at end of file