@@ -28,82 +28,88 @@ import com.intellij.psi.PsiClass
2828import com.intellij.psi.PsiClassInitializer
2929import com.intellij.psi.PsiExpressionStatement
3030import com.intellij.psi.PsiField
31+ import com.intellij.psi.PsiJavaFile
3132import com.intellij.psi.PsiMethod
3233import com.intellij.psi.PsiModifier
3334import com.intellij.psi.PsiStatement
3435import com.intellij.psi.PsiType
3536import com.intellij.util.JavaPsiConstructorUtil
3637
37- object FieldAssignmentDesugarer : Desugarer {
38- override fun desugar (project : Project , clazz : PsiClass ) {
38+ object FieldAssignmentDesugarer : Desugarer() {
39+ override fun desugar (project : Project , file : PsiJavaFile , clazz : PsiClass ): PsiClass {
3940 val staticStatementsToInsertPre = mutableListOf<PsiStatement >()
4041 val staticStatementsToInsertPost = mutableListOf<PsiStatement >()
4142 val nonStaticStatementsToInsert = mutableListOf<PsiStatement >()
4243 var seenStaticInitializer = false
4344
44- for (child in clazz.children) {
45- when (child) {
46- is PsiField -> {
47- val initializer = child.initializer ? : continue
45+ for (aClass in file.allClasses) {
46+ for (child in aClass.children) {
47+ when (child) {
48+ is PsiField -> {
49+ val initializer = child.initializer ? : continue
50+
51+ if (child.hasModifierProperty(PsiModifier .STATIC )) {
52+ // check if the field is a ConstantValue with no initializer in the bytecode
53+ val constantValue = initializer.constantValue
54+ if (constantValue != null && constantValue !is PsiType ) {
55+ continue
56+ }
57+
58+ val fieldInitializer = JavaPsiFacade .getElementFactory(project)
59+ .createStatementFromText(" ${child.name} = null;" , child) as PsiExpressionStatement
60+ (fieldInitializer.expression as PsiAssignmentExpression ).rExpression!! .replace(initializer)
61+ DesugarUtil .setOriginalElement(fieldInitializer, DesugarUtil .getOriginalElement(child))
62+
63+ if (seenStaticInitializer) {
64+ staticStatementsToInsertPost + = fieldInitializer
65+ } else {
66+ staticStatementsToInsertPre + = fieldInitializer
67+ }
68+ } else {
69+ val fieldInitializer = JavaPsiFacade .getElementFactory(project)
70+ .createStatementFromText(" this.${child.name} = null;" , child) as PsiExpressionStatement
71+ (fieldInitializer.expression as PsiAssignmentExpression ).rExpression!! .replace(initializer)
72+ DesugarUtil .setOriginalElement(fieldInitializer, DesugarUtil .getOriginalElement(child))
4873
49- if (child.hasModifierProperty(PsiModifier .STATIC )) {
50- // check if the field is a ConstantValue with no initializer in the bytecode
51- val constantValue = initializer.constantValue
52- if (constantValue != null && constantValue !is PsiType ) {
53- continue
74+ nonStaticStatementsToInsert + = fieldInitializer
5475 }
5576
56- val fieldInitializer = JavaPsiFacade .getElementFactory(project)
57- .createStatementFromText(" ${child.name} = null;" , child) as PsiExpressionStatement
58- (fieldInitializer.expression as PsiAssignmentExpression ).rExpression!! .replace(initializer)
59- DesugarUtil .setOriginalElement(fieldInitializer, DesugarUtil .getOriginalElement(child))
77+ initializer.delete()
78+ }
6079
61- if (seenStaticInitializer) {
62- staticStatementsToInsertPost + = fieldInitializer
80+ is PsiClassInitializer -> {
81+ if (child.hasModifierProperty(PsiModifier .STATIC )) {
82+ seenStaticInitializer = true
6383 } else {
64- staticStatementsToInsertPre + = fieldInitializer
84+ nonStaticStatementsToInsert + = child.body.statements
85+ child.delete()
6586 }
66- } else {
67- val fieldInitializer = JavaPsiFacade .getElementFactory(project)
68- .createStatementFromText(" this.${child.name} = null;" , child) as PsiExpressionStatement
69- (fieldInitializer.expression as PsiAssignmentExpression ).rExpression!! .replace(initializer)
70- DesugarUtil .setOriginalElement(fieldInitializer, DesugarUtil .getOriginalElement(child))
71-
72- nonStaticStatementsToInsert + = fieldInitializer
73- }
74-
75- initializer.delete()
76- }
77- is PsiClassInitializer -> {
78- if (child.hasModifierProperty(PsiModifier .STATIC )) {
79- seenStaticInitializer = true
80- } else {
81- nonStaticStatementsToInsert + = child.body.statements
82- child.delete()
8387 }
8488 }
8589 }
86- }
8790
88- if (staticStatementsToInsertPre.isNotEmpty() || staticStatementsToInsertPost.isNotEmpty()) {
89- val staticBlock = findStaticBlock(project, clazz)
90- for (statement in staticStatementsToInsertPre) {
91- staticBlock.body.addAfter(statement, staticBlock.body.lBrace)
92- }
93- for (statement in staticStatementsToInsertPost) {
94- staticBlock.body.addBefore(statement, staticBlock.body.rBrace)
91+ if (staticStatementsToInsertPre.isNotEmpty() || staticStatementsToInsertPost.isNotEmpty()) {
92+ val staticBlock = findStaticBlock(project, aClass)
93+ for (statement in staticStatementsToInsertPre) {
94+ staticBlock.body.addAfter(statement, staticBlock.body.lBrace)
95+ }
96+ for (statement in staticStatementsToInsertPost) {
97+ staticBlock.body.addBefore(statement, staticBlock.body.rBrace)
98+ }
9599 }
96- }
97100
98- if (nonStaticStatementsToInsert.isNotEmpty()) {
99- for (constructor in findConstructorsCallingSuper(project, clazz)) {
100- val body = constructor .body ? : continue
101- val delegateCtorCall = JavaPsiConstructorUtil .findThisOrSuperCallInConstructor(constructor )
102- for (statement in nonStaticStatementsToInsert.asReversed()) {
103- body.addAfter(statement, delegateCtorCall?.parent ? : body.lBrace)
101+ if (nonStaticStatementsToInsert.isNotEmpty()) {
102+ for (constructor in findConstructorsCallingSuper(project, aClass)) {
103+ val body = constructor .body ? : continue
104+ val delegateCtorCall = JavaPsiConstructorUtil .findThisOrSuperCallInConstructor(constructor )
105+ for (statement in nonStaticStatementsToInsert.asReversed()) {
106+ body.addAfter(statement, delegateCtorCall?.parent ? : body.lBrace)
107+ }
104108 }
105109 }
106110 }
111+
112+ return clazz
107113 }
108114
109115 private fun findStaticBlock (project : Project , clazz : PsiClass ): PsiClassInitializer {
0 commit comments