Add cache for Module::languageVersionSettings

It might be useful because getExtraLanguageFeatures might be
rather expensive to compute

 #KT-21450 Fixed
This commit is contained in:
Denis Zharkov
2018-01-13 17:09:46 +03:00
parent 60874f29fe
commit d848238a46
@@ -22,6 +22,11 @@ import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.roots.ProjectFileIndex
import com.intellij.openapi.roots.ProjectRootModificationTracker
import com.intellij.openapi.util.Key
import com.intellij.psi.util.CachedValue
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.cli.common.arguments.Argument
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
@@ -95,30 +100,51 @@ fun Project.getLanguageVersionSettings(contextModule: Module? = null,
extraLanguageFeatures)
}
private val LANGUAGE_VERSION_SETTINGS = Key.create<CachedValue<LanguageVersionSettings>>("LANGUAGE_VERSION_SETTINGS")
val Module.languageVersionSettings: LanguageVersionSettings
get() {
val facetSettingsProvider = KotlinFacetSettingsProvider.getInstance(project)
if (facetSettingsProvider.getSettings(this) == null) return project.getLanguageVersionSettings(this)
val facetSettings = facetSettingsProvider.getInitializedSettings(this)
if (facetSettings.useProjectSettings) return project.getLanguageVersionSettings(this)
val languageVersion = facetSettings.languageLevel ?: getAndCacheLanguageLevelByDependencies()
val apiVersion = facetSettings.apiLevel ?: languageVersion
val cachedValue =
getUserData(LANGUAGE_VERSION_SETTINGS)
?: createCachedValueForLanguageVersionSettings().also { putUserData(LANGUAGE_VERSION_SETTINGS, it) }
val extraLanguageFeatures = getExtraLanguageFeatures(
facetSettings.targetPlatformKind ?: TargetPlatformKind.Common,
facetSettings.coroutineSupport,
facetSettings.compilerSettings,
this
)
return LanguageVersionSettingsImpl(
languageVersion,
ApiVersion.createByLanguageVersion(apiVersion),
facetSettings.mergedCompilerArguments?.configureAnalysisFlags(MessageCollector.NONE).orEmpty(),
extraLanguageFeatures
)
return cachedValue.value
}
private fun Module.createCachedValueForLanguageVersionSettings(): CachedValue<LanguageVersionSettings> {
return CachedValuesManager.getManager(project).createCachedValue({
CachedValueProvider.Result(
computeLanguageVersionSettings(),
ProjectRootModificationTracker.getInstance(
project
)
)
}, false)
}
private fun Module.computeLanguageVersionSettings(): LanguageVersionSettings {
val facetSettingsProvider = KotlinFacetSettingsProvider.getInstance(project)
if (facetSettingsProvider.getSettings(this) == null) return project.getLanguageVersionSettings(this)
val facetSettings = facetSettingsProvider.getInitializedSettings(this)
if (facetSettings.useProjectSettings) return project.getLanguageVersionSettings(this)
val languageVersion = facetSettings.languageLevel ?: getAndCacheLanguageLevelByDependencies()
val apiVersion = facetSettings.apiLevel ?: languageVersion
val extraLanguageFeatures = getExtraLanguageFeatures(
facetSettings.targetPlatformKind ?: TargetPlatformKind.Common,
facetSettings.coroutineSupport,
facetSettings.compilerSettings,
this
)
return LanguageVersionSettingsImpl(
languageVersion,
ApiVersion.createByLanguageVersion(apiVersion),
facetSettings.mergedCompilerArguments?.configureAnalysisFlags(MessageCollector.NONE).orEmpty(),
extraLanguageFeatures
)
}
val Module.targetPlatform: TargetPlatformKind<*>?
get() = KotlinFacetSettingsProvider.getInstance(project).getSettings(this)?.targetPlatformKind ?: project.targetPlatform