diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/SwitchHelper.java b/src/org/jetbrains/java/decompiler/modules/decompiler/SwitchHelper.java index 01d56e2..cf935f4 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/SwitchHelper.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/SwitchHelper.java @@ -37,8 +37,9 @@ public class SwitchHelper { List> caseValues = switchStatement.getCaseValues(); Map mapping = new HashMap<>(caseValues.size()); ArrayExprent array = (ArrayExprent)value; + FieldExprent arrayField = (FieldExprent)array.getArray(); ClassesProcessor.ClassNode classNode = - DecompilerContext.getClassProcessor().getMapRootClasses().get(((FieldExprent)array.getArray()).getClassname()); + DecompilerContext.getClassProcessor().getMapRootClasses().get(arrayField.getClassname()); if (classNode != null) { MethodWrapper wrapper = classNode.getWrapper().getMethodWrapper(CodeConstants.CLINIT_NAME, "()V"); if (wrapper != null) { @@ -48,7 +49,7 @@ public class SwitchHelper { if (exprent instanceof AssignmentExprent) { AssignmentExprent assignment = (AssignmentExprent)exprent; Exprent left = assignment.getLeft(); - if (isEnumArray(left)) { + if (left.type == Exprent.EXPRENT_ARRAY && ((ArrayExprent)left).getArray().equals(arrayField)) { mapping.put(assignment.getRight(), ((InvocationExprent)((ArrayExprent)left).getIndex()).getInstance()); } } diff --git a/testData/classes/pkg/TestSwitchOnEnum$1.class b/testData/classes/pkg/TestSwitchOnEnum$1.class index aebc1c5..6c54901 100644 Binary files a/testData/classes/pkg/TestSwitchOnEnum$1.class and b/testData/classes/pkg/TestSwitchOnEnum$1.class differ diff --git a/testData/classes/pkg/TestSwitchOnEnum$Example$A.class b/testData/classes/pkg/TestSwitchOnEnum$Example$A.class new file mode 100644 index 0000000..7bd4f3d Binary files /dev/null and b/testData/classes/pkg/TestSwitchOnEnum$Example$A.class differ diff --git a/testData/classes/pkg/TestSwitchOnEnum$Example$B.class b/testData/classes/pkg/TestSwitchOnEnum$Example$B.class new file mode 100644 index 0000000..ab8f77d Binary files /dev/null and b/testData/classes/pkg/TestSwitchOnEnum$Example$B.class differ diff --git a/testData/classes/pkg/TestSwitchOnEnum$Example.class b/testData/classes/pkg/TestSwitchOnEnum$Example.class new file mode 100644 index 0000000..dbcba7e Binary files /dev/null and b/testData/classes/pkg/TestSwitchOnEnum$Example.class differ diff --git a/testData/classes/pkg/TestSwitchOnEnum.class b/testData/classes/pkg/TestSwitchOnEnum.class index 3117de8..f7c13a2 100644 Binary files a/testData/classes/pkg/TestSwitchOnEnum.class and b/testData/classes/pkg/TestSwitchOnEnum.class differ diff --git a/testData/results/TestSwitchOnEnum.dec b/testData/results/TestSwitchOnEnum.dec index 33b0464..b6984c3 100644 --- a/testData/results/TestSwitchOnEnum.dec +++ b/testData/results/TestSwitchOnEnum.dec @@ -15,6 +15,37 @@ public class TestSwitchOnEnum { return 0;// 20 } } + + static class Example { + void test(TestSwitchOnEnum.Example.A a, TestSwitchOnEnum.Example.B b) { + switch(a) {// 30 + case A1: + System.out.println("A1");// 32 + break;// 33 + case A2: + System.out.println("A2");// 35 + } + + switch(b) {// 38 + case B1: + System.out.println("B1");// 40 + break;// 41 + case B2: + System.out.println("B2");// 43 + } + + }// 46 + + static enum B { + B1, + B2; + } + + static enum A { + A1, + A2; + } + } } class 'pkg/TestSwitchOnEnum' { @@ -29,8 +60,39 @@ class 'pkg/TestSwitchOnEnum' { } } +class 'pkg/TestSwitchOnEnum$Example' { + method 'test (Lpkg/TestSwitchOnEnum$Example$A;Lpkg/TestSwitchOnEnum$Example$B;)V' { + 8 20 + 24 22 + 27 22 + 29 22 + 2c 23 + 2f 25 + 32 25 + 34 25 + 3f 28 + 58 30 + 5b 30 + 5d 30 + 60 31 + 63 33 + 66 33 + 68 33 + 6b 36 + } +} + Lines mapping: 14 <-> 9 16 <-> 11 18 <-> 13 20 <-> 15 +30 <-> 21 +32 <-> 23 +33 <-> 24 +35 <-> 26 +38 <-> 29 +40 <-> 31 +41 <-> 32 +43 <-> 34 +46 <-> 37 diff --git a/testData/src/pkg/TestSwitchOnEnum.java b/testData/src/pkg/TestSwitchOnEnum.java index e26d407..0ea59ec 100644 --- a/testData/src/pkg/TestSwitchOnEnum.java +++ b/testData/src/pkg/TestSwitchOnEnum.java @@ -19,4 +19,30 @@ public class TestSwitchOnEnum { } return 0; } + + static class Example { + + enum A { A1, A2} + + enum B { B1, B2} + + void test(A a, B b){ + switch (a){ + case A1: + System.out.println("A1"); + break; + case A2: + System.out.println("A2"); + break; + } + switch (b){ + case B1: + System.out.println("B1"); + break; + case B2: + System.out.println("B2"); + break; + } + } + } }