From 6889e7435a582356b8cb8268caf6fdd5a4de0a0c Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 14 Oct 2014 18:32:15 +0200 Subject: [PATCH] EA-41231 (omit synthetic inner class constructor parameter) --- .../java/decompiler/main/ClassWriter.java | 2 +- .../decompiler/main/ClassesProcessor.java | 1 + .../main/rels/NestedClassProcessor.java | 1 + .../modules/decompiler/exps/NewExprent.java | 21 +++++++++++++----- .../java/decompiler/SingleClassesTest.java | 2 ++ .../pkg/TestInnerClassConstructor$1.class | Bin 0 -> 234 bytes .../pkg/TestInnerClassConstructor$Inner.class | Bin 0 -> 671 bytes .../pkg/TestInnerClassConstructor.class | Bin 0 -> 886 bytes .../v11/TestInnerClassConstructor$1.class | Bin 0 -> 206 bytes .../v11/TestInnerClassConstructor$Inner.class | Bin 0 -> 695 bytes .../v11/TestInnerClassConstructor.class | Bin 0 -> 880 bytes .../results/TestInnerClassConstructor.dec | 17 ++++++++++++++ .../src/pkg/TestInnerClassConstructor.java | 17 ++++++++++++++ 13 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 testData/classes/pkg/TestInnerClassConstructor$1.class create mode 100644 testData/classes/pkg/TestInnerClassConstructor$Inner.class create mode 100644 testData/classes/pkg/TestInnerClassConstructor.class create mode 100644 testData/classes/v11/TestInnerClassConstructor$1.class create mode 100644 testData/classes/v11/TestInnerClassConstructor$Inner.class create mode 100644 testData/classes/v11/TestInnerClassConstructor.class create mode 100644 testData/results/TestInnerClassConstructor.dec create mode 100644 testData/src/pkg/TestInnerClassConstructor.java diff --git a/src/org/jetbrains/java/decompiler/main/ClassWriter.java b/src/org/jetbrains/java/decompiler/main/ClassWriter.java index 6de5933..9a1e7aa 100644 --- a/src/org/jetbrains/java/decompiler/main/ClassWriter.java +++ b/src/org/jetbrains/java/decompiler/main/ClassWriter.java @@ -250,7 +250,7 @@ public class ClassWriter { for (ClassNode inner : node.nested) { if (inner.type == ClassNode.CLASS_MEMBER) { StructClass innerCl = inner.classStruct; - boolean isSynthetic = (inner.access & CodeConstants.ACC_SYNTHETIC) != 0 || innerCl.isSynthetic(); + boolean isSynthetic = (inner.access & CodeConstants.ACC_SYNTHETIC) != 0 || innerCl.isSynthetic() || inner.namelessConstructorStub; boolean hide = isSynthetic && DecompilerContext.getOption(IFernflowerPreferences.REMOVE_SYNTHETIC) || wrapper.getHiddenMembers().contains(innerCl.qualifiedName); if (hide) continue; diff --git a/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java b/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java index 32470e0..458ed55 100644 --- a/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java +++ b/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java @@ -359,6 +359,7 @@ public class ClassesProcessor { public Set enclosingClasses = new HashSet(); public ClassNode parent; public LambdaInformation lambdaInformation; + public boolean namelessConstructorStub = false; public ClassNode(String content_class_name, String content_method_name, diff --git a/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java b/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java index 6218319..0858e80 100644 --- a/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java +++ b/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java @@ -79,6 +79,7 @@ public class NestedClassProcessor { DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN); child.simpleName = "NamelessClass_" + (++nameless); } + child.namelessConstructorStub = !cl.hasModifier(CodeConstants.ACC_STATIC) && cl.getMethods().size() + cl.getFields().size() == 0; } } 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 4fa62c6..543c0ad 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java @@ -311,20 +311,31 @@ public class NewExprent extends Exprent { if (!enumconst || start < lstParameters.size()) { buf.append("("); - boolean firstpar = true; + boolean firstParam = true; for (int i = start; i < lstParameters.size(); i++) { if (sigFields == null || sigFields.get(i) == null) { - if (!firstpar) { + Exprent expr = lstParameters.get(i); + VarType leftType = constructor.getDescriptor().params[i]; + + if (i == lstParameters.size() - 1 && expr.getExprType() == VarType.VARTYPE_NULL) { + ClassNode node = DecompilerContext.getClassProcessor().getMapRootClasses().get(leftType.value); + if (node != null && node.namelessConstructorStub) { + break; // skip last parameter of synthetic constructor call + } + } + + if (!firstParam) { buf.append(", "); } TextBuffer buff = new TextBuffer(); - ExprProcessor.getCastedExprent(lstParameters.get(i), constructor.getDescriptor().params[i], buff, indent, true, tracer); - + ExprProcessor.getCastedExprent(expr, leftType, buff, indent, true, tracer); buf.append(buff); - firstpar = false; + + firstParam = false; } } + buf.append(")"); } } diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java index 73af499..f0de32d 100644 --- a/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -34,4 +34,6 @@ public class SingleClassesTest extends SingleClassesTestBase { @Test public void testEnum() { doTest("pkg/TestEnum"); } @Test public void testDebugSymbols() { doTest("pkg/TestDebugSymbols"); } @Test public void testInvalidMethodSignature() { doTest("InvalidMethodSignature"); } + @Test public void testInnerClassConstructor() { doTest("pkg/TestInnerClassConstructor"); } + @Test public void testInnerClassConstructor11() { doTest("v11/TestInnerClassConstructor"); } } diff --git a/testData/classes/pkg/TestInnerClassConstructor$1.class b/testData/classes/pkg/TestInnerClassConstructor$1.class new file mode 100644 index 0000000000000000000000000000000000000000..384ce5d4577bd4552a2b6956d2ae76ecf26ffa18 GIT binary patch literal 234 zcmaKmO$x#=5QX1pHChFG0e=>*E#eW1f(vn>7l<*`){;n)dN>yzz(a}Cl`Eac%aEq{-9$snjYE#(y!%j3F)ly{R?}>>_k{N9gkG LbH{u`jZ1nTu2MZO literal 0 HcmV?d00001 diff --git a/testData/classes/pkg/TestInnerClassConstructor$Inner.class b/testData/classes/pkg/TestInnerClassConstructor$Inner.class new file mode 100644 index 0000000000000000000000000000000000000000..37e92629907b5c97760be98960d92073855dad75 GIT binary patch literal 671 zcmb7CO;5r=5PefV3boLRf}eni91w_w=ndnA#KeT?0rXyQgT=ZvZSjA3P!bRR0DqKm zN=Ue9joD;pCiC9zytn)L_5K0i1P2;Y*vRs>sUeM`h7z_^Y^&HMq{DkBsI>{z{?o(6 z8j2vilv4OT*A9Z7Cxg(RjYH4xGW5)mPIyi@t^a}TPwi*ha&0-W2BGiBN%!cMknDMP zf?)I=DXwOZBjFG2ktb=pQ)mNk=8wgN13^3x2?;3zq!dseo#Yg`IOoW|AoyAE zkVsVG2k@g1du~M`fmpiRwKcOlp4}fmzkLVr5RYsuVavo#3)?nw*ePKbRTFzQirBJn zOUHeE)ok3x9TRs=xF$RT2+m6>Mbe6bG!-eq$X*G>r=bkhGeX|=-Vq9|xGxCT+MyJ$ z#>1{ij)QK*Uueij5?0;zY49=dqd*S)j!Hr~XlkO}iN{G#ya+XT=UAlbvR^BfsY=E@ z6(>iU?4W{W!v5&P!2d6@b|J8!#3!X0brS~;?%|NIHY?%zIE?xt;op+3_oV9J2)={+ zXqb55uyyN%?S+g^xi&YQKEP-|pv{voFGIaPwq&&Oky zw0d4JjQuxkz2X6gVA$j_2BVRXeZt|t<};__!Y?LTDn6egVa4_4fQ(qqjQP7G!5r!S zkwg^^ucdzSe0Z?DYb%`Xapc8=QJ;doaKhsG){Cp51*QQve#1Q&8GPvsxs!S&Pg4}$ z&(aJg6`8h%bq4D$kGYgCxcL>v8Hy)Um=$Y+(gB|d>~wvc>QoFF85kHDco2r97BeykfOPBUB<7{-`zK|k mCYLZW$l^7IK>=t869WV=0bR@hhuE_a!-|DCatWTTT3Exni47B5gt!{IL9tFKwC`^R zwXO)%xs<|hc}@_t#xhX;q_4()laS~R;p+dFgsUnxW-6@Cc;ffPnd`BZ zonLD|(k0liu&9T;4HF9{c5D=|OV|(ftvIWM5c|T++>XoMNc0suAAUfCV3f3H`Otj? zl7w98C%;kWcaK9mo7LhO6C42%?p&63oTC~?24lKBMWkGLhEb`$Ao|2hgd~rtSvtw& w6!$c*SXg3`CKostWi-o`>J&65#hDD=@_l2LqX?FfVa)O@#otl47~>`~pPwtJlmGw# literal 0 HcmV?d00001 diff --git a/testData/classes/v11/TestInnerClassConstructor.class b/testData/classes/v11/TestInnerClassConstructor.class new file mode 100644 index 0000000000000000000000000000000000000000..9cbad7f8e6e0ca2762bab8a9b4aae003965c3e4e GIT binary patch literal 880 zcmaJzJ7y&13a>@ge?;{3#eGgV7rJNR88EnkjGX5 zw{_grkD7%$xNG8`3CDy>0KtAKrHEPsKaNFA$fd7@{L?@N>KVas+_!{mD?Am1YwbXa zqh#0>(Xrnh@C^-lOTwztKKDQP-oTfAucM+s_M4h$b;2a-i5GzeZy$?T&GcHKj8&BM zR2Us~Beeb`>+OGn$N_4*El(7G=_RLi=wTpQL6;69dSaIAr93z%fU;Y*(m?JGe zkf_4uq14OZ&28mLTj5iMBaa<&^$F-RAGmgY=F>|JUHc7nkxOrvE|58?mkpXA`))?j zlg@cqC(rQ)))}l79