[java-decompiler] fixes enum constant initializer decompilation (IDEA-154547)

This commit is contained in:
Roman Shevchenko
2016-04-11 21:42:48 +02:00
parent a57e42690b
commit 1ac2304d60
6 changed files with 26 additions and 18 deletions

View File

@@ -117,7 +117,8 @@ public class InitializerProcessor {
StructClass cl = wrapper.getClassStruct();
Statement firstData = Statements.findFirstData(root);
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()) {
Exprent exprent = firstData.getExprents().get(0);
@@ -131,8 +132,7 @@ public class InitializerProcessor {
cl.hasField(fExpr.getName(), fExpr.getDescriptor().descriptorString)) {
// 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);
if (!wrapper.getStaticFieldInitializers().containsKey(keyField)) {
wrapper.getStaticFieldInitializers().addWithKey(assignExpr.getRight(), keyField);

Binary file not shown.

Binary file not shown.

View File

@@ -6,8 +6,8 @@ public enum TestEnum {
public void m() {
}// 22
},
E3("-"),
E4("+") {
E3("-", TestEnum.Type.ODD),
E4("+", TestEnum.Type.EVEN) {
public void m() {
}// 27
};
@@ -15,14 +15,19 @@ public enum TestEnum {
private String s;
public void m() {
}// 30
}// 32
private TestEnum() {
this("?");// 34
this("?", (TestEnum.Type)null);// 36
}
private TestEnum(@Deprecated String var3) {
this.s = var3;// 35
private TestEnum(@Deprecated String var3, TestEnum.Type var4) {
this.s = var3;// 37
}
private static enum Type {
ODD,
EVEN;
}
}
@@ -46,10 +51,11 @@ class 'pkg/TestEnum' {
method '<init> (Ljava/lang/String;I)V' {
3 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
b 25
}
@@ -58,6 +64,6 @@ class 'pkg/TestEnum' {
Lines mapping:
22 <-> 7
27 <-> 12
30 <-> 18
34 <-> 21
35 <-> 25
32 <-> 18
36 <-> 21
37 <-> 25

View File

@@ -21,16 +21,18 @@ public enum TestEnum {
@Override
public void m() { }
},
E3("-"),
E4("+") {
E3("-", Type.ODD),
E4("+", Type.EVEN) {
@Override
public void m() { }
};
private enum Type {ODD, EVEN}
public void m() { }
private String s;
private TestEnum() { this("?"); }
private TestEnum(@Deprecated String s) { this.s = s; }
private TestEnum() { this("?", null); }
private TestEnum(@Deprecated String s, Type t) { this.s = s; }
}