IDEA-130477 Instance creation of local inner class within static method is not decompiled correctly
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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"); }
|
||||
}
|
||||
|
||||
BIN
testData/classes/pkg/TestInnerLocal$1Inner.class
Normal file
BIN
testData/classes/pkg/TestInnerLocal$1Inner.class
Normal file
Binary file not shown.
BIN
testData/classes/pkg/TestInnerLocal$2Inner.class
Normal file
BIN
testData/classes/pkg/TestInnerLocal$2Inner.class
Normal file
Binary file not shown.
BIN
testData/classes/pkg/TestInnerLocal$Inner1.class
Normal file
BIN
testData/classes/pkg/TestInnerLocal$Inner1.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
testData/classes/pkg/TestInnerLocal$Inner1Static.class
Normal file
BIN
testData/classes/pkg/TestInnerLocal$Inner1Static.class
Normal file
Binary file not shown.
BIN
testData/classes/pkg/TestInnerLocal.class
Normal file
BIN
testData/classes/pkg/TestInnerLocal.class
Normal file
Binary file not shown.
98
testData/results/TestInnerLocal.dec
Normal file
98
testData/results/TestInnerLocal.dec
Normal 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
|
||||
63
testData/src/pkg/TestInnerLocal.java
Normal file
63
testData/src/pkg/TestInnerLocal.java
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user