diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.kt index 61142495ec7e..a20270680a87 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.kt @@ -1063,8 +1063,8 @@ class MavenProjectsTree(val project: Project) { companion object { private val LOG = Logger.getInstance(MavenProjectsTree::class.java) - private const val STORAGE_VERSION_NUMBER = 10 - private val STORAGE_VERSION = MavenProjectsTree::class.java.simpleName + "." + STORAGE_VERSION_NUMBER + private const val STORAGE_VERSION_NUMBER = 11 + val STORAGE_VERSION = MavenProjectsTree::class.java.simpleName + "." + STORAGE_VERSION_NUMBER private fun String.getStorageVersionNumber(): Int { val parts = this.split(".") diff --git a/plugins/maven/src/test/intellij.maven.tests.iml b/plugins/maven/src/test/intellij.maven.tests.iml index 5ed1a43a275c..2a0348f387d4 100644 --- a/plugins/maven/src/test/intellij.maven.tests.iml +++ b/plugins/maven/src/test/intellij.maven.tests.iml @@ -35,5 +35,6 @@ + \ No newline at end of file diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/importing/MavenProjectTreeVersionNumberTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/importing/MavenProjectTreeVersionNumberTest.kt new file mode 100644 index 000000000000..78e19c0b7fce --- /dev/null +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/importing/MavenProjectTreeVersionNumberTest.kt @@ -0,0 +1,59 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.idea.maven.project.importing + +import com.dynatrace.hash4j.hashing.HashSink +import com.dynatrace.hash4j.hashing.Hashing +import com.intellij.testFramework.UsefulTestCase +import org.jetbrains.idea.maven.project.MavenProjectsTree +import kotlin.reflect.KClass +import kotlin.reflect.KProperty +import kotlin.reflect.KType +import kotlin.reflect.full.createType +import kotlin.reflect.full.declaredMembers +import kotlin.reflect.full.findAnnotation + + +class MavenProjectTreeVersionNumberTest : UsefulTestCase() { + + fun `test do not forget updating STORAGE_VERSION_NUMBER when structure changed`() { + val hash = Hashing.komihash5_0().hashStream(); + val recursionKeeper = HashSet() + hashKType(MavenProjectsTree::class.createType(), recursionKeeper, hash) + + hash.putString(MavenProjectsTree.STORAGE_VERSION) + assertEquals("UPDATE STORAGE VERSION ALONG WITH THIS HASH!!!", -1853310441163155393L, hash.asLong) + } + + private fun hashKType(type: KType, recursionKeeper: MutableSet, hash: HashSink) { + val klass = type.classifier as? KClass<*> ?: return + + hash.putString(klass.qualifiedName) + hash.putBoolean(type.isMarkedNullable) + type.arguments.forEach { projection -> + val type = projection.type + if (type == null) { + hash.putString(projection.toString()) + } + else { + hashKType(type, recursionKeeper, hash) + } + } + if (shouldGoDeeper(klass) && recursionKeeper.add(klass.qualifiedName!!)) { + klass.declaredMembers.filterIsInstance>().forEach { t -> + if (!isTransient(t)) { + hash.putString(t.name) + hashKType(t.returnType, recursionKeeper, hash) + } + } + } + } + + private fun shouldGoDeeper(klass: KClass<*>): Boolean { + return klass.qualifiedName?.startsWith("org.jetbrains.idea.maven") == true + } + + private fun isTransient(prop: KProperty<*>): Boolean { + return prop.findAnnotation() != null && + prop.findAnnotation() == null + } +} \ No newline at end of file