decompiler: fixed incorrect method references from single letter classes
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Wed, 2 Mar 2016 17:44:56 +0000 (20:44 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Wed, 2 Mar 2016 17:45:46 +0000 (20:45 +0300)
plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/ClassWriter.java
plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTest.java
plugins/java-decompiler/engine/testData/classes/pkg/R.class [new file with mode: 0644]
plugins/java-decompiler/engine/testData/classes/pkg/TestMethodReferenceLetterClass.class [new file with mode: 0644]
plugins/java-decompiler/engine/testData/results/TestMethodReferenceLetterClass.dec [new file with mode: 0644]
plugins/java-decompiler/engine/testData/src/pkg/TestMethodReferenceLetterClass.java [new file with mode: 0644]

index b55f29d7578f8eb50f43690262f57284d1850333..dc0f3fcaa32b7d5ac413f47b4b2004a3183846b4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2015 JetBrains s.r.o.
+ * 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.
@@ -98,7 +98,7 @@ public class ClassWriter {
         }
         else {
           // reference to a static method
-          buffer.append(ExprProcessor.getCastTypeName(new VarType(node.lambdaInformation.content_class_name, false)));
+          buffer.append(ExprProcessor.getCastTypeName(new VarType(node.lambdaInformation.content_class_name, true)));
         }
 
         buffer.append("::");
index 6ef71c0f307d73d0c3a27064578ae1d10026a4a2..e3a6f56a797959002ba5cf2aabe7305f32639638 100644 (file)
@@ -80,6 +80,7 @@ public class SingleClassesTest {
   @Test public void testStringConcat() { doTest("pkg/TestStringConcat"); }
   @Test public void testJava9StringConcat() { doTest("java9/TestJava9StringConcat"); }
   @Test public void testMethodReferenceSameName() { doTest("pkg/TestMethodReferenceSameName"); }
+  @Test public void testMethodReferenceLetterClass() { doTest("pkg/TestMethodReferenceLetterClass"); }
 
   protected void doTest(String testFile, String... companionFiles) {
     ConsoleDecompiler decompiler = fixture.getDecompiler();
diff --git a/plugins/java-decompiler/engine/testData/classes/pkg/R.class b/plugins/java-decompiler/engine/testData/classes/pkg/R.class
new file mode 100644 (file)
index 0000000..7c9c9e2
Binary files /dev/null and b/plugins/java-decompiler/engine/testData/classes/pkg/R.class differ
diff --git a/plugins/java-decompiler/engine/testData/classes/pkg/TestMethodReferenceLetterClass.class b/plugins/java-decompiler/engine/testData/classes/pkg/TestMethodReferenceLetterClass.class
new file mode 100644 (file)
index 0000000..74bb32d
Binary files /dev/null and b/plugins/java-decompiler/engine/testData/classes/pkg/TestMethodReferenceLetterClass.class differ
diff --git a/plugins/java-decompiler/engine/testData/results/TestMethodReferenceLetterClass.dec b/plugins/java-decompiler/engine/testData/results/TestMethodReferenceLetterClass.dec
new file mode 100644 (file)
index 0000000..0491efa
--- /dev/null
@@ -0,0 +1,18 @@
+import java.util.function.Consumer;
+
+public class TestMethodReferenceLetterClass {
+   void boo() {
+      Consumer var1 = R::foo;// 21
+   }// 22
+}
+
+class 'TestMethodReferenceLetterClass' {
+   method 'boo ()V' {
+      5      4
+      6      5
+   }
+}
+
+Lines mapping:
+21 <-> 5
+22 <-> 6
diff --git a/plugins/java-decompiler/engine/testData/src/pkg/TestMethodReferenceLetterClass.java b/plugins/java-decompiler/engine/testData/src/pkg/TestMethodReferenceLetterClass.java
new file mode 100644 (file)
index 0000000..5f290d8
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+import java.util.function.Consumer;
+
+public class TestMethodReferenceLetterClass {
+  void boo() {
+    Consumer<R> foo = R::foo;
+  }
+}
+
+class R {
+  void foo() {}
+}
\ No newline at end of file