TargetPlatform#getDefaultImports(): cache result in all implementations

This commit is contained in:
Pavel V. Talanov
2017-04-13 16:10:34 +03:00
parent 421b785697
commit c436a9af07
5 changed files with 48 additions and 37 deletions
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.resolve.jvm.platform package org.jetbrains.kotlin.resolve.jvm.platform
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.platform.JvmBuiltIns import org.jetbrains.kotlin.platform.JvmBuiltIns
import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.*
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
@@ -25,25 +24,28 @@ import org.jetbrains.kotlin.storage.LockBasedStorageManager
import java.util.* import java.util.*
object JvmPlatform : TargetPlatform("JVM") { object JvmPlatform : TargetPlatform("JVM") {
private val builtIns by lazy(LazyThreadSafetyMode.PUBLICATION) { JvmBuiltIns(LockBasedStorageManager()) } private val defaultImports = LockBasedStorageManager().createMemoizedFunction<Boolean, List<ImportPath>> { includeKotlinComparisons ->
ArrayList<ImportPath>().apply {
addAll(Default.getDefaultImports(includeKotlinComparisons))
override fun getDefaultImports(languageVersionSettings: LanguageVersionSettings): List<ImportPath> = ArrayList<ImportPath>().apply { add(ImportPath.fromString("java.lang.*"))
addAll(Default.getDefaultImports(languageVersionSettings)) add(ImportPath.fromString("kotlin.jvm.*"))
add(ImportPath.fromString("java.lang.*")) fun addAllClassifiersFromScope(scope: MemberScope) {
add(ImportPath.fromString("kotlin.jvm.*")) for (descriptor in scope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS, MemberScope.ALL_NAME_FILTER)) {
add(ImportPath(DescriptorUtils.getFqNameSafe(descriptor), false))
}
}
fun addAllClassifiersFromScope(scope: MemberScope) { for (builtinPackageFragment in JvmBuiltIns(LockBasedStorageManager.NO_LOCKS).builtInsPackageFragmentsImportedByDefault) {
for (descriptor in scope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS, MemberScope.ALL_NAME_FILTER)) { addAllClassifiersFromScope(builtinPackageFragment.getMemberScope())
add(ImportPath(DescriptorUtils.getFqNameSafe(descriptor), false))
} }
} }
for (builtinPackageFragment in builtIns.builtInsPackageFragmentsImportedByDefault) {
addAllClassifiersFromScope(builtinPackageFragment.getMemberScope())
}
} }
override fun getDefaultImports(includeKotlinComparisons: Boolean): List<ImportPath> = defaultImports(includeKotlinComparisons)
override val platformConfigurator: PlatformConfigurator = JvmPlatformConfigurator override val platformConfigurator: PlatformConfigurator = JvmPlatformConfigurator
override val multiTargetPlatform = MultiTargetPlatform.Specific(platformName) override val multiTargetPlatform = MultiTargetPlatform.Specific(platformName)
@@ -16,8 +16,6 @@
package org.jetbrains.kotlin.resolve package org.jetbrains.kotlin.resolve
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.StorageComponentContainer
import org.jetbrains.kotlin.container.composeContainer import org.jetbrains.kotlin.container.composeContainer
import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.container.useInstance
@@ -29,6 +27,7 @@ import org.jetbrains.kotlin.resolve.checkers.*
import org.jetbrains.kotlin.resolve.lazy.DelegationFilter import org.jetbrains.kotlin.resolve.lazy.DelegationFilter
import org.jetbrains.kotlin.resolve.scopes.SyntheticConstructorsProvider import org.jetbrains.kotlin.resolve.scopes.SyntheticConstructorsProvider
import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes
import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.types.DynamicTypesSettings import org.jetbrains.kotlin.types.DynamicTypesSettings
import java.util.* import java.util.*
@@ -36,28 +35,33 @@ abstract class TargetPlatform(val platformName: String) {
override fun toString() = platformName override fun toString() = platformName
abstract val platformConfigurator: PlatformConfigurator abstract val platformConfigurator: PlatformConfigurator
abstract fun getDefaultImports(languageVersionSettings: LanguageVersionSettings): List<ImportPath> abstract fun getDefaultImports(includeKotlinComparisons: Boolean): List<ImportPath>
open val excludedImports: List<FqName> get() = emptyList() open val excludedImports: List<FqName> get() = emptyList()
abstract val multiTargetPlatform: MultiTargetPlatform abstract val multiTargetPlatform: MultiTargetPlatform
object Default : TargetPlatform("Default") { object Default : TargetPlatform("Default") {
override fun getDefaultImports(languageVersionSettings: LanguageVersionSettings): List<ImportPath> = ArrayList<ImportPath>().apply { private val defaultImports = LockBasedStorageManager().createMemoizedFunction<Boolean, List<ImportPath>> {
listOf( includeKotlinComparisons ->
"kotlin.*", ArrayList<ImportPath>().apply {
"kotlin.annotation.*", listOf(
"kotlin.collections.*", "kotlin.*",
"kotlin.ranges.*", "kotlin.annotation.*",
"kotlin.sequences.*", "kotlin.collections.*",
"kotlin.text.*", "kotlin.ranges.*",
"kotlin.io.*" "kotlin.sequences.*",
).forEach { add(ImportPath.fromString(it)) } "kotlin.text.*",
"kotlin.io.*"
).forEach { add(ImportPath.fromString(it)) }
if (languageVersionSettings.supportsFeature(LanguageFeature.DefaultImportOfPackageKotlinComparisons)) { if (includeKotlinComparisons) {
add(ImportPath.fromString("kotlin.comparisons.*")) add(ImportPath.fromString("kotlin.comparisons.*"))
}
} }
} }
override fun getDefaultImports(includeKotlinComparisons: Boolean): List<ImportPath> = defaultImports(includeKotlinComparisons)
override val platformConfigurator = override val platformConfigurator =
object : PlatformConfigurator( object : PlatformConfigurator(
DynamicTypesSettings(), listOf(), listOf(), listOf(), listOf(), listOf(), DynamicTypesSettings(), listOf(), listOf(), listOf(), listOf(), listOf(),
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.resolve.lazy package org.jetbrains.kotlin.resolve.lazy
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageFeature.DefaultImportOfPackageKotlinComparisons
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
@@ -37,8 +38,9 @@ class DefaultImportProvider(
private val targetPlatform: TargetPlatform, private val targetPlatform: TargetPlatform,
private val languageVersionSettings: LanguageVersionSettings private val languageVersionSettings: LanguageVersionSettings
) { ) {
val defaultImports: List<ImportPath> val defaultImports: List<ImportPath> by storageManager.createLazyValue {
by storageManager.createLazyValue { targetPlatform.getDefaultImports(languageVersionSettings) } targetPlatform.getDefaultImports(languageVersionSettings.supportsFeature(DefaultImportOfPackageKotlinComparisons))
}
val excludedImports: List<FqName> by storageManager.createLazyValue { val excludedImports: List<FqName> by storageManager.createLazyValue {
val packagesWithAliases = listOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME, KotlinBuiltIns.TEXT_PACKAGE_FQ_NAME) val packagesWithAliases = listOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME, KotlinBuiltIns.TEXT_PACKAGE_FQ_NAME)
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration
import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.j2k.ast.Import import org.jetbrains.kotlin.j2k.ast.Import
@@ -160,10 +161,9 @@ private fun convertNonStaticImport(fqName: FqName, isOnDemand: Boolean, target:
private fun renderImportName(fqName: FqName, isOnDemand: Boolean) private fun renderImportName(fqName: FqName, isOnDemand: Boolean)
= if (isOnDemand) fqName.render() + ".*" else fqName.render() = if (isOnDemand) fqName.render() + ".*" else fqName.render()
// TODO: use the correct LanguageVersionSettings instance here private val DEFAULT_IMPORTS_SET: Set<FqName> = JvmPlatform.getDefaultImports(
private val DEFAULT_IMPORTS_SET: Set<FqName> = JvmPlatform.getDefaultImports(LanguageVersionSettingsImpl.DEFAULT) // TODO: use the correct LanguageVersionSettings instance here
.filter { it.isAllUnder } LanguageVersionSettingsImpl.DEFAULT.supportsFeature(LanguageFeature.DefaultImportOfPackageKotlinComparisons)
.map { it.fqName } ).filter { it.isAllUnder }.map { it.fqName }.toSet()
.toSet()
private fun isImportedByDefault(c: KtLightClass) = c.qualifiedName?.let { FqName(it).parent() } in DEFAULT_IMPORTS_SET private fun isImportedByDefault(c: KtLightClass) = c.qualifiedName?.let { FqName(it).parent() } in DEFAULT_IMPORTS_SET
@@ -18,16 +18,19 @@ package org.jetbrains.kotlin.js.resolve
import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.ImportPath import org.jetbrains.kotlin.resolve.ImportPath
import org.jetbrains.kotlin.resolve.MultiTargetPlatform import org.jetbrains.kotlin.resolve.MultiTargetPlatform
import org.jetbrains.kotlin.resolve.PlatformConfigurator import org.jetbrains.kotlin.resolve.PlatformConfigurator
import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.resolve.TargetPlatform
import org.jetbrains.kotlin.storage.LockBasedStorageManager
object JsPlatform : TargetPlatform("JS") { object JsPlatform : TargetPlatform("JS") {
override fun getDefaultImports(languageVersionSettings: LanguageVersionSettings): List<ImportPath> = private val defaultImports = LockBasedStorageManager().createMemoizedFunction<Boolean, List<ImportPath>> { includeKotlinComparisons ->
Default.getDefaultImports(languageVersionSettings) + ImportPath.fromString("kotlin.js.*") Default.getDefaultImports(includeKotlinComparisons) + ImportPath.fromString("kotlin.js.*")
}
override fun getDefaultImports(includeKotlinComparisons: Boolean): List<ImportPath> = defaultImports(includeKotlinComparisons)
override val platformConfigurator: PlatformConfigurator = JsPlatformConfigurator override val platformConfigurator: PlatformConfigurator = JsPlatformConfigurator