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:
committed by
Space Team
parent
9037975758
commit
266447120d
+11
@@ -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()
|
||||
|
||||
+30
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user