User: joe Date: 29 May 25 11:40 Revision: 829ab3c249ca0fc9706c82d7a68be8afb0b60d56 Summary: Desugar non-static class initializers to block statements, to ensure proper local variable indexes TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=10035&personal=false Index: src/main/kotlin/platform/mixin/handlers/desugar/FieldAssignmentDesugarer.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/desugar/FieldAssignmentDesugarer.kt (revision 9c94ff3f8046988901d53dad93032951d35a48ca) +++ src/main/kotlin/platform/mixin/handlers/desugar/FieldAssignmentDesugarer.kt (revision 829ab3c249ca0fc9706c82d7a68be8afb0b60d56) @@ -24,6 +24,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiAssignmentExpression +import com.intellij.psi.PsiBlockStatement import com.intellij.psi.PsiClass import com.intellij.psi.PsiClassInitializer import com.intellij.psi.PsiExpressionStatement @@ -41,6 +42,7 @@ val staticStatementsToInsertPost = mutableListOf() val nonStaticStatementsToInsert = mutableListOf() var seenStaticInitializer = false + val factory = JavaPsiFacade.getElementFactory(project) for (aClass in DesugarUtil.allClasses(file)) { for (child in aClass.children) { @@ -57,8 +59,8 @@ } } - val fieldInitializer = JavaPsiFacade.getElementFactory(project) - .createStatementFromText("${child.name} = null;", child) as PsiExpressionStatement + val fieldInitializer = factory.createStatementFromText("${child.name} = null;", child) + as PsiExpressionStatement (fieldInitializer.expression as PsiAssignmentExpression).rExpression!!.replace(initializer) DesugarUtil.setOriginalElement(fieldInitializer, DesugarUtil.getOriginalElement(child)) @@ -68,8 +70,8 @@ staticStatementsToInsertPre += fieldInitializer } } else { - val fieldInitializer = JavaPsiFacade.getElementFactory(project) - .createStatementFromText("this.${child.name} = null;", child) as PsiExpressionStatement + val fieldInitializer = factory.createStatementFromText("this.${child.name} = null;", child) + as PsiExpressionStatement (fieldInitializer.expression as PsiAssignmentExpression).rExpression!!.replace(initializer) DesugarUtil.setOriginalElement(fieldInitializer, DesugarUtil.getOriginalElement(child)) @@ -83,7 +85,9 @@ if (child.hasModifierProperty(PsiModifier.STATIC)) { seenStaticInitializer = true } else { - nonStaticStatementsToInsert += child.body.statements.map { it.copy() as PsiStatement } + val blockStatement = factory.createStatementFromText("{}", null) as PsiBlockStatement + blockStatement.codeBlock.replace(child.body) + nonStaticStatementsToInsert += blockStatement child.delete() } } Index: src/test/kotlin/platform/mixin/desugar/FieldAssignmentDesugarTest.kt =================================================================== --- src/test/kotlin/platform/mixin/desugar/FieldAssignmentDesugarTest.kt (revision 9c94ff3f8046988901d53dad93032951d35a48ca) +++ src/test/kotlin/platform/mixin/desugar/FieldAssignmentDesugarTest.kt (revision 829ab3c249ca0fc9706c82d7a68be8afb0b60d56) @@ -313,7 +313,9 @@ public Test() { this.field1 = "test1"; + { - System.out.println("Hello World!"); + System.out.println("Hello World!"); + } this.field2 = "test2"; } }