diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt index 272c74e02f3..b4d428ecd9d 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.gradle.KotlinGradleModelBuilder import org.jetbrains.kotlin.gradle.KotlinMPPGradleModel import org.jetbrains.kotlin.idea.inspections.gradle.getDependencyModules import org.jetbrains.kotlin.idea.util.CopyableDataNodeUserDataProperty +import org.jetbrains.kotlin.idea.util.DataNodeUserDataProperty import org.jetbrains.kotlin.idea.util.NotNullableCopyableDataNodeUserDataProperty import org.jetbrains.plugins.gradle.model.ExternalProjectDependency import org.jetbrains.plugins.gradle.model.ExternalSourceSet @@ -59,9 +60,8 @@ var DataNode.implementedModuleNames by NotNullableCopyableDataNodeUserDataProperty(Key.create>("IMPLEMENTED_MODULE_NAME"), emptyList()) // Project is usually the same during all import, thus keeping Map Project->Dependencies makes model a bit more complicated but allows to avoid future problems var DataNode.dependenciesCache - by NotNullableCopyableDataNodeUserDataProperty( - Key.create, Collection>>>("MODULE_DEPENDENCIES_CACHE"), - HashMap() + by DataNodeUserDataProperty( + Key.create, Collection>>>("MODULE_DEPENDENCIES_CACHE") ) @@ -97,8 +97,9 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() .singleOrNull() private fun DataNode.getDependencies(ideProject: DataNode): Collection> { - if (dependenciesCache.containsKey(ideProject)) { - return dependenciesCache[ideProject]!! + val cache = dependenciesCache ?: HashMap() + if (cache.containsKey(ideProject)) { + return cache[ideProject]!! } val outputToSourceSet = ideProject.getUserData(GradleProjectResolver.MODULES_OUTPUTS) val sourceSetByName = ideProject.getUserData(GradleProjectResolver.RESOLVED_SOURCE_SETS) ?: return emptySet() @@ -123,7 +124,8 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() else -> null } } - dependenciesCache[ideProject] = result + cache[ideProject] = result + dependenciesCache = cache return result } diff --git a/idea/src/org/jetbrains/kotlin/idea/util/userDataUtil.kt b/idea/src/org/jetbrains/kotlin/idea/util/userDataUtil.kt index 8fccbbd840a..307a7890287 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/userDataUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/userDataUtil.kt @@ -20,6 +20,12 @@ import com.intellij.openapi.externalSystem.model.DataNode import com.intellij.openapi.util.Key import kotlin.reflect.KProperty +class DataNodeUserDataProperty, T : Any>(val key: Key) { + operator fun getValue(thisRef: R, property: KProperty<*>) = thisRef.getUserData(key) + + operator fun setValue(thisRef: R, property: KProperty<*>, value: T?) = thisRef.putUserData(key, value) +} + class CopyableDataNodeUserDataProperty, T : Any>(val key: Key) { operator fun getValue(thisRef: R, property: KProperty<*>) = thisRef.getCopyableUserData(key)