K2 Scripting: add support for result field
This commit is contained in:
committed by
Space Team
parent
6c7751b0af
commit
d24fc3b581
@@ -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"))
|
||||
|
||||
+36
-3
@@ -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
|
||||
|
||||
+3
-4
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+2
-3
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user