[KPM] IdeaKotlinProjectModelObjectGraphTest: Implement WriteReplacedModel annotation

KT-51386
This commit is contained in:
sebastian.sellmair
2022-02-18 16:31:00 +01:00
committed by Space
parent b353533ee1
commit 207f510cca
3 changed files with 33 additions and 14 deletions
@@ -5,11 +5,13 @@
package org.jetbrains.kotlin.gradle.kpm package org.jetbrains.kotlin.gradle.kpm
import org.jetbrains.kotlin.gradle.kpm.idea.WriteReplacedModel
import java.io.Serializable import java.io.Serializable
@WriteReplacedModel(SerializedKotlinExternalModelContainerCarrier::class)
internal class KotlinMutableExternalModelContainerImpl private constructor( internal class KotlinMutableExternalModelContainerImpl private constructor(
private val values: MutableMap<KotlinExternalModelKey<*>, Any> private val values: MutableMap<KotlinExternalModelKey<*>, Any>
) : KotlinMutableExternalModelContainer(), Serializable { ) : KotlinMutableExternalModelContainer() {
constructor() : this(mutableMapOf()) constructor() : this(mutableMapOf())
@@ -42,6 +44,7 @@ internal class KotlinMutableExternalModelContainerImpl private constructor(
} }
} }
@WriteReplacedModel(SerializedKotlinExternalModelContainerCarrier::class)
private class SerializedKotlinExternalModelContainer( private class SerializedKotlinExternalModelContainer(
private val serializedValues: MutableMap<KotlinExternalModelId<*>, ByteArray> private val serializedValues: MutableMap<KotlinExternalModelId<*>, ByteArray>
) : KotlinExternalModelContainer(), Serializable { ) : KotlinExternalModelContainer(), Serializable {
@@ -0,0 +1,10 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.kpm.idea
import kotlin.reflect.KClass
internal annotation class WriteReplacedModel(val replacedBy: KClass<*>)
@@ -11,8 +11,8 @@ import org.reflections.Reflections
import java.lang.reflect.Field import java.lang.reflect.Field
import java.lang.reflect.Modifier import java.lang.reflect.Modifier
import kotlin.reflect.KClass import kotlin.reflect.KClass
import kotlin.reflect.KVisibility
import kotlin.reflect.KVisibility.PUBLIC import kotlin.reflect.KVisibility.PUBLIC
import kotlin.reflect.full.findAnnotation
import kotlin.reflect.full.memberProperties import kotlin.reflect.full.memberProperties
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
@@ -80,20 +80,26 @@ class IdeaKotlinProjectModelObjectGraphTest(private val node: KClass<*>, @Suppre
@JvmStatic @JvmStatic
@Parameterized.Parameters(name = "{1}") @Parameterized.Parameters(name = "{1}")
fun findNodes(): List<Array<Any>> { fun findNodes(): List<Array<Any>> {
val classes = mutableSetOf<KClass<*>>(IdeaKotlinProjectModel::class) val classes = mutableSetOf<KClass<*>>()
val resolveQueue = ArrayDeque(classes) val resolveQueue = ArrayDeque<KClass<*>>(listOf(IdeaKotlinProjectModel::class))
while (resolveQueue.isNotEmpty()) { while (resolveQueue.isNotEmpty()) {
val children = resolveQueue.removeFirst().resolveReachableClasses() val next = resolveQueue.removeFirst()
children.forEach { child ->
if (classes.add(child)) { /* Model gets replaced by other class */
resolveQueue.add(child) val writeReplacedModelAnnotation = next.findAnnotation<WriteReplacedModel>()
if (child.java.isInterface || Modifier.isAbstract(child.java.modifiers)) { if (writeReplacedModelAnnotation != null) {
val subtypes = reflections.getSubTypesOf(child.java).map { it.kotlin } resolveQueue.add(writeReplacedModelAnnotation.replacedBy)
assertTrue(subtypes.isNotEmpty(), "Missing implementations for $child") continue
classes.addAll(subtypes) }
resolveQueue.addAll(subtypes)
} if (!classes.add(next)) continue
next.resolveReachableClasses().forEach { child ->
resolveQueue.add(child)
if (child.java.isInterface || Modifier.isAbstract(child.java.modifiers)) {
val subtypes = reflections.getSubTypesOf(child.java).map { it.kotlin }
assertTrue(subtypes.isNotEmpty(), "Missing implementations for $child")
resolveQueue.addAll(subtypes)
} }
} }
} }