From 8c440e281c8c454bee8aa4779fe042051c996f14 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Wed, 26 Apr 2017 13:26:10 +0300 Subject: [PATCH] fixed incorrect constructor method reference --- .../java/decompiler/main/ClassWriter.java | 4 +-- .../java/decompiler/SingleClassesTest.java | 1 + .../pkg/TestConstructorReference.class | Bin 0 -> 898 bytes testData/results/TestConstructorReference.dec | 16 ++++++++++++ .../src/pkg/TestConstructorReference.java | 24 ++++++++++++++++++ 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 testData/classes/pkg/TestConstructorReference.class create mode 100644 testData/results/TestConstructorReference.dec create mode 100644 testData/src/pkg/TestConstructorReference.java diff --git a/src/org/jetbrains/java/decompiler/main/ClassWriter.java b/src/org/jetbrains/java/decompiler/main/ClassWriter.java index 6233efe..b7b8fb4 100644 --- a/src/org/jetbrains/java/decompiler/main/ClassWriter.java +++ b/src/org/jetbrains/java/decompiler/main/ClassWriter.java @@ -98,8 +98,8 @@ public class ClassWriter { buffer.append(ExprProcessor.getCastTypeName(new VarType(node.lambdaInformation.content_class_name, true))); } - buffer.append("::"); - buffer.append(node.lambdaInformation.content_method_name); + buffer.append("::") + .append(CodeConstants.INIT_NAME.equals(node.lambdaInformation.content_method_name) ? "new" : node.lambdaInformation.content_method_name); } else { // lambda method diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java index 505fe81..fdaa6d0 100644 --- a/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -86,6 +86,7 @@ public class SingleClassesTest { @Test public void testJava9StringConcat() { doTest("java9/TestJava9StringConcat"); } @Test public void testMethodReferenceSameName() { doTest("pkg/TestMethodReferenceSameName"); } @Test public void testMethodReferenceLetterClass() { doTest("pkg/TestMethodReferenceLetterClass"); } + @Test public void testConstructorReference() { doTest("pkg/TestConstructorReference"); } @Test public void testMemberAnnotations() { doTest("pkg/TestMemberAnnotations"); } @Test public void testMoreAnnotations() { doTest("pkg/MoreAnnotations"); } @Test public void testTypeAnnotations() { doTest("pkg/TypeAnnotations"); } diff --git a/testData/classes/pkg/TestConstructorReference.class b/testData/classes/pkg/TestConstructorReference.class new file mode 100644 index 0000000000000000000000000000000000000000..c5ba7dfb1e29dfb6e0c2cfc1f1f95f7ed075ed56 GIT binary patch literal 898 zcmbVKTTc@~6#j;mE-tGrrIw2Vf?SFZ_CeojG_i@%WW|Iwyw7eAu&|wJW@j<{ET2qx z@CO)wlkp5&)2hIOFLUOc`7US9%=e#H-vGQs%SRatb>25UEO}TKsJu#4VqXiCTKh)= z<*pu(Ks8Jh9puA^OkYMRSL&gTWqKq{;_`8^Y)_L+U^VPhX1iKt*5t9(=8%rbkcz3p zx{=nbD-Y32K6rE9QeXL>KM+pnuu*sD`v$cOyuO2o6Ji)fW z)85ZgFh87R9(H-$q1Na5NFey26q#-+vy6CzKU!06W4+>L z@1+`~lx-Kp&J?U?O`=YwD}NCCmm~VW!@}}z?(}rVwq2Q~y~I+-!=Av-Kl8ciJ_74^ zP%V0J>CTci0kv5x%{`l8$NMZ y@5+VnZ;2)Ym#!t61#B$g==bq}*Al8spFs^zIr?1L#16Kw!uEynB4ZkOh{i7n8{@D5 literal 0 HcmV?d00001 diff --git a/testData/results/TestConstructorReference.dec b/testData/results/TestConstructorReference.dec new file mode 100644 index 0000000..ee2a50d --- /dev/null +++ b/testData/results/TestConstructorReference.dec @@ -0,0 +1,16 @@ +public class TestConstructorReference { + void boo() { + Runnable aNew = TestConstructorReference::new;// 22 + }// 23 +} + +class 'TestConstructorReference' { + method 'boo ()V' { + 5 2 + 6 3 + } +} + +Lines mapping: +22 <-> 3 +23 <-> 4 diff --git a/testData/src/pkg/TestConstructorReference.java b/testData/src/pkg/TestConstructorReference.java new file mode 100644 index 0000000..fd8b483 --- /dev/null +++ b/testData/src/pkg/TestConstructorReference.java @@ -0,0 +1,24 @@ +/* + * Copyright 2000-2016 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 TestConstructorReference { + public TestConstructorReference() { + } + + void boo() { + Runnable aNew = TestConstructorReference::new; + } +}