[java-decompiler] fixes enum constant initializer decompilation (IDEA-154547)
This commit is contained in:
@@ -117,7 +117,8 @@ public class InitializerProcessor {
|
|||||||
StructClass cl = wrapper.getClassStruct();
|
StructClass cl = wrapper.getClassStruct();
|
||||||
Statement firstData = Statements.findFirstData(root);
|
Statement firstData = Statements.findFirstData(root);
|
||||||
if (firstData != null) {
|
if (firstData != null) {
|
||||||
boolean isInterface = cl.hasModifier(CodeConstants.ACC_INTERFACE);
|
boolean inlineInitializers = cl.hasModifier(CodeConstants.ACC_INTERFACE) || cl.hasModifier(CodeConstants.ACC_ENUM);
|
||||||
|
|
||||||
while (!firstData.getExprents().isEmpty()) {
|
while (!firstData.getExprents().isEmpty()) {
|
||||||
Exprent exprent = firstData.getExprents().get(0);
|
Exprent exprent = firstData.getExprents().get(0);
|
||||||
|
|
||||||
@@ -131,8 +132,7 @@ public class InitializerProcessor {
|
|||||||
cl.hasField(fExpr.getName(), fExpr.getDescriptor().descriptorString)) {
|
cl.hasField(fExpr.getName(), fExpr.getDescriptor().descriptorString)) {
|
||||||
|
|
||||||
// interfaces fields should always be initialized inline
|
// interfaces fields should always be initialized inline
|
||||||
if (isInterface || isExprentIndependent(assignExpr.getRight(), method)) {
|
if (inlineInitializers || isExprentIndependent(assignExpr.getRight(), method)) {
|
||||||
|
|
||||||
String keyField = InterpreterUtil.makeUniqueKey(fExpr.getName(), fExpr.getDescriptor().descriptorString);
|
String keyField = InterpreterUtil.makeUniqueKey(fExpr.getName(), fExpr.getDescriptor().descriptorString);
|
||||||
if (!wrapper.getStaticFieldInitializers().containsKey(keyField)) {
|
if (!wrapper.getStaticFieldInitializers().containsKey(keyField)) {
|
||||||
wrapper.getStaticFieldInitializers().addWithKey(assignExpr.getRight(), keyField);
|
wrapper.getStaticFieldInitializers().addWithKey(assignExpr.getRight(), keyField);
|
||||||
|
|||||||
Binary file not shown.
BIN
testData/classes/pkg/TestEnum$Type.class
Normal file
BIN
testData/classes/pkg/TestEnum$Type.class
Normal file
Binary file not shown.
Binary file not shown.
@@ -6,8 +6,8 @@ public enum TestEnum {
|
|||||||
public void m() {
|
public void m() {
|
||||||
}// 22
|
}// 22
|
||||||
},
|
},
|
||||||
E3("-"),
|
E3("-", TestEnum.Type.ODD),
|
||||||
E4("+") {
|
E4("+", TestEnum.Type.EVEN) {
|
||||||
public void m() {
|
public void m() {
|
||||||
}// 27
|
}// 27
|
||||||
};
|
};
|
||||||
@@ -15,14 +15,19 @@ public enum TestEnum {
|
|||||||
private String s;
|
private String s;
|
||||||
|
|
||||||
public void m() {
|
public void m() {
|
||||||
}// 30
|
}// 32
|
||||||
|
|
||||||
private TestEnum() {
|
private TestEnum() {
|
||||||
this("?");// 34
|
this("?", (TestEnum.Type)null);// 36
|
||||||
}
|
}
|
||||||
|
|
||||||
private TestEnum(@Deprecated String var3) {
|
private TestEnum(@Deprecated String var3, TestEnum.Type var4) {
|
||||||
this.s = var3;// 35
|
this.s = var3;// 37
|
||||||
|
}
|
||||||
|
|
||||||
|
private static enum Type {
|
||||||
|
ODD,
|
||||||
|
EVEN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,10 +51,11 @@ class 'pkg/TestEnum' {
|
|||||||
method '<init> (Ljava/lang/String;I)V' {
|
method '<init> (Ljava/lang/String;I)V' {
|
||||||
3 20
|
3 20
|
||||||
5 20
|
5 20
|
||||||
8 21
|
6 20
|
||||||
|
9 21
|
||||||
}
|
}
|
||||||
|
|
||||||
method '<init> (Ljava/lang/String;ILjava/lang/String;)V' {
|
method '<init> (Ljava/lang/String;ILjava/lang/String;Lpkg/TestEnum$Type;)V' {
|
||||||
8 24
|
8 24
|
||||||
b 25
|
b 25
|
||||||
}
|
}
|
||||||
@@ -58,6 +64,6 @@ class 'pkg/TestEnum' {
|
|||||||
Lines mapping:
|
Lines mapping:
|
||||||
22 <-> 7
|
22 <-> 7
|
||||||
27 <-> 12
|
27 <-> 12
|
||||||
30 <-> 18
|
32 <-> 18
|
||||||
34 <-> 21
|
36 <-> 21
|
||||||
35 <-> 25
|
37 <-> 25
|
||||||
|
|||||||
@@ -21,16 +21,18 @@ public enum TestEnum {
|
|||||||
@Override
|
@Override
|
||||||
public void m() { }
|
public void m() { }
|
||||||
},
|
},
|
||||||
E3("-"),
|
E3("-", Type.ODD),
|
||||||
E4("+") {
|
E4("+", Type.EVEN) {
|
||||||
@Override
|
@Override
|
||||||
public void m() { }
|
public void m() { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private enum Type {ODD, EVEN}
|
||||||
|
|
||||||
public void m() { }
|
public void m() { }
|
||||||
|
|
||||||
private String s;
|
private String s;
|
||||||
|
|
||||||
private TestEnum() { this("?"); }
|
private TestEnum() { this("?", null); }
|
||||||
private TestEnum(@Deprecated String s) { this.s = s; }
|
private TestEnum(@Deprecated String s, Type t) { this.s = s; }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user