From 30d08c989dfba85fd9a1153ff0e0a4cac622229a Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 27 Oct 2016 18:35:02 +0300 Subject: [PATCH] Kotlin Facet: Use facet configuration to provide language version for IDE analyzer --- .../kotlin/resolve/jvm/JvmAnalyzerFacade.kt | 3 +- .../kotlin/analyzer/AnalyzerFacade.kt | 16 ++++++++++ .../kotlin/config/LanguageVersionSettings.kt | 1 + idea/idea-analysis/idea-analysis.iml | 1 + .../idea/caches/resolve/JsAnalyzerFacade.kt | 9 ++++-- .../idea/caches/resolve/KotlinResolveCache.kt | 4 +-- .../navigation/SourceNavigationHelper.java | 2 +- .../jetbrains/kotlin/idea/project/Platform.kt | 14 +++++++++ .../idea/project/ResolveElementCache.kt | 3 +- .../kotlin/config/KotlinFacetSettings.kt | 11 +++++++ idea/src/META-INF/plugin.xml | 6 ++++ .../LanguageVersionSettingsProviderImpl.kt | 30 +++++++++++++++++++ .../facet/KotlinFacetSettingsProviderImpl.kt | 29 ++++++++++++++++++ .../jetbrains/kotlin/idea/facet/facetUtils.kt | 6 ---- 14 files changed, 119 insertions(+), 16 deletions(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/compiler/LanguageVersionSettingsProviderImpl.kt create mode 100644 idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetSettingsProviderImpl.kt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt index 72fd1299e05..0a1611826d9 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.resolve.jvm import com.intellij.openapi.diagnostic.Logger import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analyzer.* -import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.descriptors.PackagePartProvider @@ -88,7 +87,7 @@ object JvmAnalyzerFacade : AnalyzerFacade() { targetEnvironment, LookupTracker.DO_NOTHING, packagePartProvider, - LanguageVersionSettingsImpl.DEFAULT, // TODO: see KT-12410 + LanguageVersionSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo), useBuiltInsProvider = false, // TODO: load built-ins from module dependencies in IDE useLazyResolve = true ) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index a3580ba9ae9..119aed1c44d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -16,9 +16,13 @@ package org.jetbrains.kotlin.analyzer +import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.container.ComponentProvider import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.context.ProjectContext @@ -246,3 +250,15 @@ private class DelegatingPackageFragmentProvider( return delegate().getSubPackagesOf(fqName, nameFilter) } } + +interface LanguageVersionSettingsProvider { + fun getLanguageVersionSettings(moduleInfo: ModuleInfo): LanguageVersionSettings + + object Default : LanguageVersionSettingsProvider { + override fun getLanguageVersionSettings(moduleInfo: ModuleInfo) = LanguageVersionSettingsImpl.DEFAULT + } + + companion object { + fun getInstance(project: Project) = ServiceManager.getService(project, LanguageVersionSettingsProvider::class.java) ?: Default + } +} \ No newline at end of file diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index c24d9c8bc2c..6a5c567de4a 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.config +import com.intellij.openapi.module.Module import org.jetbrains.kotlin.config.LanguageVersion.KOTLIN_1_1 import org.jetbrains.kotlin.utils.DescriptionAware diff --git a/idea/idea-analysis/idea-analysis.iml b/idea/idea-analysis/idea-analysis.iml index 8a992c3135c..389f304003d 100644 --- a/idea/idea-analysis/idea-analysis.iml +++ b/idea/idea-analysis/idea-analysis.iml @@ -32,5 +32,6 @@ + \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsAnalyzerFacade.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsAnalyzerFacade.kt index 7aa4dbac927..800371ea652 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsAnalyzerFacade.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsAnalyzerFacade.kt @@ -20,7 +20,6 @@ import com.intellij.openapi.roots.OrderRootType import com.intellij.psi.search.GlobalSearchScope import com.intellij.util.PathUtil import org.jetbrains.kotlin.analyzer.* -import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.descriptors.PackagePartProvider @@ -57,8 +56,12 @@ object JsAnalyzerFacade : AnalyzerFacade() { ) val container = createContainerForLazyResolve( - moduleContext, declarationProviderFactory, BindingTraceContext(), JsPlatform, targetEnvironment, - LanguageVersionSettingsImpl.DEFAULT // TODO: see KT-12410 + moduleContext, + declarationProviderFactory, + BindingTraceContext(), + JsPlatform, + targetEnvironment, + LanguageVersionSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo) ) var packageFragmentProvider = container.get().packageFragmentProvider diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinResolveCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinResolveCache.kt index 0ec727a77e1..6bde68fd77d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinResolveCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinResolveCache.kt @@ -23,7 +23,6 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.analyzer.AnalysisResult -import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.container.ComponentProvider import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.context.GlobalContext @@ -33,6 +32,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.diagnostics.DiagnosticUtils import org.jetbrains.kotlin.frontend.di.createContainerForLazyBodyResolve import org.jetbrains.kotlin.idea.project.TargetPlatformDetector +import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.* @@ -173,7 +173,7 @@ private object KotlinResolveDataProvider { trace, targetPlatform, componentProvider.get(), - LanguageVersionSettingsImpl.DEFAULT // TODO: see KT-12410 + analyzableElement.languageVersionSettings ).get() lazyTopDownAnalyzer.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, listOf(analyzableElement)) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/SourceNavigationHelper.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/SourceNavigationHelper.java index 0f79f1c1e0a..730c8a6a843 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/SourceNavigationHelper.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/SourceNavigationHelper.java @@ -251,7 +251,7 @@ public class SourceNavigationHelper { providerFactory, new BindingTraceContext(), TargetPlatform.Default.INSTANCE, - LanguageVersionSettingsImpl.DEFAULT // TODO: see KT-12410 + LanguageVersionSettingsImpl.DEFAULT ); newModuleContext.initializeModuleContents(resolveSession.getPackageFragmentProvider()); diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/Platform.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/Platform.kt index daafa1ceccb..9ee9b20f981 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/Platform.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/Platform.kt @@ -16,7 +16,10 @@ package org.jetbrains.kotlin.idea.project +import com.intellij.openapi.module.Module +import com.intellij.openapi.module.ModuleUtilCore import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.resolve.TargetPlatform @@ -26,3 +29,14 @@ val KtElement.platform: TargetPlatform val KtElement.builtIns: KotlinBuiltIns get() = getResolutionFacade().moduleDescriptor.builtIns + +val Module.languageVersionSettings: LanguageVersionSettings + get() { + val versionInfo = KotlinFacetSettingsProvider.getInstance(project).getSettings(this).versionInfo + val languageVersion = versionInfo.languageLevel ?: LanguageVersion.LATEST + val apiVersion = versionInfo.apiLevel ?: languageVersion + return LanguageVersionSettingsImpl(languageVersion, ApiVersion.createByLanguageVersion(apiVersion)) + } + +val KtElement.languageVersionSettings: LanguageVersionSettings + get() = ModuleUtilCore.findModuleForPsiElement(this)?.languageVersionSettings ?: LanguageVersionSettingsImpl.DEFAULT \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt index 2c5ccdf4264..ba975577e2f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt @@ -23,7 +23,6 @@ import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.PsiModificationTracker import com.intellij.util.containers.ContainerUtil import org.jetbrains.kotlin.cfg.ControlFlowInformationProvider -import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.context.SimpleGlobalContext import org.jetbrains.kotlin.context.withModule @@ -588,7 +587,7 @@ class ResolveElementCache( trace, targetPlatform, statementFilter, - LanguageVersionSettingsImpl.DEFAULT // TODO: see KT-12410 + file.languageVersionSettings ).get() } diff --git a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt index 1f5a591f091..3fe3eac2f47 100644 --- a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt +++ b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt @@ -32,6 +32,9 @@ package org.jetbrains.kotlin.config +import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.module.Module +import com.intellij.openapi.project.Project import com.intellij.util.xmlb.annotations.Property import com.intellij.util.xmlb.annotations.Transient import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments @@ -91,4 +94,12 @@ class KotlinCompilerInfo { class KotlinFacetSettings { var versionInfo = KotlinVersionInfo() var compilerInfo = KotlinCompilerInfo() +} + +interface KotlinFacetSettingsProvider { + fun getSettings(module: Module): KotlinFacetSettings + + companion object { + fun getInstance(project: Project) = ServiceManager.getService(project, KotlinFacetSettingsProvider::class.java)!! + } } \ No newline at end of file diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 62e91d7db62..8db61849953 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -294,6 +294,12 @@ + + + + diff --git a/idea/src/org/jetbrains/kotlin/idea/compiler/LanguageVersionSettingsProviderImpl.kt b/idea/src/org/jetbrains/kotlin/idea/compiler/LanguageVersionSettingsProviderImpl.kt new file mode 100644 index 00000000000..af9632c332f --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/compiler/LanguageVersionSettingsProviderImpl.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.compiler + +import org.jetbrains.kotlin.analyzer.LanguageVersionSettingsProvider +import org.jetbrains.kotlin.analyzer.ModuleInfo +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl +import org.jetbrains.kotlin.idea.caches.resolve.ModuleSourceInfo +import org.jetbrains.kotlin.idea.project.languageVersionSettings + +class LanguageVersionSettingsProviderImpl : LanguageVersionSettingsProvider { + override fun getLanguageVersionSettings(moduleInfo: ModuleInfo): LanguageVersionSettings { + return (moduleInfo as? ModuleSourceInfo)?.module?.languageVersionSettings ?: LanguageVersionSettingsImpl.DEFAULT + } +} diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetSettingsProviderImpl.kt b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetSettingsProviderImpl.kt new file mode 100644 index 00000000000..8913114f224 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetSettingsProviderImpl.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.facet + +import com.intellij.openapi.module.Module +import org.jetbrains.kotlin.config.KotlinFacetSettings +import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider + +class KotlinFacetSettingsProviderImpl : KotlinFacetSettingsProvider { + override fun getSettings(module: Module): KotlinFacetSettings { + val settings = KotlinFacet.get(module)?.configuration?.state ?: KotlinFacetSettings() + settings.initializeIfNeeded(module, null) + return settings + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index 3df72217f40..e7730cb2a5a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -129,12 +129,6 @@ internal fun KotlinFacetSettings.initializeIfNeeded(module: Module, rootModel: M } } -internal fun Module.getKotlinSettings(rootModel: ModuleRootModel? = null): KotlinFacetSettings { - val settings = KotlinFacet.get(this)?.configuration?.state ?: KotlinFacetSettings() - settings.initializeIfNeeded(this, rootModel) - return settings -} - val TargetPlatformKind<*>.mavenLibraryId: String get() { return when (this) {