K2 Scripting, Fir2Ir: allow out of order supertypes declaration

fix script declarations registration logic in Fir2Ir to allow
supertypes of a class to be defined later than the class itself.

#KT-64534 fixed
This commit is contained in:
Ilya Chernikov
2024-03-15 15:08:49 +01:00
committed by Space Team
parent f18aa5e70f
commit 0df3a37303
9 changed files with 76 additions and 1 deletions
@@ -528,10 +528,12 @@ class Fir2IrConverter(
addDeclarationToParentIfNeeded(irScript)
declarationStorage.withScope(irScript.symbol) {
irScript.parent = parent
for (scriptDeclaration in declaration.declarations.filterIsInstance<FirRegularClass>()) {
registerClassAndNestedClasses(scriptDeclaration, irScript)
}
for (scriptDeclaration in declaration.declarations) {
when (scriptDeclaration) {
is FirRegularClass -> {
registerClassAndNestedClasses(scriptDeclaration, irScript)
processClassAndNestedClassHeaders(scriptDeclaration)
}
is FirTypeAlias -> classifierStorage.createAndCacheIrTypeAlias(scriptDeclaration, irScript)
@@ -54575,6 +54575,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
runTest("compiler/testData/codegen/box/script/localCaptureTestsK2.kt");
}
@Test
@TestMetadata("outOuOrderDecls.kt")
public void testOutOuOrderDecls() {
runTest("compiler/testData/codegen/box/script/outOuOrderDecls.kt");
}
@Test
@TestMetadata("scripInstance.kt")
public void testScripInstance() {
@@ -0,0 +1,24 @@
MODULE main
CLASS Script.class
CLASS METADATA
K1
<init>([Ljava/lang/String;)V
K2
---
Property: class.metadata.superTypes
K1
[kotlin/script/templates/standard/ScriptTemplateWithArgs]
K2
[]
Property: class.metadata.contextReceiverTypes
K1
[]
K2
[kotlin/script/templates/standard/ScriptTemplateWithArgs]
CLASS Script$A.class
CLASS METADATA
Property: class.metadata.superTypes
K1
[Script.B, Script.C]
K2
[B, C]
+14
View File
@@ -0,0 +1,14 @@
// TARGET_BACKEND: JVM
// IGNORE_LIGHT_ANALYSIS
// JVM_ABI_K1_K2_DIFF: KT-63963, KT-63964, KT-63960
// FILE: test.kt
fun box(): String = "OK"
// FILE: script.kts
class A : B, C {}
interface B
interface C
@@ -53873,6 +53873,12 @@ public class JvmAbiConsistencyTestBoxGenerated extends AbstractJvmAbiConsistency
runTest("compiler/testData/codegen/box/script/localCaptureTestsK2.kt");
}
@Test
@TestMetadata("outOuOrderDecls.kt")
public void testOutOuOrderDecls() {
runTest("compiler/testData/codegen/box/script/outOuOrderDecls.kt");
}
@Test
@TestMetadata("scripInstance.kt")
public void testScripInstance() {
@@ -50687,6 +50687,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/script/localCaptureTestsK2.kt");
}
@Test
@TestMetadata("outOuOrderDecls.kt")
public void testOutOuOrderDecls() {
runTest("compiler/testData/codegen/box/script/outOuOrderDecls.kt");
}
@Test
@TestMetadata("scripInstance.kt")
public void testScripInstance() {
@@ -53873,6 +53873,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/script/localCaptureTestsK2.kt");
}
@Test
@TestMetadata("outOuOrderDecls.kt")
public void testOutOuOrderDecls() {
runTest("compiler/testData/codegen/box/script/outOuOrderDecls.kt");
}
@Test
@TestMetadata("scripInstance.kt")
public void testScripInstance() {
@@ -53873,6 +53873,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
runTest("compiler/testData/codegen/box/script/localCaptureTestsK2.kt");
}
@Test
@TestMetadata("outOuOrderDecls.kt")
public void testOutOuOrderDecls() {
runTest("compiler/testData/codegen/box/script/outOuOrderDecls.kt");
}
@Test
@TestMetadata("scripInstance.kt")
public void testScripInstance() {
@@ -43545,6 +43545,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/script/localCaptureTests.kt");
}
@TestMetadata("outOuOrderDecls.kt")
public void testOutOuOrderDecls() {
runTest("compiler/testData/codegen/box/script/outOuOrderDecls.kt");
}
@TestMetadata("scripInstance.kt")
public void testScripInstance() {
runTest("compiler/testData/codegen/box/script/scripInstance.kt");