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
@@ -4,22 +4,26 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final class Foo : R|kotlin/Any|
Element 7
Element 9
Scope: FirLocalScope
Classifiers:
FirRegularClassSymbol public final class Foo : R|kotlin/Any|
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-insideClassBody.kts>
@@ -28,11 +32,11 @@ Tower Data Context:
public final class Foo : R|kotlin/Any|
Type: kotlin.script.templates.standard.ScriptTemplateWithArgs
Label: <script>
Element 9
Element 11
Implicit receiver:
FirRegularClassSymbol public final class Foo : R|kotlin/Any|
Type: Foo
Element 10
Element 12
Scope: FirLocalScope
FILE: [ResolvedTo(IMPORTS)] insideClassBody.kts
@@ -4,22 +4,26 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final class Foo : R|kotlin/Any|
Element 7
Element 9
Scope: FirLocalScope
Classifiers:
FirRegularClassSymbol public final class Foo : R|kotlin/Any|
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-insideClassBody.kts>
@@ -28,11 +32,11 @@ Tower Data Context:
public final class Foo : R|kotlin/Any|
Type: kotlin.script.templates.standard.ScriptTemplateWithArgs
Label: <script>
Element 9
Element 11
Implicit receiver:
FirRegularClassSymbol public final class Foo : R|kotlin/Any|
Type: Foo
Element 10
Element 12
Scope: FirLocalScope
FILE: [ResolvedTo(IMPORTS)] insideClassBody.kts
@@ -4,14 +4,18 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final? class After_OtherClass : R|kotlin/Any|
@@ -25,11 +29,11 @@ Tower Data Context:
public get(): R|kotlin/Int|
FirPropertySymbol public final val before_Val: R|kotlin/Int|
public get(): R|kotlin/Int|
Element 7
Element 9
Scope: FirLocalScope
Classifiers:
FirRegularClassSymbol public final class MyClass : R|kotlin/Any|
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-insideClassMember.kts>
@@ -48,13 +52,13 @@ Tower Data Context:
public final? class After_OtherClass : R|kotlin/Any|
Type: kotlin.script.templates.standard.ScriptTemplateWithArgs
Label: <script>
Element 9
Element 11
Implicit receiver:
FirRegularClassSymbol public final class MyClass : R|kotlin/Any|
Type: MyClass
Element 10
Element 12
Scope: FirLocalScope
Element 11
Element 13
Scope: FirLocalScope
FILE: [ResolvedTo(IMPORTS)] insideClassMember.kts
@@ -4,14 +4,18 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final? class After_OtherClass : R|kotlin/Any|
@@ -25,11 +29,11 @@ Tower Data Context:
public? get(): <implicit>
FirPropertySymbol public? final? val before_Val: <implicit>
public? get(): <implicit>
Element 7
Element 9
Scope: FirLocalScope
Classifiers:
FirRegularClassSymbol public final class MyClass : R|kotlin/Any|
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-insideClassMember.kts>
@@ -48,13 +52,13 @@ Tower Data Context:
public final? class After_OtherClass : R|kotlin/Any|
Type: kotlin.script.templates.standard.ScriptTemplateWithArgs
Label: <script>
Element 9
Element 11
Implicit receiver:
FirRegularClassSymbol public final class MyClass : R|kotlin/Any|
Type: MyClass
Element 10
Element 12
Scope: FirLocalScope
Element 11
Element 13
Scope: FirLocalScope
FILE: [ResolvedTo(IMPORTS)] insideClassMember.kts
@@ -4,14 +4,18 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final? class After_OtherClass : R|kotlin/Any|
@@ -25,11 +29,11 @@ Tower Data Context:
public get(): R|kotlin/Int|
FirPropertySymbol public final val before_Val: R|kotlin/Int|
public get(): R|kotlin/Int|
Element 7
Element 9
Scope: FirLocalScope
Functions
FirNamedFunctionSymbol public final fun usage(foo: R|kotlin/Int|): R|kotlin/Unit|
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-insideTopLevelFunction.kts>
@@ -48,11 +52,11 @@ Tower Data Context:
public final? class After_OtherClass : R|kotlin/Any|
Type: kotlin.script.templates.standard.ScriptTemplateWithArgs
Label: <script>
Element 9
Element 11
Scope: FirLocalScope
Properties:
FirValueParameterSymbol foo: R|kotlin/Int|
Element 10
Element 12
Scope: FirLocalScope
FILE: [ResolvedTo(IMPORTS)] insideTopLevelFunction.kts
@@ -4,14 +4,18 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final? class After_OtherClass : R|kotlin/Any|
@@ -25,11 +29,11 @@ Tower Data Context:
public? get(): <implicit>
FirPropertySymbol public? final? val before_Val: <implicit>
public? get(): <implicit>
Element 7
Element 9
Scope: FirLocalScope
Functions
FirNamedFunctionSymbol public final fun usage(foo: R|kotlin/Int|): R|kotlin/Unit|
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-insideTopLevelFunction.kts>
@@ -48,11 +52,11 @@ Tower Data Context:
public final? class After_OtherClass : R|kotlin/Any|
Type: kotlin.script.templates.standard.ScriptTemplateWithArgs
Label: <script>
Element 9
Element 11
Scope: FirLocalScope
Properties:
FirValueParameterSymbol foo: R|kotlin/Int|
Element 10
Element 12
Scope: FirLocalScope
FILE: [ResolvedTo(IMPORTS)] insideTopLevelFunction.kts
@@ -4,14 +4,18 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final? class ScriptClass : R|kotlin/Any|
@@ -22,9 +26,9 @@ Tower Data Context:
Properties:
FirPropertySymbol public final val $$result: R|kotlin/Unit|
public get(): R|kotlin/Unit|
Element 7
Element 9
Scope: FirLocalScope
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-lastStatement.kts>
@@ -4,14 +4,18 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final? class ScriptClass : R|kotlin/Any|
@@ -22,9 +26,9 @@ Tower Data Context:
Properties:
FirPropertySymbol public final val $$result: R|kotlin/Unit|
public get(): R|kotlin/Unit|
Element 7
Element 9
Scope: FirLocalScope
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-lastStatement.kts>
@@ -4,14 +4,18 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final? class ScriptClass : R|kotlin/Any|
@@ -22,9 +26,9 @@ Tower Data Context:
Properties:
FirPropertySymbol public final val $$result: R|kotlin/Unit|
public get(): R|kotlin/Unit|
Element 7
Element 9
Scope: FirLocalScope
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-scriptInsideLastStatement.kts>
@@ -39,11 +43,11 @@ Tower Data Context:
public get(): R|kotlin/Unit|
Type: kotlin.script.templates.standard.ScriptTemplateWithArgs
Label: <script>
Element 9
Element 11
Scope: FirLocalScope
Properties:
FirValueParameterSymbol it: R|kotlin/Int|
Element 10
Element 12
Scope: FirLocalScope
FILE: [ResolvedTo(IMPORTS)] scriptInsideLastStatement.kts
@@ -4,14 +4,18 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final? class ScriptClass : R|kotlin/Any|
@@ -22,9 +26,9 @@ Tower Data Context:
Properties:
FirPropertySymbol public final val $$result: R|kotlin/Unit|
public get(): R|kotlin/Unit|
Element 7
Element 9
Scope: FirLocalScope
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-scriptInsideLastStatement.kts>
@@ -39,11 +43,11 @@ Tower Data Context:
public get(): R|kotlin/Unit|
Type: kotlin.script.templates.standard.ScriptTemplateWithArgs
Label: <script>
Element 9
Element 11
Scope: FirLocalScope
Properties:
FirValueParameterSymbol it: R|kotlin/Int|
Element 10
Element 12
Scope: FirLocalScope
FILE: [ResolvedTo(IMPORTS)] scriptInsideLastStatement.kts
@@ -4,14 +4,18 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final? class ScriptClass : R|kotlin/Any|
@@ -22,9 +26,9 @@ Tower Data Context:
Properties:
FirPropertySymbol public final val $$result: R|kotlin/Unit|
public get(): R|kotlin/Unit|
Element 7
Element 9
Scope: FirLocalScope
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-statement.kts>
@@ -39,9 +43,9 @@ Tower Data Context:
public get(): R|kotlin/Unit|
Type: kotlin.script.templates.standard.ScriptTemplateWithArgs
Label: <script>
Element 9
Element 11
Scope: FirLocalScope
Element 10
Element 12
Scope: FirLocalScope
FILE: [ResolvedTo(IMPORTS)] statement.kts
@@ -4,14 +4,18 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final? class ScriptClass : R|kotlin/Any|
@@ -22,9 +26,9 @@ Tower Data Context:
Properties:
FirPropertySymbol public final val $$result: <implicit>
public get(): <implicit>
Element 7
Element 9
Scope: FirLocalScope
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-statement.kts>
@@ -39,9 +43,9 @@ Tower Data Context:
public get(): <implicit>
Type: kotlin.script.templates.standard.ScriptTemplateWithArgs
Label: <script>
Element 9
Element 11
Scope: FirLocalScope
Element 10
Element 12
Scope: FirLocalScope
FILE: [ResolvedTo(IMPORTS)] statement.kts
@@ -4,14 +4,18 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final? class After_OtherClass : R|kotlin/Any|
@@ -24,9 +28,9 @@ Tower Data Context:
public get(): R|kotlin/Int|
FirPropertySymbol public final val before_Val: R|kotlin/Int|
public get(): R|kotlin/Int|
Element 7
Element 9
Scope: FirLocalScope
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-topLevel.kts>
@@ -45,9 +49,9 @@ Tower Data Context:
public final? class After_OtherClass : R|kotlin/Any|
Type: kotlin.script.templates.standard.ScriptTemplateWithArgs
Label: <script>
Element 9
Element 11
Scope: FirLocalScope
Element 10
Element 12
Scope: FirLocalScope
FILE: [ResolvedTo(IMPORTS)] topLevel.kts
@@ -4,14 +4,18 @@ Tower Data Context:
Element 1
Scope: FirExplicitStarImportingScope
Element 2
Scope: FirDefaultSimpleImportingScope
Scope: FirExplicitStarImportingScope
Element 3
Scope: FirDefaultSimpleImportingScope
Element 4
Scope: FirPackageMemberScope
Scope: FirDefaultSimpleImportingScope
Element 5
Scope: FirExplicitSimpleImportingScope
Element 6
Scope: FirPackageMemberScope
Element 7
Scope: FirExplicitSimpleImportingScope
Element 8
Scope: FirScriptDeclarationsScope
Classifiers:
FirRegularClassSymbol public final? class After_OtherClass : R|kotlin/Any|
@@ -24,9 +28,9 @@ Tower Data Context:
public? get(): <implicit>
FirPropertySymbol public? final? val before_Val: <implicit>
public? get(): <implicit>
Element 7
Element 9
Scope: FirLocalScope
Element 8
Element 10
Context receivers:
FirScriptSymbol context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: <script-topLevel.kts>
@@ -45,9 +49,9 @@ Tower Data Context:
public final? class After_OtherClass : R|kotlin/Any|
Type: kotlin.script.templates.standard.ScriptTemplateWithArgs
Label: <script>
Element 9
Element 11
Scope: FirLocalScope
Element 10
Element 12
Scope: FirLocalScope
FILE: [ResolvedTo(IMPORTS)] topLevel.kts
@@ -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) {
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.scripting.compiler.plugin.services.Fir2IrScriptConfiguratorExtensionImpl
import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptConfiguratorExtensionImpl
import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptDefinitionProviderService
import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptResolutionConfigurationExtensionImpl
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
import kotlin.script.experimental.host.ScriptingHostConfiguration
@@ -28,6 +29,7 @@ class FirScriptingCompilerExtensionRegistrar(
}
+FirScriptConfiguratorExtensionImpl.getFactory(hostConfiguration)
+FirScriptResolutionConfigurationExtensionImpl.getFactory(hostConfiguration)
+Fir2IrScriptConfiguratorExtensionImpl.getFactory(hostConfiguration)
}
}
@@ -50,25 +50,7 @@ class FirScriptConfiguratorExtensionImpl(
@Suppress("UNUSED_PARAMETER") hostConfiguration: ScriptingHostConfiguration,
) : FirScriptConfiguratorExtension(session) {
@OptIn(SymbolInternals::class)
override fun FirScriptBuilder.configureContainingFile(fileBuilder: FirFileBuilder) {
val sourceFile = fileBuilder.sourceFile ?: return
val configuration = getOrLoadConfiguration(sourceFile) ?: run {
log.warn("Configuration for ${sourceFile.asString()} wasn't found. FirScriptBuilder wasn't configured.")
return
}
configuration[ScriptCompilationConfiguration.defaultImports]?.forEach { defaultImport ->
val trimmed = defaultImport.trim()
val endsWithStar = trimmed.endsWith("*")
val stripped = if (endsWithStar) trimmed.substring(0, trimmed.length - 2) else trimmed
val fqName = FqName.fromSegments(stripped.split("."))
fileBuilder.imports += buildImport {
source = fileBuilder.source?.fakeElement(KtFakeSourceElementKind.ImplicitImport)
importedFqName = fqName
isAllUnder = endsWithStar
}
}
}
@OptIn(SymbolInternals::class)
@@ -0,0 +1,52 @@
/*
* 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.scripting.compiler.plugin.services
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.fir.declarations.FirScript
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
import org.jetbrains.kotlin.fir.extensions.FirScriptResolutionConfigurationExtension
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
import org.jetbrains.kotlin.name.FqName
import kotlin.script.experimental.api.ScriptCompilationConfiguration
import kotlin.script.experimental.api.defaultImports
import kotlin.script.experimental.host.ScriptingHostConfiguration
class FirScriptResolutionConfigurationExtensionImpl(
session: FirSession,
@Suppress("UNUSED_PARAMETER") hostConfiguration: ScriptingHostConfiguration
) : FirScriptResolutionConfigurationExtension(session) {
override fun getScriptDefaultImports(script: FirScript): List<FirImport> {
val scriptFile = session.firProvider.getFirScriptContainerFile(script.symbol) ?: return emptyList()
val scriptSourceFile = scriptFile.sourceFile?.toSourceCode() ?: return emptyList()
val compilationConfiguration = session.getScriptCompilationConfiguration(scriptSourceFile, getDefault = { null }) ?: return emptyList()
return compilationConfiguration.firImportsFromDefaultImports(script.source?.fakeElement(KtFakeSourceElementKind.ImplicitImport))
}
companion object {
fun getFactory(hostConfiguration: ScriptingHostConfiguration): Factory {
return Factory { session -> FirScriptResolutionConfigurationExtensionImpl(session, hostConfiguration) }
}
}
}
private fun ScriptCompilationConfiguration.firImportsFromDefaultImports(sourceElement: KtSourceElement?): List<FirImport> =
this[ScriptCompilationConfiguration.defaultImports]?.map { defaultImport ->
val trimmed = defaultImport.trim()
val endsWithStar = trimmed.endsWith("*")
val stripped = if (endsWithStar) trimmed.substring(0, trimmed.length - 2) else trimmed
val fqName = FqName.fromSegments(stripped.split("."))
buildImport {
source = sourceElement
importedFqName = fqName
isAllUnder = endsWithStar
}
}.orEmpty()
@@ -0,0 +1,15 @@
// SCRIPT_DEFAULT_IMPORTS: b.A
// MODULE: a
// FILE: a.java
package a;
public class A {
public static void s() { return; }
}
// FILE: aa.java
package b;
public interface A {}
//MODULE: b(a)
// FILE: b.test.kts
import a.A
val b = A.s()
@@ -24,6 +24,12 @@ public class ScriptWithCustomDefDiagnosticsTestBaseGenerated extends AbstractScr
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/scripting/scripting-tests/testData/diagnostics/testScripts"), Pattern.compile("^(.+)\\.kts$"), null, true);
}
@Test
@TestMetadata("conflictingImportsWithJava.test.kts")
public void testConflictingImportsWithJava_test() {
runTest("plugins/scripting/scripting-tests/testData/diagnostics/testScripts/conflictingImportsWithJava.test.kts");
}
@Test
@TestMetadata("providedPropertiesShadowing.test.kts")
public void testProvidedPropertiesShadowing_test() {