diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 7bd939685e5..416c9513fe4 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -35521,6 +35521,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/reflection/classes/nestedClasses.kt"); } + @Test + @TestMetadata("nestedClassesInScript.kt") + public void testNestedClassesInScript() throws Exception { + runTest("compiler/testData/codegen/box/reflection/classes/nestedClassesInScript.kt"); + } + @Test @TestMetadata("nestedClassesJava.kt") public void testNestedClassesJava() throws Exception { diff --git a/compiler/testData/codegen/box/reflection/classes/nestedClassesInScript.kt b/compiler/testData/codegen/box/reflection/classes/nestedClassesInScript.kt new file mode 100644 index 00000000000..234de1f9c5c --- /dev/null +++ b/compiler/testData/codegen/box/reflection/classes/nestedClassesInScript.kt @@ -0,0 +1,22 @@ +// TARGET_BACKEND: JVM +// IGNORE_BACKEND_FIR: JVM_IR +// IGNORE_LIGHT_ANALYSIS +// WITH_RUNTIME +// WITH_REFLECT + +// FILE: test.kt + +fun box(): String { + val kClass = Script::class + val nestedClasses = kClass.nestedClasses + val nestedClass = nestedClasses.single() + return nestedClass.simpleName!! +} + + +// FILE: Script.kts + +class OK +typealias Tazz = List +val x: Tazz = listOf() +x diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index a00e8c930f0..14d80bcc966 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -35479,6 +35479,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/reflection/classes/nestedClasses.kt"); } + @Test + @TestMetadata("nestedClassesInScript.kt") + public void testNestedClassesInScript() throws Exception { + runTest("compiler/testData/codegen/box/reflection/classes/nestedClassesInScript.kt"); + } + @Test @TestMetadata("nestedClassesJava.kt") public void testNestedClassesJava() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 7d8c560c00a..40834e14d43 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -35521,6 +35521,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/reflection/classes/nestedClasses.kt"); } + @Test + @TestMetadata("nestedClassesInScript.kt") + public void testNestedClassesInScript() throws Exception { + runTest("compiler/testData/codegen/box/reflection/classes/nestedClassesInScript.kt"); + } + @Test @TestMetadata("nestedClassesJava.kt") public void testNestedClassesJava() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index f244acaa4d6..1da8800af87 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -28052,6 +28052,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/reflection/classes/nestedClasses.kt"); } + @TestMetadata("nestedClassesInScript.kt") + public void testNestedClassesInScript() throws Exception { + runTest("compiler/testData/codegen/box/reflection/classes/nestedClassesInScript.kt"); + } + @TestMetadata("nestedClassesJava.kt") public void testNestedClassesJava() throws Exception { runTest("compiler/testData/codegen/box/reflection/classes/nestedClassesJava.kt"); diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt index 14ab0bd9e61..9acf0dcbd40 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt @@ -99,7 +99,7 @@ internal class KClassImpl( val nestedClasses: Collection> by ReflectProperties.lazySoft { descriptor.unsubstitutedInnerClassesScope.getContributedDescriptors().filterNot(DescriptorUtils::isEnumEntry) .mapNotNull { nestedClass -> - val jClass = (nestedClass as ClassDescriptor).toJavaClass() + val jClass = (nestedClass as? ClassDescriptor)?.toJavaClass() jClass?.let { KClassImpl(it) } } } diff --git a/plugins/scripting/scripting-compiler/build.gradle.kts b/plugins/scripting/scripting-compiler/build.gradle.kts index 716f1aec1eb..b665c4c0e7c 100644 --- a/plugins/scripting/scripting-compiler/build.gradle.kts +++ b/plugins/scripting/scripting-compiler/build.gradle.kts @@ -36,6 +36,8 @@ dependencies { testImplementation(intellijCoreDep()) { includeJars("intellij-core") } testRuntimeOnly(intellijDep()) { includeJars("jps-model", "jna") } + + testImplementation(project(":kotlin-reflect")) } sourceSets { diff --git a/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/test/ScriptCompilerTest.kt b/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/test/ScriptCompilerTest.kt index d9d64d6afcb..76f144595f7 100644 --- a/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/test/ScriptCompilerTest.kt +++ b/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/test/ScriptCompilerTest.kt @@ -6,7 +6,9 @@ package org.jetbrains.kotlin.scripting.compiler.test import junit.framework.TestCase +import kotlinx.coroutines.runBlocking import org.jetbrains.kotlin.scripting.compiler.plugin.impl.ScriptJvmCompilerIsolated +import kotlin.reflect.KClass import kotlin.script.experimental.api.* import kotlin.script.experimental.host.toScriptSource import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration @@ -27,6 +29,23 @@ class ScriptCompilerTest : TestCase() { assertTrue(res.reports.none { it.message.contains("nonsense") }) } + fun testTypeAliases() { + val res = compileToClass( + """ + class Clazz + typealias Tazz = List + val x: Tazz = listOf() + x + """.trimIndent().toScriptSource() + ) + + val kclass = res.valueOrThrow() + val nestedClasses = kclass.nestedClasses.toList() + + assertEquals(1, nestedClasses.size) + assertEquals("Clazz", nestedClasses[0].simpleName) + } + fun compile( script: SourceCode, cfgBody: ScriptCompilationConfiguration.Builder.() -> Unit @@ -35,4 +54,14 @@ class ScriptCompilerTest : TestCase() { val compiler = ScriptJvmCompilerIsolated(defaultJvmScriptingHostConfiguration) return compiler.compile(script, compilationConfiguration) } + + fun compileToClass( + script: SourceCode, + evaluationConfiguration: ScriptEvaluationConfiguration = ScriptEvaluationConfiguration(), + cfgBody: ScriptCompilationConfiguration.Builder.() -> Unit = {}, + ): ResultWithDiagnostics> { + val result = compile(script, cfgBody) + if (result is ResultWithDiagnostics.Failure) return result + return runBlocking { result.valueOrThrow().getClass(evaluationConfiguration) } + } } \ No newline at end of file