diff --git a/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java b/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java index ef64f2c..b456cc8 100644 --- a/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java +++ b/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java @@ -393,7 +393,7 @@ public class NestedClassProcessor { mergeListSignatures(interPairMask, interMask, true); for (VarFieldPair pair : interPairMask) { - if (pair != null && pair.fieldKey.length() > 0) { + if (pair != null && !pair.fieldKey.isEmpty()) { nestedNode.mapFieldsToVars.put(pair.fieldKey, pair.varPair); } } @@ -406,7 +406,7 @@ public class NestedClassProcessor { method.signatureFields = new ArrayList<>(); for (VarFieldPair pair : entry.getValue()) { - method.signatureFields.add(pair == null ? null : pair.varPair); + method.signatureFields.add(pair == null || pair.fieldKey.isEmpty() ? null : pair.varPair); } } } diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java b/src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java index 2db188f..f31f3a8 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java @@ -210,8 +210,8 @@ public class NewExprent extends Exprent { ClassNode newNode = DecompilerContext.getClassProcessor().getMapRootClasses().get(invSuper.getClassname()); - List sigFields = null; - if (newNode != null) { // own class + List sigFields = child.getWrapper().getMethodWrapper(CodeConstants.INIT_NAME, constructor.getStringDescriptor()).signatureFields; + if (sigFields == null && newNode != null) { // own class if (newNode.getWrapper() != null) { sigFields = newNode.getWrapper().getMethodWrapper(CodeConstants.INIT_NAME, invSuper.getStringDescriptor()).signatureFields; } @@ -224,27 +224,17 @@ public class NewExprent extends Exprent { } } + List lstParameters = constructor.getLstParameters(); + + int start = enumConst ? 2 : 0; boolean firstParam = true; - int start = 0, end = invSuper.getLstParameters().size(); - if (enumConst) { - start += 2; - end -= 1; - } - for (int i = start; i < end; i++) { + for (int i = start; i < lstParameters.size(); i++) { if (sigFields == null || sigFields.get(i) == null) { if (!firstParam) { buf.append(", "); } - Exprent param = invSuper.getLstParameters().get(i); - if (param.type == Exprent.EXPRENT_VAR) { - int varIndex = ((VarExprent)param).getIndex(); - if (varIndex > 0 && varIndex <= constructor.getLstParameters().size()) { - param = constructor.getLstParameters().get(varIndex - 1); - } - } - - ExprProcessor.getCastedExprent(param, invSuper.getDescriptor().params[i], buf, indent, true, tracer); + ExprProcessor.getCastedExprent(lstParameters.get(i), constructor.getDescriptor().params[i], buf, indent, true, tracer); firstParam = false; } diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java index 6bcf941..7c1cc33 100644 --- a/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -62,6 +62,7 @@ public class SingleClassesTest { @Test public void testEnum() { doTest("pkg/TestEnum"); } @Test public void testDebugSymbols() { doTest("pkg/TestDebugSymbols"); } @Test public void testInvalidMethodSignature() { doTest("InvalidMethodSignature"); } + @Test public void testAnonymousClassConstructor() { doTest("pkg/TestAnonymousClassConstructor"); } @Test public void testInnerClassConstructor() { doTest("pkg/TestInnerClassConstructor"); } @Test public void testInnerClassConstructor11() { doTest("v11/TestInnerClassConstructor"); } @Test public void testTryCatchFinally() { doTest("pkg/TestTryCatchFinally"); } @@ -94,6 +95,7 @@ public class SingleClassesTest { @Test public void testKotlinConstructor() { doTest("pkg/TestKotlinConstructorKt"); } @Test public void testAsserts() { doTest("pkg/TestAsserts"); } @Test public void testLocalsNames() { doTest("pkg/TestLocalsNames"); } + @Test public void testAnonymousParamNames() { doTest("pkg/TestAnonymousParamNames"); } private void doTest(String testFile, String... companionFiles) { ConsoleDecompiler decompiler = fixture.getDecompiler(); diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$1.class b/testData/classes/pkg/TestAnonymousClassConstructor$1.class new file mode 100644 index 0000000..5c42a2c Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$1.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$10.class b/testData/classes/pkg/TestAnonymousClassConstructor$10.class new file mode 100644 index 0000000..fb064fa Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$10.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$11.class b/testData/classes/pkg/TestAnonymousClassConstructor$11.class new file mode 100644 index 0000000..4cc1fb9 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$11.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$12.class b/testData/classes/pkg/TestAnonymousClassConstructor$12.class new file mode 100644 index 0000000..c23af1a Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$12.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$2.class b/testData/classes/pkg/TestAnonymousClassConstructor$2.class new file mode 100644 index 0000000..fb671b1 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$2.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$3.class b/testData/classes/pkg/TestAnonymousClassConstructor$3.class new file mode 100644 index 0000000..80dd6bf Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$3.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$4.class b/testData/classes/pkg/TestAnonymousClassConstructor$4.class new file mode 100644 index 0000000..74820ac Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$4.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$5.class b/testData/classes/pkg/TestAnonymousClassConstructor$5.class new file mode 100644 index 0000000..c32a742 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$5.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$6.class b/testData/classes/pkg/TestAnonymousClassConstructor$6.class new file mode 100644 index 0000000..2dde517 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$6.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$7.class b/testData/classes/pkg/TestAnonymousClassConstructor$7.class new file mode 100644 index 0000000..6f08d90 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$7.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$8.class b/testData/classes/pkg/TestAnonymousClassConstructor$8.class new file mode 100644 index 0000000..59b8436 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$8.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$9.class b/testData/classes/pkg/TestAnonymousClassConstructor$9.class new file mode 100644 index 0000000..ab22f7b Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$9.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$InnerPrivate.class b/testData/classes/pkg/TestAnonymousClassConstructor$InnerPrivate.class new file mode 100644 index 0000000..dc248af Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$InnerPrivate.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$InnerPrivateString.class b/testData/classes/pkg/TestAnonymousClassConstructor$InnerPrivateString.class new file mode 100644 index 0000000..dd660b7 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$InnerPrivateString.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$InnerPublic.class b/testData/classes/pkg/TestAnonymousClassConstructor$InnerPublic.class new file mode 100644 index 0000000..b984943 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$InnerPublic.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$InnerPublicString.class b/testData/classes/pkg/TestAnonymousClassConstructor$InnerPublicString.class new file mode 100644 index 0000000..e96ecf4 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$InnerPublicString.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$InnerStaticPrivate.class b/testData/classes/pkg/TestAnonymousClassConstructor$InnerStaticPrivate.class new file mode 100644 index 0000000..9e7f688 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$InnerStaticPrivate.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$InnerStaticPrivateString.class b/testData/classes/pkg/TestAnonymousClassConstructor$InnerStaticPrivateString.class new file mode 100644 index 0000000..9352fd7 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$InnerStaticPrivateString.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$InnerStaticPublic.class b/testData/classes/pkg/TestAnonymousClassConstructor$InnerStaticPublic.class new file mode 100644 index 0000000..d78a2d0 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$InnerStaticPublic.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor$InnerStaticPublicString.class b/testData/classes/pkg/TestAnonymousClassConstructor$InnerStaticPublicString.class new file mode 100644 index 0000000..8eec4e1 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor$InnerStaticPublicString.class differ diff --git a/testData/classes/pkg/TestAnonymousClassConstructor.class b/testData/classes/pkg/TestAnonymousClassConstructor.class new file mode 100644 index 0000000..7c692b8 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousClassConstructor.class differ diff --git a/testData/classes/pkg/TestAnonymousParamNames$1.class b/testData/classes/pkg/TestAnonymousParamNames$1.class new file mode 100644 index 0000000..3a8a43f Binary files /dev/null and b/testData/classes/pkg/TestAnonymousParamNames$1.class differ diff --git a/testData/classes/pkg/TestAnonymousParamNames$Clazz.class b/testData/classes/pkg/TestAnonymousParamNames$Clazz.class new file mode 100644 index 0000000..9e4c76a Binary files /dev/null and b/testData/classes/pkg/TestAnonymousParamNames$Clazz.class differ diff --git a/testData/classes/pkg/TestAnonymousParamNames.class b/testData/classes/pkg/TestAnonymousParamNames.class new file mode 100644 index 0000000..d8faae5 Binary files /dev/null and b/testData/classes/pkg/TestAnonymousParamNames.class differ diff --git a/testData/results/TestAnonymousClassConstructor.dec b/testData/results/TestAnonymousClassConstructor.dec new file mode 100644 index 0000000..66960ce --- /dev/null +++ b/testData/results/TestAnonymousClassConstructor.dec @@ -0,0 +1,308 @@ +package pkg; + +class TestAnonymousClassConstructor { + void innerPrivateString() { + TestAnonymousClassConstructor.InnerPrivateString var10001 = new TestAnonymousClassConstructor.InnerPrivateString("text") {// 5 + }; + }// 6 + + void innerPrivate() { + TestAnonymousClassConstructor.InnerPrivate var10001 = new TestAnonymousClassConstructor.InnerPrivate(3L, 4) {// 9 + }; + }// 10 + + void innerStaticPrivateString() { + TestAnonymousClassConstructor.InnerStaticPrivateString var10001 = new TestAnonymousClassConstructor.InnerStaticPrivateString("text") {// 13 + }; + }// 14 + + void innerStaticPrivate() { + TestAnonymousClassConstructor.InnerStaticPrivate var10001 = new TestAnonymousClassConstructor.InnerStaticPrivate(3L, 4) {// 17 + }; + }// 18 + + static void innerStaticPrivateStringStatic() { + TestAnonymousClassConstructor.InnerStaticPrivateString var10001 = new TestAnonymousClassConstructor.InnerStaticPrivateString("text") {// 21 + }; + }// 22 + + static void innerStaticPrivateStatic() { + TestAnonymousClassConstructor.InnerStaticPrivate var10001 = new TestAnonymousClassConstructor.InnerStaticPrivate(3L, 4) {// 25 + }; + }// 26 + + void innerPublicString() { + TestAnonymousClassConstructor.InnerPublicString var10001 = new TestAnonymousClassConstructor.InnerPublicString("text") {// 29 + }; + }// 30 + + void innerPublic() { + TestAnonymousClassConstructor.InnerPublic var10001 = new TestAnonymousClassConstructor.InnerPublic(3L, 4) {// 33 + }; + }// 34 + + void innerStaticPublicString() { + TestAnonymousClassConstructor.InnerStaticPublicString var10001 = new TestAnonymousClassConstructor.InnerStaticPublicString("text") {// 37 + }; + }// 38 + + void innerStaticPublic() { + TestAnonymousClassConstructor.InnerStaticPublic var10001 = new TestAnonymousClassConstructor.InnerStaticPublic(3L, 4) {// 41 + }; + }// 42 + + static void innerStaticPublicStringStatic() { + TestAnonymousClassConstructor.InnerStaticPublicString var10001 = new TestAnonymousClassConstructor.InnerStaticPublicString("text") {// 45 + }; + }// 46 + + static void innerStaticPublicStatic() { + TestAnonymousClassConstructor.InnerStaticPublic var10001 = new TestAnonymousClassConstructor.InnerStaticPublic(3L, 4) {// 49 + }; + }// 50 + + static void n(String s) { + System.out.println("n(): " + s);// 53 + }// 54 + + static class InnerStaticPublic { + public InnerStaticPublic(long a, int b) { + TestAnonymousClassConstructor.n(a + "+" + b);// 100 + }// 101 + } + + static class InnerStaticPublicString { + public InnerStaticPublicString(String s) { + TestAnonymousClassConstructor.n(s);// 94 + }// 95 + } + + class InnerPublic { + public InnerPublic(long a, int b) { + TestAnonymousClassConstructor.n(a + "+" + b);// 88 + }// 89 + } + + class InnerPublicString { + public InnerPublicString(String s) { + TestAnonymousClassConstructor.n(s);// 82 + }// 83 + } + + static class InnerStaticPrivate { + private InnerStaticPrivate(long a, int b) { + TestAnonymousClassConstructor.n(a + "+" + b);// 76 + }// 77 + } + + static class InnerStaticPrivateString { + private InnerStaticPrivateString(String s) { + TestAnonymousClassConstructor.n(s);// 70 + }// 71 + } + + class InnerPrivate { + private InnerPrivate(long a, int b) { + TestAnonymousClassConstructor.n(a + "+" + b);// 64 + }// 65 + } + + class InnerPrivateString { + private InnerPrivateString(String s) { + TestAnonymousClassConstructor.n(s);// 58 + }// 59 + } +} + +class 'pkg/TestAnonymousClassConstructor' { + method 'innerPrivateString ()V' { + 5 4 + b 6 + } + + method 'innerPrivate ()V' { + 5 9 + 8 9 + d 11 + } + + method 'innerStaticPrivateString ()V' { + 5 14 + b 16 + } + + method 'innerStaticPrivate ()V' { + 5 19 + 8 19 + d 21 + } + + method 'innerStaticPrivateStringStatic ()V' { + 4 24 + a 26 + } + + method 'innerStaticPrivateStatic ()V' { + 4 29 + 7 29 + c 31 + } + + method 'innerPublicString ()V' { + 5 34 + b 36 + } + + method 'innerPublic ()V' { + 5 39 + 8 39 + d 41 + } + + method 'innerStaticPublicString ()V' { + 5 44 + b 46 + } + + method 'innerStaticPublic ()V' { + 5 49 + 8 49 + d 51 + } + + method 'innerStaticPublicStringStatic ()V' { + 4 54 + a 56 + } + + method 'innerStaticPublicStatic ()V' { + 4 59 + 7 59 + c 61 + } + + method 'n (Ljava/lang/String;)V' { + 0 64 + a 64 + 13 64 + 16 64 + 19 65 + } +} + +class 'pkg/TestAnonymousClassConstructor$InnerStaticPublic' { + method ' (JI)V' { + f 69 + 18 69 + 1b 69 + 1e 70 + } +} + +class 'pkg/TestAnonymousClassConstructor$InnerStaticPublicString' { + method ' (Ljava/lang/String;)V' { + 5 75 + 8 76 + } +} + +class 'pkg/TestAnonymousClassConstructor$InnerPublic' { + method ' (Lpkg/TestAnonymousClassConstructor;JI)V' { + 14 81 + 1e 81 + 21 81 + 24 82 + } +} + +class 'pkg/TestAnonymousClassConstructor$InnerPublicString' { + method ' (Lpkg/TestAnonymousClassConstructor;Ljava/lang/String;)V' { + a 87 + d 88 + } +} + +class 'pkg/TestAnonymousClassConstructor$InnerStaticPrivate' { + method ' (JI)V' { + f 93 + 18 93 + 1b 93 + 1e 94 + } +} + +class 'pkg/TestAnonymousClassConstructor$InnerStaticPrivateString' { + method ' (Ljava/lang/String;)V' { + 5 99 + 8 100 + } +} + +class 'pkg/TestAnonymousClassConstructor$InnerPrivate' { + method ' (Lpkg/TestAnonymousClassConstructor;JI)V' { + 14 105 + 1e 105 + 21 105 + 24 106 + } +} + +class 'pkg/TestAnonymousClassConstructor$InnerPrivateString' { + method ' (Lpkg/TestAnonymousClassConstructor;Ljava/lang/String;)V' { + a 111 + d 112 + } +} + +Lines mapping: +5 <-> 5 +6 <-> 7 +9 <-> 10 +10 <-> 12 +13 <-> 15 +14 <-> 17 +17 <-> 20 +18 <-> 22 +21 <-> 25 +22 <-> 27 +25 <-> 30 +26 <-> 32 +29 <-> 35 +30 <-> 37 +33 <-> 40 +34 <-> 42 +37 <-> 45 +38 <-> 47 +41 <-> 50 +42 <-> 52 +45 <-> 55 +46 <-> 57 +49 <-> 60 +50 <-> 62 +53 <-> 65 +54 <-> 66 +58 <-> 112 +59 <-> 113 +64 <-> 106 +65 <-> 107 +70 <-> 100 +71 <-> 101 +76 <-> 94 +77 <-> 95 +82 <-> 88 +83 <-> 89 +88 <-> 82 +89 <-> 83 +94 <-> 76 +95 <-> 77 +100 <-> 70 +101 <-> 71 +Not mapped: +57 +63 +69 +75 +81 +87 +93 +99 diff --git a/testData/results/TestAnonymousParamNames.dec b/testData/results/TestAnonymousParamNames.dec new file mode 100644 index 0000000..810799c --- /dev/null +++ b/testData/results/TestAnonymousParamNames.dec @@ -0,0 +1,22 @@ +package pkg; + +public class TestAnonymousParamNames { + private final TestAnonymousParamNames.Clazz reference = new TestAnonymousParamNames.Clazz(0L, false) { + }; + + private class Clazz { + public Clazz(long paramL, boolean paramB) { + }// 25 + } +} + +class 'pkg/TestAnonymousParamNames$Clazz' { + method ' (Lpkg/TestAnonymousParamNames;JZ)V' { + 9 8 + } +} + +Lines mapping: +25 <-> 9 +Not mapped: +24 diff --git a/testData/src/pkg/TestAnonymousClassConstructor.java b/testData/src/pkg/TestAnonymousClassConstructor.java new file mode 100644 index 0000000..5104b50 --- /dev/null +++ b/testData/src/pkg/TestAnonymousClassConstructor.java @@ -0,0 +1,103 @@ +package pkg; + +class TestAnonymousClassConstructor { + void innerPrivateString() { + new InnerPrivateString("text"){}; + } + + void innerPrivate() { + new InnerPrivate(3, 4){}; + } + + void innerStaticPrivateString() { + new InnerStaticPrivateString("text"){}; + } + + void innerStaticPrivate() { + new InnerStaticPrivate(3, 4){}; + } + + static void innerStaticPrivateStringStatic() { + new InnerStaticPrivateString("text"){}; + } + + static void innerStaticPrivateStatic() { + new InnerStaticPrivate(3, 4){}; + } + + void innerPublicString() { + new InnerPublicString("text"){}; + } + + void innerPublic() { + new InnerPublic(3, 4){}; + } + + void innerStaticPublicString() { + new InnerStaticPublicString("text"){}; + } + + void innerStaticPublic() { + new InnerStaticPublic(3, 4){}; + } + + static void innerStaticPublicStringStatic() { + new InnerStaticPublicString("text"){}; + } + + static void innerStaticPublicStatic() { + new InnerStaticPublic(3, 4){}; + } + + static void n(String s) { + System.out.println("n(): " + s); + } + + class InnerPrivateString { + private InnerPrivateString(String s) { + n(s); + } + } + + class InnerPrivate { + private InnerPrivate(long a, int b) { + n(a + "+" + b); + } + } + + static class InnerStaticPrivateString { + private InnerStaticPrivateString(String s) { + n(s); + } + } + + static class InnerStaticPrivate { + private InnerStaticPrivate(long a, int b) { + n(a + "+" + b); + } + } + + class InnerPublicString { + public InnerPublicString(String s) { + n(s); + } + } + + class InnerPublic { + public InnerPublic(long a, int b) { + n(a + "+" + b); + } + } + + static class InnerStaticPublicString { + public InnerStaticPublicString(String s) { + n(s); + } + } + + static class InnerStaticPublic { + public InnerStaticPublic(long a, int b) { + n(a + "+" + b); + } + } +} diff --git a/testData/src/pkg/TestAnonymousParamNames.java b/testData/src/pkg/TestAnonymousParamNames.java new file mode 100644 index 0000000..5c83de9 --- /dev/null +++ b/testData/src/pkg/TestAnonymousParamNames.java @@ -0,0 +1,27 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package pkg; + +import java.io.File; + +public class TestAnonymousParamNames { + private final Clazz reference = new Clazz(0, false) {}; + + private class Clazz { + public Clazz(long paramL, boolean paramB) { + } + } +}