From 2e01f62afe193e72013dea90d7fbe31575aa020d Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 15 Feb 2017 12:25:37 +0300 Subject: [PATCH] Kotlin Facet: Detect language/API version by stdlib when "Use project settings" is enabled, but project-level language/api version is not specified explicitly --- .../idea/caches/resolve/BuiltInsCache.kt | 4 +- .../idea/facet/KotlinVersionInfoProvider.kt | 74 +++++++++++++++++++ .../jetbrains/kotlin/idea/project/Platform.kt | 66 ++++++++++++----- .../idea/completion/KeywordCompletion.kt | 3 +- .../facet/MavenKotlinVersionInfoProvider.kt | 3 +- idea/src/META-INF/plugin.xml | 1 + .../LanguageVersionSettingsProviderImpl.kt | 4 +- .../GradleKotlinVersionInfoProvider.kt | 3 +- ...kLibraryValidatorWithDynamicDescription.kt | 4 +- .../idea/facet/KotlinVersionInfoProvider.kt | 30 -------- ...VersionInfoProviderByModuleDependencies.kt | 45 +++++++++++ .../jetbrains/kotlin/idea/facet/facetUtils.kt | 56 +------------- .../OverridingDeprecatedMemberInspection.kt | 5 +- .../idea/intentions/DestructureIntention.kt | 2 +- 14 files changed, 186 insertions(+), 114 deletions(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProvider.kt delete mode 100644 idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProvider.kt create mode 100644 idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProviderByModuleDependencies.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/BuiltInsCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/BuiltInsCache.kt index 9c8eace0613..c0d2e3b63e1 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/BuiltInsCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/BuiltInsCache.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.context.GlobalContextImpl import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.idea.project.languageVersionSettings +import org.jetbrains.kotlin.idea.project.getLanguageVersionSettings import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.platform.JvmBuiltIns import org.jetbrains.kotlin.resolve.TargetPlatform @@ -74,7 +74,7 @@ class BuiltInsCache private constructor( val builtInsCache = BuiltInsCache(project, platform, sdk, sdkModuleDescriptor, sdkContext) if (sdkBuiltIns is JvmBuiltIns) { - val isAdditionalBuiltInsFeatureSupported = project.languageVersionSettings.supportsFeature(LanguageFeature.AdditionalBuiltInsMembers) + val isAdditionalBuiltInsFeatureSupported = project.getLanguageVersionSettings().supportsFeature(LanguageFeature.AdditionalBuiltInsMembers) sdkBuiltIns.initialize( sdkModuleDescriptor!!, // sdk is not null for JvmBuiltIns because of calculateBuiltIns isAdditionalBuiltInsFeatureSupported) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProvider.kt new file mode 100644 index 00000000000..668e7f1b74d --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProvider.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2010-2017 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.extensions.ExtensionPointName +import com.intellij.openapi.module.Module +import com.intellij.openapi.roots.ModuleRootModel +import com.intellij.util.text.VersionComparatorUtil +import org.jetbrains.kotlin.config.JvmTarget +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.config.TargetPlatformKind + +interface KotlinVersionInfoProvider { + companion object { + val EP_NAME: ExtensionPointName = ExtensionPointName.create("org.jetbrains.kotlin.versionInfoProvider")!! + } + + fun getCompilerVersion(module: Module): String? + fun getLibraryVersions( + module: Module, + targetPlatform: TargetPlatformKind<*>, + rootModel: ModuleRootModel? + ): Collection +} + +fun getRuntimeLibraryVersions( + module: Module, + rootModel: ModuleRootModel?, + targetPlatform: TargetPlatformKind<*> +): Collection { + return KotlinVersionInfoProvider.EP_NAME + .extensions + .map { it.getLibraryVersions(module, targetPlatform, rootModel) } + .firstOrNull { it.isNotEmpty() } ?: emptyList() +} + +fun getLibraryLanguageLevel( + module: Module, + rootModel: ModuleRootModel?, + targetPlatform: TargetPlatformKind<*>? +): LanguageVersion { + val minVersion = getRuntimeLibraryVersions(module, rootModel, targetPlatform ?: TargetPlatformKind.Jvm[JvmTarget.JVM_1_8]) + .minWith(VersionComparatorUtil.COMPARATOR) + return getDefaultLanguageLevel(module, minVersion) +} + +fun getDefaultLanguageLevel( + module: Module, + explicitVersion: String? = null +): LanguageVersion { + val libVersion = explicitVersion + ?: KotlinVersionInfoProvider.EP_NAME.extensions + .mapNotNull { it.getCompilerVersion(module) } + .minWith(VersionComparatorUtil.COMPARATOR) + ?: return LanguageVersion.LATEST + return when { + libVersion.startsWith("1.0") -> LanguageVersion.KOTLIN_1_0 + else -> LanguageVersion.KOTLIN_1_1 + } +} \ No newline at end of file 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 b1e228c56d1..812236c1fd0 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 @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettings +import org.jetbrains.kotlin.idea.facet.getLibraryLanguageLevel import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.resolve.TargetPlatform @@ -42,31 +43,58 @@ private val multiPlatformProjectsArg: String by lazy { "-" + CommonCompilerArguments::multiPlatform.annotations.filterIsInstance().single().value } -val Project.languageVersionSettings: LanguageVersionSettings - get() { - val arguments = KotlinCommonCompilerArgumentsHolder.getInstance(this).settings - val languageVersion = LanguageVersion.fromVersionString(arguments.languageVersion) ?: LanguageVersion.LATEST - val apiVersion = ApiVersion.createByLanguageVersion(LanguageVersion.fromVersionString(arguments.apiVersion) ?: languageVersion) - val compilerSettings = KotlinCompilerSettings.getInstance(this).settings - val extraLanguageFeatures = getExtraLanguageFeatures( - TargetPlatformKind.Common, - CoroutineSupport.byCompilerArguments(KotlinCommonCompilerArgumentsHolder.getInstance(this).settings), - compilerSettings, - null - ) - return LanguageVersionSettingsImpl( - languageVersion, - apiVersion, - extraLanguageFeatures - ) +private fun Module.getAndCacheLanguageLevelByDependencies(): LanguageVersion { + val languageLevel = getLibraryLanguageLevel( + this, + null, + KotlinFacetSettingsProvider.getInstance(project).getSettings(this).versionInfo.targetPlatformKind + ) + + // Preserve inferred version in facet/project settings + val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getSettings(this) + if (facetSettings.useProjectSettings) { + with(KotlinCommonCompilerArgumentsHolder.getInstance(project).settings) { + languageVersion = languageLevel.versionString + apiVersion = languageLevel.versionString + } } + else { + with(facetSettings.versionInfo) { + this.languageLevel = languageLevel + this.apiLevel = languageLevel + } + } + + return languageLevel +} + +fun Project.getLanguageVersionSettings(contextModule: Module? = null): LanguageVersionSettings { + val arguments = KotlinCommonCompilerArgumentsHolder.getInstance(this).settings + val languageVersion = + LanguageVersion.fromVersionString(arguments.languageVersion) + ?: contextModule?.getAndCacheLanguageLevelByDependencies() + ?: LanguageVersion.LATEST + val apiVersion = ApiVersion.createByLanguageVersion(LanguageVersion.fromVersionString(arguments.apiVersion) ?: languageVersion) + val compilerSettings = KotlinCompilerSettings.getInstance(this).settings + val extraLanguageFeatures = getExtraLanguageFeatures( + TargetPlatformKind.Common, + CoroutineSupport.byCompilerArguments(KotlinCommonCompilerArgumentsHolder.getInstance(this).settings), + compilerSettings, + null + ) + return LanguageVersionSettingsImpl( + languageVersion, + apiVersion, + extraLanguageFeatures + ) +} val Module.languageVersionSettings: LanguageVersionSettings get() { val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getSettings(this) - if (facetSettings.useProjectSettings) return project.languageVersionSettings + if (facetSettings.useProjectSettings) return project.getLanguageVersionSettings(this) val versionInfo = facetSettings.versionInfo - val languageVersion = versionInfo.languageLevel ?: LanguageVersion.LATEST + val languageVersion = versionInfo.languageLevel ?: getAndCacheLanguageLevelByDependencies() val apiVersion = versionInfo.apiLevel ?: languageVersion val extraLanguageFeatures = getExtraLanguageFeatures( diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt index 539cc7642a2..d239ea1a0f5 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt @@ -385,7 +385,8 @@ object KeywordCompletion { } private fun isSupportedAtLanguageLevel(keyword: KtKeywordToken, position: PsiElement): Boolean { - val languageVersionSettings = ModuleUtilCore.findModuleForPsiElement(position)?.languageVersionSettings ?: LanguageVersionSettingsImpl.DEFAULT + val languageVersionSettings = ModuleUtilCore.findModuleForPsiElement(position)?.languageVersionSettings + ?: LanguageVersionSettingsImpl.DEFAULT val feature = when (keyword) { KtTokens.TYPE_ALIAS_KEYWORD -> LanguageFeature.TypeAliases KtTokens.HEADER_KEYWORD, KtTokens.IMPL_KEYWORD -> LanguageFeature.MultiPlatformProjects diff --git a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/facet/MavenKotlinVersionInfoProvider.kt b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/facet/MavenKotlinVersionInfoProvider.kt index c3f49156094..bfef998a26d 100644 --- a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/facet/MavenKotlinVersionInfoProvider.kt +++ b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/facet/MavenKotlinVersionInfoProvider.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.maven.facet import com.intellij.openapi.module.Module +import com.intellij.openapi.roots.ModuleRootModel import org.jetbrains.idea.maven.project.MavenProjectsManager import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.idea.facet.KotlinVersionInfoProvider @@ -30,7 +31,7 @@ class MavenKotlinVersionInfoProvider : KotlinVersionInfoProvider { return mavenProject.findPlugin(KotlinMavenConfigurator.GROUP_ID, KotlinMavenConfigurator.MAVEN_PLUGIN_ID)?.version } - override fun getLibraryVersions(module: Module, targetPlatform: TargetPlatformKind<*>): Collection { + override fun getLibraryVersions(module: Module, targetPlatform: TargetPlatformKind<*>, rootModel: ModuleRootModel?): Collection { val projectsManager = MavenProjectsManager.getInstance(module.project) val mavenProject = projectsManager.findProject(module) ?: return emptyList() return targetPlatform diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index ea107f62ece..fc3b79bf403 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -2091,6 +2091,7 @@ + diff --git a/idea/src/org/jetbrains/kotlin/idea/compiler/LanguageVersionSettingsProviderImpl.kt b/idea/src/org/jetbrains/kotlin/idea/compiler/LanguageVersionSettingsProviderImpl.kt index b4e5f40fcff..566fd97de2c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/compiler/LanguageVersionSettingsProviderImpl.kt +++ b/idea/src/org/jetbrains/kotlin/idea/compiler/LanguageVersionSettingsProviderImpl.kt @@ -20,15 +20,15 @@ import com.intellij.openapi.project.Project import org.jetbrains.kotlin.analyzer.LanguageSettingsProvider 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.getLanguageVersionSettings import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.project.targetPlatform import org.jetbrains.kotlin.utils.DescriptionAware class LanguageVersionSettingsProviderImpl : LanguageSettingsProvider { override fun getLanguageVersionSettings(moduleInfo: ModuleInfo, project: Project): LanguageVersionSettings { - return (moduleInfo as? ModuleSourceInfo)?.module?.languageVersionSettings ?: project.languageVersionSettings + return (moduleInfo as? ModuleSourceInfo)?.module?.languageVersionSettings ?: project.getLanguageVersionSettings() } override fun getTargetPlatform(moduleInfo: ModuleInfo): DescriptionAware { diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinVersionInfoProvider.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinVersionInfoProvider.kt index 037e0f6dc1e..46f1a0e39ad 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinVersionInfoProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/GradleKotlinVersionInfoProvider.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.module.Module +import com.intellij.openapi.roots.ModuleRootModel import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.idea.facet.KotlinVersionInfoProvider import org.jetbrains.kotlin.idea.facet.mavenLibraryIds @@ -44,7 +45,7 @@ class GradleKotlinVersionInfoProvider : KotlinVersionInfoProvider { return runReadAction { getGradleFile(module)?.let { DifferentKotlinGradleVersionInspection.getKotlinPluginVersion(it) } } } - override fun getLibraryVersions(module: Module, targetPlatform: TargetPlatformKind<*>): Collection { + override fun getLibraryVersions(module: Module, targetPlatform: TargetPlatformKind<*>, rootModel: ModuleRootModel?): Collection { return runReadAction { getGradleFile(module)?.let { DifferentStdlibGradleVersionInspection.getKotlinStdlibVersions(it, targetPlatform.mavenLibraryIds) diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/FrameworkLibraryValidatorWithDynamicDescription.kt b/idea/src/org/jetbrains/kotlin/idea/facet/FrameworkLibraryValidatorWithDynamicDescription.kt index 3a80affb637..fe71d1d4560 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/FrameworkLibraryValidatorWithDynamicDescription.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/FrameworkLibraryValidatorWithDynamicDescription.kt @@ -52,7 +52,9 @@ class FrameworkLibraryValidatorWithDynamicDescription( // TODO: propose to configure kotlin-stdlib-common once it's available if (targetPlatform == TargetPlatformKind.Common) return true - if (KotlinVersionInfoProvider.EP_NAME.extensions.any { it.getLibraryVersions(context.module, targetPlatform).isNotEmpty() }) return true + if (KotlinVersionInfoProvider.EP_NAME.extensions.any { + it.getLibraryVersions(context.module, targetPlatform, context.rootModel).isNotEmpty() + }) return true val libraryDescription = targetPlatform.libraryDescription val libraryKinds = libraryDescription.suitableLibraryKinds diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProvider.kt b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProvider.kt deleted file mode 100644 index 406b8dfb4b2..00000000000 --- a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProvider.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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.extensions.ExtensionPointName -import com.intellij.openapi.module.Module -import org.jetbrains.kotlin.config.TargetPlatformKind - -interface KotlinVersionInfoProvider { - companion object { - val EP_NAME: ExtensionPointName = ExtensionPointName.create("org.jetbrains.kotlin.versionInfoProvider")!! - } - - fun getCompilerVersion(module: Module): String? - fun getLibraryVersions(module: Module, targetPlatform: TargetPlatformKind<*>): Collection -} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProviderByModuleDependencies.kt b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProviderByModuleDependencies.kt new file mode 100644 index 00000000000..883e76bb6dc --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProviderByModuleDependencies.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2017 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 com.intellij.openapi.roots.LibraryOrderEntry +import com.intellij.openapi.roots.ModuleRootManager +import com.intellij.openapi.roots.ModuleRootModel +import com.intellij.openapi.roots.OrderRootType +import org.jetbrains.kotlin.config.TargetPlatformKind +import org.jetbrains.kotlin.idea.framework.JSLibraryStdPresentationProvider +import org.jetbrains.kotlin.idea.framework.JavaRuntimePresentationProvider +import org.jetbrains.kotlin.idea.versions.bundledRuntimeVersion + +class KotlinVersionInfoProviderByModuleDependencies : KotlinVersionInfoProvider { + override fun getCompilerVersion(module: Module) = bundledRuntimeVersion() + + override fun getLibraryVersions(module: Module, targetPlatform: TargetPlatformKind<*>, rootModel: ModuleRootModel?): Collection { + val presentationProvider = when (targetPlatform) { + is TargetPlatformKind.JavaScript -> JSLibraryStdPresentationProvider.getInstance() + is TargetPlatformKind.Jvm -> JavaRuntimePresentationProvider.getInstance() + is TargetPlatformKind.Common -> return emptyList() + } + return (rootModel ?: ModuleRootManager.getInstance(module)) + .orderEntries + .asSequence() + .filterIsInstance() + .mapNotNull { it.library?.let { presentationProvider.detect(it.getFiles(OrderRootType.CLASSES).toList())?.versionString } } + .toList() + } +} \ 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 34494486fbf..6c62c7a10b7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -20,10 +20,8 @@ import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsPr import com.intellij.openapi.module.Module import com.intellij.openapi.projectRoots.JavaSdk import com.intellij.openapi.projectRoots.JavaSdkVersion -import com.intellij.openapi.roots.LibraryOrderEntry import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModel -import com.intellij.openapi.roots.OrderRootType import com.intellij.util.text.VersionComparatorUtil import org.jetbrains.kotlin.cli.common.arguments.* import org.jetbrains.kotlin.compilerRunner.ArgumentUtils @@ -32,36 +30,9 @@ import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JsCompilerArgumen import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JvmCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettings -import org.jetbrains.kotlin.idea.framework.JSLibraryStdPresentationProvider -import org.jetbrains.kotlin.idea.framework.JavaRuntimePresentationProvider import org.jetbrains.kotlin.idea.versions.* import java.lang.reflect.Field -private fun getRuntimeLibraryVersions( - module: Module, - rootModel: ModuleRootModel?, - targetPlatform: TargetPlatformKind<*> -): Collection { - val presentationProvider = when (targetPlatform) { - is TargetPlatformKind.JavaScript -> JSLibraryStdPresentationProvider.getInstance() - is TargetPlatformKind.Jvm -> JavaRuntimePresentationProvider.getInstance() - is TargetPlatformKind.Common -> return emptyList() - } - - KotlinVersionInfoProvider.EP_NAME - .extensions - .map { it.getLibraryVersions(module, targetPlatform) } - .firstOrNull { it.isNotEmpty() } - ?.let { return it } - - return (rootModel ?: ModuleRootManager.getInstance(module)) - .orderEntries - .asSequence() - .filterIsInstance() - .mapNotNull { it.library?.let { presentationProvider.detect(it.getFiles(OrderRootType.CLASSES).toList())?.versionString } } - .toList() -} - private fun getDefaultTargetPlatform(module: Module, rootModel: ModuleRootModel?): TargetPlatformKind<*> { if (getRuntimeLibraryVersions(module, rootModel, TargetPlatformKind.JavaScript).isNotEmpty()) { return TargetPlatformKind.JavaScript @@ -78,31 +49,6 @@ private fun getDefaultTargetPlatform(module: Module, rootModel: ModuleRootModel? } } -private fun getDefaultLanguageLevel( - module: Module, - explicitVersion: String? = null -): LanguageVersion { - val libVersion = explicitVersion - ?: KotlinVersionInfoProvider.EP_NAME.extensions - .mapNotNull { it.getCompilerVersion(module) } - .minWith(VersionComparatorUtil.COMPARATOR) - ?: bundledRuntimeVersion() - return when { - libVersion.startsWith("1.0") -> LanguageVersion.KOTLIN_1_0 - else -> LanguageVersion.KOTLIN_1_1 - } -} - -internal fun getLibraryLanguageLevel( - module: Module, - rootModel: ModuleRootModel?, - targetPlatform: TargetPlatformKind<*>? -): LanguageVersion { - val minVersion = getRuntimeLibraryVersions(module, rootModel, targetPlatform ?: TargetPlatformKind.Jvm[JvmTarget.JVM_1_8]) - .minWith(VersionComparatorUtil.COMPARATOR) - return getDefaultLanguageLevel(module, minVersion) -} - fun KotlinFacetSettings.initializeIfNeeded(module: Module, rootModel: ModuleRootModel?) { val project = module.project diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/OverridingDeprecatedMemberInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/OverridingDeprecatedMemberInspection.kt index 9da0a017d3f..ebdcc729247 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/OverridingDeprecatedMemberInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/OverridingDeprecatedMemberInspection.kt @@ -23,7 +23,10 @@ import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.project.languageVersionSettings -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtNamedDeclaration +import org.jetbrains.kotlin.psi.KtPropertyAccessor +import org.jetbrains.kotlin.psi.KtVisitorVoid import org.jetbrains.kotlin.resolve.deprecatedByOverriddenMessage import org.jetbrains.kotlin.resolve.getDeprecations diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/DestructureIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/DestructureIntention.kt index 1223065d5a7..9673b545996 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/DestructureIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/DestructureIntention.kt @@ -26,7 +26,7 @@ import com.intellij.util.Query import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.idea.caches.resolve.* +import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection