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

master
Egor.Ushakov 10 years ago
parent 62b876af25
commit c254ddd8f2
  1. 5
      src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java
  2. 3
      test/org/jetbrains/java/decompiler/SingleClassesTest.java
  3. BIN
      testData/classes/pkg/TestInnerLocal$1Inner.class
  4. BIN
      testData/classes/pkg/TestInnerLocal$2Inner.class
  5. BIN
      testData/classes/pkg/TestInnerLocal$Inner1.class
  6. BIN
      testData/classes/pkg/TestInnerLocal$Inner1Static$Inner2Static.class
  7. BIN
      testData/classes/pkg/TestInnerLocal$Inner1Static.class
  8. BIN
      testData/classes/pkg/TestInnerLocal.class
  9. 98
      testData/results/TestInnerLocal.dec
  10. 63
      testData/src/pkg/TestInnerLocal.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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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) { private static String getQualifiedNewInstance(String classname, List<Exprent> lstParams, int indent, BytecodeMappingTracer tracer) {
ClassNode node = DecompilerContext.getClassProcessor().getMapRootClasses().get(classname); 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()) { if (!lstParams.isEmpty()) {
Exprent enclosing = lstParams.get(0); Exprent enclosing = lstParams.get(0);

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 testLocalClass() { doTest("pkg/TestLocalClass"); }
@Test public void testAnonymousClass() { doTest("pkg/TestAnonymousClass"); } @Test public void testAnonymousClass() { doTest("pkg/TestAnonymousClass"); }
@Test public void testThrowException() { doTest("pkg/TestThrowException"); } @Test public void testThrowException() { doTest("pkg/TestThrowException"); }
@Test public void testInnerLocal() { doTest("pkg/TestInnerLocal"); }
} }

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

@ -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;
}
}
}
}
Loading…
Cancel
Save