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