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 0000000..61aecb2 Binary files /dev/null and b/testData/classes/pkg/TestInnerLocal$1Inner.class differ diff --git a/testData/classes/pkg/TestInnerLocal$2Inner.class b/testData/classes/pkg/TestInnerLocal$2Inner.class new file mode 100644 index 0000000..87289e1 Binary files /dev/null and b/testData/classes/pkg/TestInnerLocal$2Inner.class differ diff --git a/testData/classes/pkg/TestInnerLocal$Inner1.class b/testData/classes/pkg/TestInnerLocal$Inner1.class new file mode 100644 index 0000000..145dc89 Binary files /dev/null and b/testData/classes/pkg/TestInnerLocal$Inner1.class differ diff --git a/testData/classes/pkg/TestInnerLocal$Inner1Static$Inner2Static.class b/testData/classes/pkg/TestInnerLocal$Inner1Static$Inner2Static.class new file mode 100644 index 0000000..b2262f5 Binary files /dev/null and b/testData/classes/pkg/TestInnerLocal$Inner1Static$Inner2Static.class differ diff --git a/testData/classes/pkg/TestInnerLocal$Inner1Static.class b/testData/classes/pkg/TestInnerLocal$Inner1Static.class new file mode 100644 index 0000000..f82d0ea Binary files /dev/null and b/testData/classes/pkg/TestInnerLocal$Inner1Static.class differ diff --git a/testData/classes/pkg/TestInnerLocal.class b/testData/classes/pkg/TestInnerLocal.class new file mode 100644 index 0000000..c939b5e Binary files /dev/null and b/testData/classes/pkg/TestInnerLocal.class differ diff --git a/testData/results/TestInnerLocal.dec b/testData/results/TestInnerLocal.dec new file mode 100644 index 0000000..3ba0724 --- /dev/null +++ b/testData/results/TestInnerLocal.dec @@ -0,0 +1,98 @@ +public class TestInnerLocal { + public static void testStaticMethod() { + class Inner { + final String x; + + public Inner(String var1) { + this.x = var1;// 22 + } + } + + new Inner("test");// 25 + } + + public void testMethod() { + class Inner { + final String x; + + public Inner(String var2) { + this.x = var2;// 34 + } + } + + new Inner("test");// 37 + } + + static class Inner1Static { + final String x; + + public Inner1Static(String var1) { + this.x = var1;// 53 + } + + public static class Inner2Static { + final String x; + + public Inner2Static(String var1) { + this.x = var1;// 59 + } + } + } + + class Inner1 { + final String x; + + public Inner1(String var2) { + this.x = var2;// 46 + } + } +} + +class 'TestInnerLocal$1Inner' { + method ' (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