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 0000000..c5ba7df Binary files /dev/null and b/testData/classes/pkg/TestConstructorReference.class differ 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; + } +}