K2 scripting: treat default import similarly to K1

namely, add them to importing scopes directly and according to the
schema used for other implicit imports, rather than adding them
to the regular script file imports. See KT-65982 for explanation.
#KT-65982 fixed
This commit is contained in:
Ilya Chernikov
2024-02-14 17:52:02 +01:00
committed by Space Team
parent 9037975758
commit 266447120d
22 changed files with 282 additions and 102 deletions
@@ -33,6 +33,7 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() {
FirSamConversionTransformerExtension::class,
FirAssignExpressionAltererExtension::class,
FirScriptConfiguratorExtension::class,
FirScriptResolutionConfigurationExtension::class,
Fir2IrScriptConfiguratorExtension::class,
FirFunctionTypeKindExtension::class,
@OptIn(FirExtensionApiInternals::class)
@@ -100,6 +101,11 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() {
registerExtension(FirScriptConfiguratorExtension::class, this)
}
@JvmName("plusFirScriptResolutionConfigurationExtension")
operator fun (FirScriptResolutionConfigurationExtension.Factory).unaryPlus() {
registerExtension(FirScriptResolutionConfigurationExtension::class, this)
}
@JvmName("plusFir2IrScriptConfiguratorExtension")
operator fun (Fir2IrScriptConfiguratorExtension.Factory).unaryPlus() {
registerExtension(Fir2IrScriptConfiguratorExtension::class, this)
@@ -168,6 +174,11 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() {
FirScriptConfiguratorExtension.Factory { this.invoke(it) }.unaryPlus()
}
@JvmName("plusFirScriptResolutionConfigurationExtension")
operator fun ((FirSession) -> FirScriptResolutionConfigurationExtension).unaryPlus() {
FirScriptResolutionConfigurationExtension.Factory { this.invoke(it) }.unaryPlus()
}
@JvmName("plusFir2IrScriptConfiguratorExtension")
operator fun ((FirSession) -> Fir2IrScriptConfiguratorExtension).unaryPlus() {
Fir2IrScriptConfiguratorExtension.Factory { this.invoke(it) }.unaryPlus()
@@ -0,0 +1,30 @@
/*
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.extensions
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.fir.declarations.FirScript
import kotlin.reflect.KClass
abstract class FirScriptResolutionConfigurationExtension(
session: FirSession,
) : FirExtension(session) {
companion object {
val NAME = FirExtensionPointName("FirScriptResolutionConfiguration")
}
final override val name: FirExtensionPointName
get() = NAME
final override val extensionType: KClass<out FirExtension> = FirScriptResolutionConfigurationExtension::class
fun interface Factory : FirExtension.Factory<FirScriptResolutionConfigurationExtension>
abstract fun getScriptDefaultImports(script: FirScript): List<FirImport>
}
val FirExtensionService.firScriptResolutionConfigurators: List<FirScriptResolutionConfigurationExtension> by FirExtensionService.registeredExtensions()
@@ -6,13 +6,15 @@
package org.jetbrains.kotlin.fir.scopes
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.extensions.extensionService
import org.jetbrains.kotlin.fir.extensions.firScriptResolutionConfigurators
import org.jetbrains.kotlin.fir.importTracker
import org.jetbrains.kotlin.fir.packageFqName
import org.jetbrains.kotlin.fir.reportImportDirectives
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.scopeSessionKey
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
import org.jetbrains.kotlin.fir.scopes.impl.*
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.name.FqName
@@ -20,6 +22,8 @@ import org.jetbrains.kotlin.name.FqName
private val ALL_IMPORTS = scopeSessionKey<FirFile, ListStorageFirScope>()
private val DEFAULT_STAR_IMPORT = scopeSessionKey<DefaultStarImportKey, FirSingleLevelDefaultStarImportingScope>()
private val DEFAULT_SIMPLE_IMPORT = scopeSessionKey<DefaultSimpleImportKey, FirDefaultSimpleImportingScope>()
private val DEFAULT_SCRIPT_STAR_IMPORT = scopeSessionKey<FirFile, FirExplicitStarImportingScope>()
private val DEFAULT_SCRIPT_SIMPLE_IMPORT = scopeSessionKey<FirFile, FirExplicitSimpleImportingScope>()
private data class DefaultStarImportKey(val priority: DefaultImportPriority, val excludedImportNames: Set<FqName>)
@@ -60,6 +64,18 @@ internal fun computeImportingScopes(
}
}
val script = file.declarations.firstOrNull() as? FirScript
val scriptDefaultImports by lazy(LazyThreadSafetyMode.NONE) {
script?.let {
val importResolveTransformer = FirImportResolveTransformer(session)
session.extensionService.firScriptResolutionConfigurators.flatMap {
it.getScriptDefaultImports(script).map { firImport ->
(importResolveTransformer.transformImport(firImport, null) as? FirResolvedImport) ?: firImport
}
}
}?.partition { it.isAllUnder }
}
return buildList {
if (includeDefaultImports) {
this += FirDefaultStarImportingScope(
@@ -70,6 +86,11 @@ internal fun computeImportingScopes(
FirSingleLevelDefaultStarImportingScope(session, scopeSession, DefaultImportPriority.LOW, excludedImportNames)
},
)
if (script != null) {
this += scopeSession.getOrBuild(file, DEFAULT_SCRIPT_STAR_IMPORT) {
FirExplicitStarImportingScope(scriptDefaultImports?.first.orEmpty(), session, scopeSession, excludedImportNames)
}
}
}
this += FirExplicitStarImportingScope(file.imports, session, scopeSession, excludedImportNames)
@@ -81,6 +102,11 @@ internal fun computeImportingScopes(
this += scopeSession.getOrBuild(DefaultSimpleImportKey(DefaultImportPriority.HIGH, excludedImportNames), DEFAULT_SIMPLE_IMPORT) {
FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.HIGH, excludedImportNames)
}
if (script != null) {
this += scopeSession.getOrBuild(file, DEFAULT_SCRIPT_SIMPLE_IMPORT) {
FirExplicitSimpleImportingScope(scriptDefaultImports?.second.orEmpty(), session, scopeSession)
}
}
}
if (includePackageImport) {