Misc: Eliminate instances of IdeModifiableModelsProviderImpl or dispose them after use

This commit is contained in:
Alexey Sedunov
2018-05-31 17:52:03 +03:00
parent e3223ab6d8
commit 8198599ef5
5 changed files with 36 additions and 34 deletions
@@ -5,10 +5,10 @@
package org.jetbrains.kotlin.idea.caches.project package org.jetbrains.kotlin.idea.caches.project
import com.intellij.facet.FacetManager
import com.intellij.facet.FacetTypeRegistry import com.intellij.facet.FacetTypeRegistry
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider import com.intellij.openapi.externalSystem.service.project.IdeModelsProviderImpl
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.module.impl.scopes.LibraryScopeBase import com.intellij.openapi.module.impl.scopes.LibraryScopeBase
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
@@ -121,21 +121,20 @@ private fun ideaModelDependencies(
return result.filterNot { it is LibraryInfo && it.platform != platform } return result.filterNot { it is LibraryInfo && it.platform != platform }
} }
fun Module.findImplementedModuleNames(modelsProvider: IdeModifiableModelsProvider): List<String> { fun Module.findImplementedModuleNames(): List<String> {
val facetModel = modelsProvider.getModifiableFacetModel(this) val facet = FacetManager.getInstance(this).findFacet(
val facet = facetModel.findFacet( KotlinFacetType.TYPE_ID,
KotlinFacetType.TYPE_ID, FacetTypeRegistry.getInstance().findFacetType(ID)!!.defaultFacetName
FacetTypeRegistry.getInstance().findFacetType(ID)!!.defaultFacetName
) )
return facet?.configuration?.settings?.implementedModuleNames ?: emptyList() return facet?.configuration?.settings?.implementedModuleNames ?: emptyList()
} }
fun Module.findImplementedModules() = this.cached<List<Module>>( fun Module.findImplementedModules() = this.cached<List<Module>>(
CachedValueProvider { CachedValueProvider {
val modelsProvider = IdeModifiableModelsProviderImpl(project) val modelsProvider = IdeModelsProviderImpl(project)
CachedValueProvider.Result( CachedValueProvider.Result(
findImplementedModuleNames(modelsProvider).mapNotNull { modelsProvider.findIdeModule(it) }, findImplementedModuleNames().mapNotNull { modelsProvider.findIdeModule(it) },
ProjectRootModificationTracker.getInstance(project) ProjectRootModificationTracker.getInstance(project)
) )
} }
) )
@@ -5,23 +5,22 @@
package org.jetbrains.kotlin.idea.caches.project package org.jetbrains.kotlin.idea.caches.project
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.roots.ProjectRootModificationTracker import com.intellij.openapi.roots.ProjectRootModificationTracker
import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValueProvider
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
fun Module.findImplementingModules(modelsProvider: IdeModifiableModelsProvider) = fun Module.findImplementingModules() =
modelsProvider.modules.filter { name in it.findImplementedModuleNames(modelsProvider) } ModuleManager.getInstance(project).modules.filter { name in it.findImplementedModuleNames() }
val Module.implementingModules: List<Module> val Module.implementingModules: List<Module>
get() = cached(CachedValueProvider { get() = cached(CachedValueProvider {
CachedValueProvider.Result( CachedValueProvider.Result(
findImplementingModules(IdeModifiableModelsProviderImpl(project)), findImplementingModules(),
ProjectRootModificationTracker.getInstance(project) ProjectRootModificationTracker.getInstance(project)
) )
}) })
@@ -32,11 +31,8 @@ private fun Module.getModuleInfo(baseModuleSourceInfo: ModuleSourceInfo): Module
else -> null else -> null
} }
private fun Module.findImplementingModuleInfos(moduleSourceInfo: ModuleSourceInfo): List<ModuleSourceInfo> { private fun Module.findImplementingModuleInfos(moduleSourceInfo: ModuleSourceInfo) =
val modelsProvider = IdeModifiableModelsProviderImpl(project) findImplementingModules().mapNotNull { it.getModuleInfo(moduleSourceInfo) }
val implementingModules = findImplementingModules(modelsProvider)
return implementingModules.mapNotNull { it.getModuleInfo(moduleSourceInfo) }
}
val ModuleDescriptor.implementingDescriptors: List<ModuleDescriptor> val ModuleDescriptor.implementingDescriptors: List<ModuleDescriptor>
get() { get() {
@@ -110,10 +110,14 @@ open class KotlinJavaModuleConfigurator protected constructor() : KotlinWithLibr
val sdkVersion = module.sdk?.version val sdkVersion = module.sdk?.version
if (sdkVersion != null && sdkVersion.isAtLeast(JavaSdkVersion.JDK_1_8)) { if (sdkVersion != null && sdkVersion.isAtLeast(JavaSdkVersion.JDK_1_8)) {
val modelsProvider = IdeModifiableModelsProviderImpl(project) val modelsProvider = IdeModifiableModelsProviderImpl(project)
val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false, commitModel = true) try {
val facetSettings = facet.configuration.settings val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false, commitModel = true)
facetSettings.initializeIfNeeded(module, null, TargetPlatformKind.Jvm(JvmTarget.JVM_1_8)) val facetSettings = facet.configuration.settings
(facetSettings.compilerArguments as? K2JVMCompilerArguments)?.jvmTarget = "1.8" facetSettings.initializeIfNeeded(module, null, TargetPlatformKind.Jvm(JvmTarget.JVM_1_8))
(facetSettings.compilerArguments as? K2JVMCompilerArguments)?.jvmTarget = "1.8"
} finally {
modelsProvider.dispose()
}
} }
} }
} }
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.idea package org.jetbrains.kotlin.idea
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.JdkOrderEntry import com.intellij.openapi.roots.JdkOrderEntry
import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootManager
@@ -24,7 +23,7 @@ class CommonModuleResolveScopeEnlarger : ResolveScopeEnlarger() {
val module = ProjectFileIndex.getInstance(project).getModuleForFile(file) val module = ProjectFileIndex.getInstance(project).getModuleForFile(file)
if (module?.targetPlatform != TargetPlatformKind.Common) return null if (module?.targetPlatform != TargetPlatformKind.Common) return null
val implementingModule = module.findImplementingModules(IdeModifiableModelsProviderImpl(project)).find { val implementingModule = module.findImplementingModules().find {
it.targetPlatform is TargetPlatformKind.Jvm it.targetPlatform is TargetPlatformKind.Jvm
} ?: return null } ?: return null
@@ -35,14 +35,18 @@ class MakeModuleExperimentalFix(
override fun invoke(project: Project, editor: Editor?, file: KtFile) { override fun invoke(project: Project, editor: Editor?, file: KtFile) {
val modelsProvider = IdeModifiableModelsProviderImpl(project) val modelsProvider = IdeModifiableModelsProviderImpl(project)
val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false, commitModel = true) try {
val facetSettings = facet.configuration.settings val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false, commitModel = true)
val compilerSettings = facetSettings.compilerSettings ?: CompilerSettings().also { val facetSettings = facet.configuration.settings
facetSettings.compilerSettings = it val compilerSettings = facetSettings.compilerSettings ?: CompilerSettings().also {
} facetSettings.compilerSettings = it
}
compilerSettings.additionalArguments += " $compilerArgument" compilerSettings.additionalArguments += " $compilerArgument"
facetSettings.updateMergedArguments() facetSettings.updateMergedArguments()
} finally {
modelsProvider.dispose()
}
} }
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean { override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {