Skip to content

Commit 829ab3c

Browse files
committed
Desugar non-static class initializers to block statements, to ensure proper local variable indexes
1 parent 9c94ff3 commit 829ab3c

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

src/main/kotlin/platform/mixin/handlers/desugar/FieldAssignmentDesugarer.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.demonwav.mcdev.util.constantValue
2424
import com.intellij.openapi.project.Project
2525
import com.intellij.psi.JavaPsiFacade
2626
import com.intellij.psi.PsiAssignmentExpression
27+
import com.intellij.psi.PsiBlockStatement
2728
import com.intellij.psi.PsiClass
2829
import com.intellij.psi.PsiClassInitializer
2930
import com.intellij.psi.PsiExpressionStatement
@@ -41,6 +42,7 @@ object FieldAssignmentDesugarer : Desugarer() {
4142
val staticStatementsToInsertPost = mutableListOf<PsiStatement>()
4243
val nonStaticStatementsToInsert = mutableListOf<PsiStatement>()
4344
var seenStaticInitializer = false
45+
val factory = JavaPsiFacade.getElementFactory(project)
4446

4547
for (aClass in DesugarUtil.allClasses(file)) {
4648
for (child in aClass.children) {
@@ -57,8 +59,8 @@ object FieldAssignmentDesugarer : Desugarer() {
5759
}
5860
}
5961

60-
val fieldInitializer = JavaPsiFacade.getElementFactory(project)
61-
.createStatementFromText("${child.name} = null;", child) as PsiExpressionStatement
62+
val fieldInitializer = factory.createStatementFromText("${child.name} = null;", child)
63+
as PsiExpressionStatement
6264
(fieldInitializer.expression as PsiAssignmentExpression).rExpression!!.replace(initializer)
6365
DesugarUtil.setOriginalElement(fieldInitializer, DesugarUtil.getOriginalElement(child))
6466

@@ -68,8 +70,8 @@ object FieldAssignmentDesugarer : Desugarer() {
6870
staticStatementsToInsertPre += fieldInitializer
6971
}
7072
} else {
71-
val fieldInitializer = JavaPsiFacade.getElementFactory(project)
72-
.createStatementFromText("this.${child.name} = null;", child) as PsiExpressionStatement
73+
val fieldInitializer = factory.createStatementFromText("this.${child.name} = null;", child)
74+
as PsiExpressionStatement
7375
(fieldInitializer.expression as PsiAssignmentExpression).rExpression!!.replace(initializer)
7476
DesugarUtil.setOriginalElement(fieldInitializer, DesugarUtil.getOriginalElement(child))
7577

@@ -83,7 +85,9 @@ object FieldAssignmentDesugarer : Desugarer() {
8385
if (child.hasModifierProperty(PsiModifier.STATIC)) {
8486
seenStaticInitializer = true
8587
} else {
86-
nonStaticStatementsToInsert += child.body.statements.map { it.copy() as PsiStatement }
88+
val blockStatement = factory.createStatementFromText("{}", null) as PsiBlockStatement
89+
blockStatement.codeBlock.replace(child.body)
90+
nonStaticStatementsToInsert += blockStatement
8791
child.delete()
8892
}
8993
}

src/test/kotlin/platform/mixin/desugar/FieldAssignmentDesugarTest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,9 @@ class FieldAssignmentDesugarTest : AbstractDesugarTest() {
313313
314314
public Test() {
315315
this.field1 = "test1";
316-
System.out.println("Hello World!");
316+
{
317+
System.out.println("Hello World!");
318+
}
317319
this.field2 = "test2";
318320
}
319321
}

0 commit comments

Comments
 (0)