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