IDEA-130477 Instance creation of local inner class within static method is not decompiled correctly

This commit is contained in:
Egor.Ushakov
2015-01-16 20:46:57 +03:00
parent 62b876af25
commit c254ddd8f2
10 changed files with 166 additions and 3 deletions

View File

@@ -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<Exprent> 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);

View File

@@ -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"); }
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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 '<init> (Ljava/lang/String;)V' {
6 6
}
}
class 'TestInnerLocal' {
method 'testStaticMethod ()V' {
4 10
}
method 'testMethod ()V' {
5 22
}
}
class 'TestInnerLocal$2Inner' {
method '<init> (LTestInnerLocal;Ljava/lang/String;)V' {
b 18
}
}
class 'TestInnerLocal$Inner1Static' {
method '<init> (Ljava/lang/String;)V' {
6 29
}
}
class 'TestInnerLocal$Inner1Static$Inner2Static' {
method '<init> (Ljava/lang/String;)V' {
6 36
}
}
class 'TestInnerLocal$Inner1' {
method '<init> (LTestInnerLocal;Ljava/lang/String;)V' {
b 45
}
}
Lines mapping:
22 <-> 7
25 <-> 11
34 <-> 19
37 <-> 23
46 <-> 46
53 <-> 30
59 <-> 37

View File

@@ -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;
}
}
}
}