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