From ce34deb9afad574fb118366629cbee26a200ed40 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 28 Jun 2018 14:34:49 +0200 Subject: [PATCH] Delete DefaultImportProvider, refactor TargetPlatform.defaultImports --- .../resolve/jvm/platform/JvmPlatform.kt | 28 +++------ .../kotlin/resolve/TargetPlatform.kt | 62 ++++++++++++------- .../resolve/lazy/DefaultImportProvider.kt | 39 ------------ .../kotlin/resolve/lazy/FileScopeFactory.kt | 5 +- .../idea/search/PsiBasedClassResolver.kt | 9 ++- .../ReplaceWithAnnotationAnalyzer.kt | 24 +++---- .../idea/util/ImportInsertHelperImpl.kt | 7 ++- .../jetbrains/kotlin/j2k/importConversion.kt | 6 +- .../jetbrains/kotlin/js/resolve/JsPlatform.kt | 11 ++-- 9 files changed, 82 insertions(+), 109 deletions(-) delete mode 100644 compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DefaultImportProvider.kt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt index 781650509cb..c9c3d60e16b 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt @@ -20,35 +20,25 @@ import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.MemberScope -import org.jetbrains.kotlin.storage.LockBasedStorageManager -import java.util.* +import org.jetbrains.kotlin.storage.StorageManager object JvmPlatform : TargetPlatform("JVM") { - private val defaultImports = LockBasedStorageManager().let { storageManager -> - storageManager.createMemoizedFunction> { includeKotlinComparisons -> - ArrayList().apply { - addAll(Common.getDefaultImports(includeKotlinComparisons)) + override fun computePlatformSpecificDefaultImports(storageManager: StorageManager, result: MutableList) { + result.add(ImportPath.fromString("kotlin.jvm.*")) - add(ImportPath.fromString("kotlin.jvm.*")) - - fun addAllClassifiersFromScope(scope: MemberScope) { - for (descriptor in scope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS, MemberScope.ALL_NAME_FILTER)) { - add(ImportPath(DescriptorUtils.getFqNameSafe(descriptor), false)) - } - } - - for (builtinPackageFragment in JvmBuiltIns(storageManager).builtInsPackageFragmentsImportedByDefault) { - addAllClassifiersFromScope(builtinPackageFragment.getMemberScope()) - } + fun addAllClassifiersFromScope(scope: MemberScope) { + for (descriptor in scope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS, MemberScope.ALL_NAME_FILTER)) { + result.add(ImportPath(DescriptorUtils.getFqNameSafe(descriptor), false)) } } + for (builtinPackageFragment in JvmBuiltIns(storageManager).builtInsPackageFragmentsImportedByDefault) { + addAllClassifiersFromScope(builtinPackageFragment.getMemberScope()) + } } override val defaultLowPriorityImports: List = listOf(ImportPath.fromString("java.lang.*")) - override fun getDefaultImports(includeKotlinComparisons: Boolean): List = defaultImports(includeKotlinComparisons) - override val platformConfigurator: PlatformConfigurator = JvmPlatformConfigurator override val multiTargetPlatform = MultiTargetPlatform.Specific(platformName) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt index 9a8408cdadb..b0168da52d8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.resolve import org.jetbrains.kotlin.builtins.PlatformToKotlinClassMap +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.composeContainer import org.jetbrains.kotlin.container.useInstance @@ -17,43 +19,61 @@ import org.jetbrains.kotlin.resolve.checkers.* import org.jetbrains.kotlin.resolve.lazy.DelegationFilter import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes import org.jetbrains.kotlin.storage.LockBasedStorageManager +import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.DynamicTypesSettings import java.util.* abstract class TargetPlatform(val platformName: String) { + private data class DefaultImportsKey(val includeKotlinComparisons: Boolean, val includeLowPriorityImports: Boolean) + + private val defaultImports = LockBasedStorageManager().let { storageManager -> + storageManager.createMemoizedFunction> { (includeKotlinComparisons, includeLowPriorityImports) -> + ArrayList().apply { + listOf( + "kotlin.*", + "kotlin.annotation.*", + "kotlin.collections.*", + "kotlin.ranges.*", + "kotlin.sequences.*", + "kotlin.text.*", + "kotlin.io.*" + ).forEach { add(ImportPath.fromString(it)) } + + if (includeKotlinComparisons) { + add(ImportPath.fromString("kotlin.comparisons.*")) + } + + computePlatformSpecificDefaultImports(storageManager, this) + + if (includeLowPriorityImports) { + addAll(defaultLowPriorityImports) + } + } + } + } + override fun toString() = platformName abstract val platformConfigurator: PlatformConfigurator open val defaultLowPriorityImports: List get() = emptyList() - abstract fun getDefaultImports(includeKotlinComparisons: Boolean): List + fun getDefaultImports(languageVersionSettings: LanguageVersionSettings, includeLowPriorityImports: Boolean): List = + defaultImports( + DefaultImportsKey( + languageVersionSettings.supportsFeature(LanguageFeature.DefaultImportOfPackageKotlinComparisons), + includeLowPriorityImports + ) + ) + + protected abstract fun computePlatformSpecificDefaultImports(storageManager: StorageManager, result: MutableList) open val excludedImports: List get() = emptyList() abstract val multiTargetPlatform: MultiTargetPlatform object Common : TargetPlatform("Default") { - private val defaultImports = - LockBasedStorageManager().createMemoizedFunction> { includeKotlinComparisons -> - ArrayList().apply { - listOf( - "kotlin.*", - "kotlin.annotation.*", - "kotlin.collections.*", - "kotlin.ranges.*", - "kotlin.sequences.*", - "kotlin.text.*", - "kotlin.io.*" - ).forEach { add(ImportPath.fromString(it)) } - - if (includeKotlinComparisons) { - add(ImportPath.fromString("kotlin.comparisons.*")) - } - } - } - - override fun getDefaultImports(includeKotlinComparisons: Boolean): List = defaultImports(includeKotlinComparisons) + override fun computePlatformSpecificDefaultImports(storageManager: StorageManager, result: MutableList) {} override val platformConfigurator = object : PlatformConfigurator( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DefaultImportProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DefaultImportProvider.kt deleted file mode 100644 index 5ada6ed7f1a..00000000000 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DefaultImportProvider.kt +++ /dev/null @@ -1,39 +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.resolve.lazy - -import org.jetbrains.kotlin.config.LanguageFeature.DefaultImportOfPackageKotlinComparisons -import org.jetbrains.kotlin.config.LanguageVersionSettings -import org.jetbrains.kotlin.resolve.ImportPath -import org.jetbrains.kotlin.resolve.SinceKotlinAccessibility -import org.jetbrains.kotlin.resolve.TargetPlatform -import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.storage.getValue - -class DefaultImportProvider( - storageManager: StorageManager, - private val targetPlatform: TargetPlatform, - private val languageVersionSettings: LanguageVersionSettings -) { - val defaultImports: List by storageManager.createLazyValue { - targetPlatform.getDefaultImports(languageVersionSettings.supportsFeature(DefaultImportOfPackageKotlinComparisons)) - } - - val allDefaultImports: List by storageManager.createLazyValue { - defaultImports + targetPlatform.defaultLowPriorityImports - } -} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt index 03ede647a7f..8cc979f9261 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt @@ -44,14 +44,15 @@ class FileScopeFactory( private val bindingTrace: BindingTrace, private val ktImportsFactory: KtImportsFactory, private val platformToKotlinClassMap: PlatformToKotlinClassMap, - private val defaultImportProvider: DefaultImportProvider, private val targetPlatform: TargetPlatform, private val languageVersionSettings: LanguageVersionSettings, private val deprecationResolver: DeprecationResolver ) { /* avoid constructing psi for default imports prematurely (time consuming in some scenarios) */ private val defaultImports by storageManager.createLazyValue { - ktImportsFactory.createImportDirectivesNotCached(defaultImportProvider.defaultImports) + ktImportsFactory.createImportDirectivesNotCached( + targetPlatform.getDefaultImports(languageVersionSettings, includeLowPriorityImports = false) + ) } private val defaultLowPriorityImports by storageManager.createLazyValue { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/PsiBasedClassResolver.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/PsiBasedClassResolver.kt index dfd30955052..05c6edccfdb 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/PsiBasedClassResolver.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/PsiBasedClassResolver.kt @@ -27,7 +27,6 @@ import com.intellij.psi.util.PsiModificationTracker import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.asJava.ImpreciseResolveResult import org.jetbrains.kotlin.asJava.ImpreciseResolveResult.* -import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.idea.caches.project.getNullableModuleInfo import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider import org.jetbrains.kotlin.idea.project.TargetPlatformDetector @@ -259,8 +258,8 @@ class PsiBasedClassResolver @TestOnly constructor(private val targetClassFqName: private fun KtFile.getDefaultImports(): List { val moduleInfo = getNullableModuleInfo() ?: return emptyList() - val versionSettings = IDELanguageSettingsProvider.getLanguageVersionSettings(moduleInfo, project) - val platform = TargetPlatformDetector.getPlatform(this) - return platform.getDefaultImports(versionSettings.supportsFeature(LanguageFeature.DefaultImportOfPackageKotlinComparisons)) + - platform.defaultLowPriorityImports + return TargetPlatformDetector.getPlatform(this).getDefaultImports( + IDELanguageSettingsProvider.getLanguageVersionSettings(moduleInfo, project), + includeLowPriorityImports = true + ) } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt index ae20ac0966e..f58d660d6e8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt @@ -34,7 +34,6 @@ import org.jetbrains.kotlin.psi.KtUserType import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe -import org.jetbrains.kotlin.resolve.lazy.DefaultImportProvider import org.jetbrains.kotlin.resolve.lazy.descriptors.ClassResolutionScopesSupport import org.jetbrains.kotlin.resolve.scopes.* import org.jetbrains.kotlin.resolve.scopes.utils.chainImportingScopes @@ -74,9 +73,9 @@ object ReplaceWithAnnotationAnalyzer { val module = resolutionFacade.moduleDescriptor val explicitImportsScope = buildExplicitImportsScope(annotation, resolutionFacade, module) - val defaultImportsScopes = buildDefaultImportsScopes(resolutionFacade, module) + val languageVersionSettings = resolutionFacade.frontendService() + val defaultImportsScopes = buildDefaultImportsScopes(resolutionFacade, module, languageVersionSettings) - val languageVersionSettings = resolutionFacade.getFrontendService(LanguageVersionSettings::class.java) val scope = getResolutionScope( symbolDescriptor, symbolDescriptor, listOf(explicitImportsScope), defaultImportsScopes, languageVersionSettings @@ -106,12 +105,10 @@ object ReplaceWithAnnotationAnalyzer { val module = resolutionFacade.moduleDescriptor val explicitImportsScope = buildExplicitImportsScope(annotation, resolutionFacade, module) - val defaultImportScopes = buildDefaultImportsScopes(resolutionFacade, module) + val languageVersionSettings = resolutionFacade.frontendService() + val defaultImportScopes = buildDefaultImportsScopes(resolutionFacade, module, languageVersionSettings) val scope = getResolutionScope( - symbolDescriptor, - symbolDescriptor, - listOf(explicitImportsScope), defaultImportScopes, - resolutionFacade.getFrontendService(LanguageVersionSettings::class.java) + symbolDescriptor, symbolDescriptor, listOf(explicitImportsScope), defaultImportScopes, languageVersionSettings ) ?: return null val typeResolver = resolutionFacade.getFrontendService(TypeResolver::class.java) @@ -138,9 +135,14 @@ object ReplaceWithAnnotationAnalyzer { return typeReference.typeElement as KtUserType } - private fun buildDefaultImportsScopes(resolutionFacade: ResolutionFacade, module: ModuleDescriptor): List { - val (allUnderImports, aliasImports) = - resolutionFacade.frontendService().allDefaultImports.partition { it.isAllUnder } + private fun buildDefaultImportsScopes( + resolutionFacade: ResolutionFacade, + module: ModuleDescriptor, + languageVersionSettings: LanguageVersionSettings + ): List { + val allDefaultImports = + resolutionFacade.frontendService().getDefaultImports(languageVersionSettings, includeLowPriorityImports = true) + val (allUnderImports, aliasImports) = allDefaultImports.partition { it.isAllUnder } // this solution doesn't support aliased default imports with a different alias // TODO: Create import directives from ImportPath, create ImportResolver, create LazyResolverScope, see FileScopeProviderImpl diff --git a/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt b/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt index 4fc86021e92..d90afc97f20 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.util import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings @@ -38,7 +39,6 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.ImportPath import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -import org.jetbrains.kotlin.resolve.lazy.DefaultImportProvider import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.MemberScope @@ -59,9 +59,10 @@ class ImportInsertHelperImpl(private val project: Project) : ImportInsertHelper( get() = ImportPathComparator override fun isImportedWithDefault(importPath: ImportPath, contextFile: KtFile): Boolean { - val defaultImportProvider = contextFile.getResolutionFacade().frontendService() + val languageVersionSettings = contextFile.getResolutionFacade().frontendService() val platform = TargetPlatformDetector.getPlatform(contextFile) - return importPath.isImported(defaultImportProvider.allDefaultImports, platform.excludedImports) + val allDefaultImports = platform.getDefaultImports(languageVersionSettings, includeLowPriorityImports = true) + return importPath.isImported(allDefaultImports, platform.excludedImports) } override fun isImportedWithLowPriorityDefaultImport(importPath: ImportPath, contextFile: KtFile): Boolean { diff --git a/j2k/src/org/jetbrains/kotlin/j2k/importConversion.kt b/j2k/src/org/jetbrains/kotlin/j2k/importConversion.kt index 3df74d6f9fd..5525588c9ad 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/importConversion.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/importConversion.kt @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap -import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.j2k.ast.Import @@ -163,7 +162,8 @@ private fun renderImportName(fqName: FqName, isOnDemand: Boolean) private val DEFAULT_IMPORTS_SET: Set = JvmPlatform.getDefaultImports( // TODO: use the correct LanguageVersionSettings instance here - LanguageVersionSettingsImpl.DEFAULT.supportsFeature(LanguageFeature.DefaultImportOfPackageKotlinComparisons) -).plus(JvmPlatform.defaultLowPriorityImports).filter { it.isAllUnder }.map { it.fqName }.toSet() + LanguageVersionSettingsImpl.DEFAULT, + includeLowPriorityImports = true +).filter { it.isAllUnder }.map { it.fqName }.toSet() private fun isImportedByDefault(c: KtLightClass) = c.qualifiedName?.let { FqName(it).parent() } in DEFAULT_IMPORTS_SET diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt index ff53279a4a6..ff68f49fa4a 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt @@ -23,15 +23,13 @@ import org.jetbrains.kotlin.resolve.ImportPath import org.jetbrains.kotlin.resolve.MultiTargetPlatform import org.jetbrains.kotlin.resolve.PlatformConfigurator import org.jetbrains.kotlin.resolve.TargetPlatform -import org.jetbrains.kotlin.storage.LockBasedStorageManager +import org.jetbrains.kotlin.storage.StorageManager object JsPlatform : TargetPlatform("JS") { - private val defaultImports = LockBasedStorageManager().createMemoizedFunction> { includeKotlinComparisons -> - Common.getDefaultImports(includeKotlinComparisons) + ImportPath.fromString("kotlin.js.*") + override fun computePlatformSpecificDefaultImports(storageManager: StorageManager, result: MutableList) { + result.add(ImportPath.fromString("kotlin.js.*")) } - override fun getDefaultImports(includeKotlinComparisons: Boolean): List = defaultImports(includeKotlinComparisons) - override val platformConfigurator: PlatformConfigurator = JsPlatformConfigurator val builtIns: KotlinBuiltIns @@ -39,5 +37,6 @@ object JsPlatform : TargetPlatform("JS") { override val multiTargetPlatform = MultiTargetPlatform.Specific(platformName) - override val excludedImports: List = listOf("Promise", "Date", "Console", "Math", "RegExp", "RegExpMatch", "Json", "json").map { FqName("kotlin.js.$it") } + override val excludedImports: List = + listOf("Promise", "Date", "Console", "Math", "RegExp", "RegExpMatch", "Json", "json").map { FqName("kotlin.js.$it") } }