K2 Scripting: add support for result field

This commit is contained in:
Ilya Chernikov
2023-04-28 17:11:56 +02:00
committed by Space Team
parent 6c7751b0af
commit d24fc3b581
20 changed files with 87 additions and 25 deletions
@@ -12,6 +12,7 @@ dependencies {
compileOnly(project(":compiler:plugin-api"))
compileOnly(project(":compiler:fir:entrypoint"))
compileOnly(project(":compiler:fir:raw-fir:raw-fir.common"))
compileOnly(project(":compiler:fir:tree"))
compileOnly(project(":compiler:cli"))
compileOnly(project(":core:descriptors.runtime"))
compileOnly(project(":compiler:ir.tree"))
@@ -16,8 +16,10 @@ import org.jetbrains.kotlin.fir.builder.FirScriptConfiguratorExtension.Factory
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.builder.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny
import org.jetbrains.kotlin.fir.declarations.utils.SCRIPT_SPECIAL_NAME_STRING
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.resolve.providers.dependenciesSymbolProvider
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
@@ -67,7 +69,7 @@ class FirScriptConfiguratorExtensionImpl(
parameters.add(
buildProperty {
moduleData = session.moduleData
origin = FirDeclarationOrigin.ScriptCustomization
origin = FirDeclarationOrigin.ScriptCustomization.Default
// TODO: copy type parameters?
returnTypeRef = baseCtorParameter.returnTypeRef
name = baseCtorParameter.name
@@ -83,7 +85,7 @@ class FirScriptConfiguratorExtensionImpl(
configuration[ScriptCompilationConfiguration.implicitReceivers]?.forEach { implicitReceiver ->
contextReceivers.add(buildContextReceiverWithFqName(FqName.fromSegments(implicitReceiver.typeName.split("."))))
}
configuration[ScriptCompilationConfiguration.providedProperties]?.forEach { propertyName, propertyType ->
configuration[ScriptCompilationConfiguration.providedProperties]?.forEach { (propertyName, propertyType) ->
val typeRef = buildUserTypeRef {
isMarkedNullable = propertyType.isNullable
propertyType.typeName.split(".").forEach {
@@ -93,7 +95,7 @@ class FirScriptConfiguratorExtensionImpl(
parameters.add(
buildProperty {
moduleData = session.moduleData
origin = FirDeclarationOrigin.ScriptCustomization
origin = FirDeclarationOrigin.ScriptCustomization.Default
returnTypeRef = typeRef
name = Name.identifier(propertyName)
symbol = FirPropertySymbol(name)
@@ -125,6 +127,37 @@ class FirScriptConfiguratorExtensionImpl(
configuration[ScriptCompilationConfiguration.annotationsForSamWithReceivers]?.forEach {
_knownAnnotationsForSamWithReceiver.add(it.typeName)
}
configuration[ScriptCompilationConfiguration.resultField]?.takeIf { it.isNotBlank() }?.let { resultFieldName ->
val lastExpression = statements.lastOrNull()
if (lastExpression != null && lastExpression is FirExpression) {
statements.removeAt(statements.size - 1)
statements.add(
buildProperty {
this.name = Name.identifier(resultFieldName)
this.symbol = FirPropertySymbol(this.name)
source = lastExpression.source
moduleData = session.moduleData
origin = FirDeclarationOrigin.ScriptCustomization.ResultProperty
initializer = lastExpression
returnTypeRef = lastExpression.typeRef
getter = FirDefaultPropertyGetter(
lastExpression.source,
session.moduleData,
FirDeclarationOrigin.ScriptCustomization.ResultProperty,
lastExpression.typeRef,
Visibilities.Public,
this.symbol,
)
status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL)
isLocal = false
isVar = false
}.also {
resultPropertyName = it.name
}
)
}
}
}
private fun KtSourceFile.asString() = path ?: name
@@ -26,12 +26,12 @@ class ScriptingWithCliCompilerTest {
}
@Test
fun testResultValue() = expectTestToFailOnK2 {
fun testResultValue() {
runWithK2JVMCompiler("$TEST_DATA_DIR/integration/intResult.kts", listOf("10"))
}
@Test
fun testResultValueViaKotlinc() = expectTestToFailOnK2 {
fun testResultValueViaKotlinc() {
runWithKotlinc("$TEST_DATA_DIR/integration/intResult.kts", listOf("10"))
}
@@ -132,14 +132,13 @@ class ScriptingWithCliCompilerTest {
}
@Test
fun testExpressionWithComma() = expectTestToFailOnK2 {
fun testExpressionWithComma() {
runWithK2JVMCompiler(
arrayOf(
"-expression",
"listOf(1,2)"
),
listOf("\\[1, 2\\]"),
expectErrorOnK2 = true
)
}
@@ -1,6 +1,5 @@
import junit.framework.TestCase
import kotlinx.coroutines.runBlocking
import org.jetbrains.kotlin.scripting.compiler.plugin.expectTestToFailOnK2
import org.jetbrains.kotlin.scripting.compiler.plugin.impl.ScriptJvmCompilerIsolated
import org.jetbrains.kotlin.scripting.compiler.test.assertEqualsTrimmed
import java.io.ByteArrayOutputStream
@@ -19,7 +18,7 @@ import kotlin.script.experimental.jvm.util.renderError
class ScriptEvaluationTest : TestCase() {
fun testExceptionWithCause() = expectTestToFailOnK2 {
fun testExceptionWithCause() {
checkEvaluateAsError(
"""
try {
@@ -38,7 +37,7 @@ class ScriptEvaluationTest : TestCase() {
}
// KT-19423
fun testClassCapturingScriptInstance() = expectTestToFailOnK2 {
fun testClassCapturingScriptInstance() {
val res = checkEvaluate(
"""
val used = "abc"