From c254ddd8f20164664a381ccf51c37145a9cd451f Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 16 Jan 2015 20:46:57 +0300 Subject: [PATCH] IDEA-130477 Instance creation of local inner class within static method is not decompiled correctly --- .../modules/decompiler/exps/NewExprent.java | 5 +- .../java/decompiler/SingleClassesTest.java | 3 +- .../classes/pkg/TestInnerLocal$1Inner.class | Bin 0 -> 400 bytes .../classes/pkg/TestInnerLocal$2Inner.class | Bin 0 -> 461 bytes .../classes/pkg/TestInnerLocal$Inner1.class | Bin 0 -> 416 bytes ...InnerLocal$Inner1Static$Inner2Static.class | Bin 0 -> 430 bytes .../pkg/TestInnerLocal$Inner1Static.class | Bin 0 -> 430 bytes testData/classes/pkg/TestInnerLocal.class | Bin 0 -> 640 bytes testData/results/TestInnerLocal.dec | 98 ++++++++++++++++++ testData/src/pkg/TestInnerLocal.java | 63 +++++++++++ 10 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 testData/classes/pkg/TestInnerLocal$1Inner.class create mode 100644 testData/classes/pkg/TestInnerLocal$2Inner.class create mode 100644 testData/classes/pkg/TestInnerLocal$Inner1.class create mode 100644 testData/classes/pkg/TestInnerLocal$Inner1Static$Inner2Static.class create mode 100644 testData/classes/pkg/TestInnerLocal$Inner1Static.class create mode 100644 testData/classes/pkg/TestInnerLocal.class create mode 100644 testData/results/TestInnerLocal.dec create mode 100644 testData/src/pkg/TestInnerLocal.java 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 ba23463..a143828 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -389,7 +389,8 @@ public class NewExprent extends Exprent { private static String getQualifiedNewInstance(String classname, List lstParams, int indent, BytecodeMappingTracer tracer) { ClassNode node = DecompilerContext.getClassProcessor().getMapRootClasses().get(classname); - if (node != null && node.type != ClassNode.CLASS_ROOT && (node.access & CodeConstants.ACC_STATIC) == 0) { + if (node != null && node.type != ClassNode.CLASS_ROOT && node.type != ClassNode.CLASS_LOCAL + && (node.access & CodeConstants.ACC_STATIC) == 0) { if (!lstParams.isEmpty()) { Exprent enclosing = lstParams.get(0); diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java index 8a51c72..62fef0a 100644 --- a/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -57,4 +57,5 @@ public class SingleClassesTest extends SingleClassesTestBase { @Test public void testLocalClass() { doTest("pkg/TestLocalClass"); } @Test public void testAnonymousClass() { doTest("pkg/TestAnonymousClass"); } @Test public void testThrowException() { doTest("pkg/TestThrowException"); } + @Test public void testInnerLocal() { doTest("pkg/TestInnerLocal"); } } diff --git a/testData/classes/pkg/TestInnerLocal$1Inner.class b/testData/classes/pkg/TestInnerLocal$1Inner.class new file mode 100644 index 0000000000000000000000000000000000000000..61aecb2cd131bd3b320f5a681ec63ca71c2dff03 GIT binary patch literal 400 zcmZWlO-sW-5Pg%Tjg7Ibt!ee*f@gFnC@ zB~GFsMHc4sy?L|q`L+1~Fu{=v8=WR<*mux%;1lSD&<$7OS&UPmm*dFfN-r-6jZ3AK zxgz+(|LxJ7U{AA!B(y`N<^B38mibJ?DOcPmTjz-fE%Pu-M0!>#G3i<- zX;!e(oivZx!a?7|0EZr&($vvl-EHQ{c{PPl|Mgzwr>Q6kSr9sZe|U&jGBJeK_5{Wl zUM4casN_eNP#ccsIOdDkd?7}Z+Eqln$_`hWoCUD>0dDXP3Qpf(y;c~PZHu{p&-^}P Z2b}G4Zo$JIdz<@h9B}0FtPK_%`u@37`>U+-ckpO-!mTAnZ%Ifs%Tgv=`%VxgaJk`~W}7 zIJcS@bTf12dCtto=i57gbLpT+Ir&uGYaB{w0f9Wb1I$ z<_?2>xpg!HwO)~H9nWCAWQ|K~OIdl3NB0>Ya8%-K4rN{pCRs)W>x^t(XtG}ez5u~I BVetR} literal 0 HcmV?d00001 diff --git a/testData/classes/pkg/TestInnerLocal$Inner1.class b/testData/classes/pkg/TestInnerLocal$Inner1.class new file mode 100644 index 0000000000000000000000000000000000000000..145dc8921152824e2511bb4ca158d8be4c02c3e1 GIT binary patch literal 416 zcmZWlO-sW-5Ph4Zjg2vht@Z2Vp+b$?D0ox66a*pYp~d?qE_F+~fg~0GmWLvE@CW## z#MyvI^fL2i=FQBT`TTnS0C0i*4lD!?TG-U6Yh%mC4g-5(=*DyY%%hB}Sv08%sb-f9 z?dnOEgENL8o{F-%RZ0|bp7KoBuB4LHHN)ZXZ}I=AqX!0SoIeT%KbA_|EfraZ|g z<4p2pk%}9sgI;sdNUL(OhK>sdyDr+WZR|1ho4i4-?VM!&0JjF?jF+V->4M+$?vuGl zD+Y6@WqHj(IH1q8=v@W^y$lEfy`D1kDAKS_)}<&ShDqKJk5^#f8;tN|1@pBgZjklr Y@+q~B2y41WSpz<{$vZU0LJxi58}`drh5!Hn literal 0 HcmV?d00001 diff --git a/testData/classes/pkg/TestInnerLocal$Inner1Static$Inner2Static.class b/testData/classes/pkg/TestInnerLocal$Inner1Static$Inner2Static.class new file mode 100644 index 0000000000000000000000000000000000000000..b2262f5d6be86dd25b5045a82610851c045a9288 GIT binary patch literal 430 zcmaKo&q~8U5XQerVq;=VV`}|_C&5FSf<^IUiUB`1ygEUZM8#7j6|0>SznTj4krWhu)Qev6%-sqUh=j4Oib^`<%w z2uJ_)B-raw9P`FB-XOuLf8AKbLu|6gVDh2x0ZjiDAV50y4 literal 0 HcmV?d00001 diff --git a/testData/classes/pkg/TestInnerLocal$Inner1Static.class b/testData/classes/pkg/TestInnerLocal$Inner1Static.class new file mode 100644 index 0000000000000000000000000000000000000000..f82d0eaadde560b79db1d24526dac28bd8608039 GIT binary patch literal 430 zcmaJ-O-sW-6r4?B)5Mt8)cS!J4<2F)7Dc@%UJ8N`^pN6x6PL0jZXwxe0v9Qf*ltY)*YA#Y;4#VGI-ZYiQ*{HT+6JXlbn~OC~a&u zmE%Uho*067&L8N-=r$asEO{p4X4TOJ&^Hntgd+miiu2mRk{x9MDDnj!qh@a_I- z&kU=me%pXOnwUisWaw8ZYQ!j%N0l{V5e!;@8@+->qZb&@wZ^C2CvP=-3#a5gBVCWU UK`(Xa3<#MRUPt@rLn2Vq#MD0MT$PWrHQyChg+?@?;{3KfoVl zoGpqexXJG9%)IwzGP|E&?;ijzaGF32dn)#0C?pWVfr?@R3Q8&tRUD}}X3%bIo4f74 zFob3Py1kjJX1GbCha<@BAoYw~MLf^!4P_yu&wG-l^h~#FRHN z9Umi;6^2w$fI5@vt(jp@TKA(VHw8m6h^hMg)l}A7SZ1kgUH_Bn3)iwIT{)9lT@UJY z|HGjSl^#g0Fld6v(78=snJgo#G~d8p>B5kuQ$8UG5J3lV (Ljava/lang/String;)V' { + 6 6 + } +} + +class 'TestInnerLocal' { + method 'testStaticMethod ()V' { + 4 10 + } + + method 'testMethod ()V' { + 5 22 + } +} + +class 'TestInnerLocal$2Inner' { + method ' (LTestInnerLocal;Ljava/lang/String;)V' { + b 18 + } +} + +class 'TestInnerLocal$Inner1Static' { + method ' (Ljava/lang/String;)V' { + 6 29 + } +} + +class 'TestInnerLocal$Inner1Static$Inner2Static' { + method ' (Ljava/lang/String;)V' { + 6 36 + } +} + +class 'TestInnerLocal$Inner1' { + method ' (LTestInnerLocal;Ljava/lang/String;)V' { + b 45 + } +} + +Lines mapping: +22 <-> 7 +25 <-> 11 +34 <-> 19 +37 <-> 23 +46 <-> 46 +53 <-> 30 +59 <-> 37 diff --git a/testData/src/pkg/TestInnerLocal.java b/testData/src/pkg/TestInnerLocal.java new file mode 100644 index 0000000..8eb8952 --- /dev/null +++ b/testData/src/pkg/TestInnerLocal.java @@ -0,0 +1,63 @@ +/* + * Copyright 2000-2014 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. + */ + +public class TestInnerLocal { + public static void testStaticMethod() { + class Inner { + final String x; + public Inner(String x) { + this.x = x; + } + } + new Inner("test"); + //new Inner1Static("test"); + //new Inner1Static.Inner2Static("test"); + } + + public void testMethod() { + class Inner { + final String x; + public Inner(String x) { + this.x = x; + } + } + new Inner("test"); + //new Inner1Static("test"); + //new Inner1("test"); + //new Inner1Static.Inner2Static("test"); + } + + class Inner1 { + final String x; + public Inner1(String x) { + this.x = x; + } + } + + static class Inner1Static { + final String x; + public Inner1Static(String x) { + this.x = x; + } + + public static class Inner2Static { + final String x; + public Inner2Static(String x) { + this.x = x; + } + } + } +} \ No newline at end of file