/******************************************************************************* * Copyright (c) 2013, 2016 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.core.tests.compiler.parser; import org.eclipse.jdt.core.JavaModelException; import junit.framework.Test; public class SelectionParserTest18 extends AbstractSelectionTest { static { // TESTS_NUMBERS = new int[] { 53 }; // TESTS_NAMES = new String[] { "test495912" }; } public static Test suite() { return buildMinimalComplianceTestSuite(SelectionParserTest18.class, F_1_8); } public SelectionParserTest18(String testName) { super(testName); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=424110, [1.8][hovering] Hover, F3 does not work for method reference in method invocation public void test424110() throws JavaModelException { String string = "public class X {\n" + " static F f = X::m; // [1] Works\n" + " int i = fun(X::m); // [2] Does not work\n" + " public static int m(int x) {\n" + " return x;\n" + " }\n" + " private int fun(F f) {\n" + " return f.foo(0);\n" + " }\n" + "}\n" + "interface F {\n" + " int foo(int x);\n" + "}\n"; String selection = "m"; String expectedCompletionNodeToString = "<SelectionOnReferenceExpressionName:X::m>"; String completionIdentifier = "m"; String expectedUnitDisplayString = "public class X {\n" + " static F f = <SelectionOnReferenceExpressionName:X::m>;\n" + " int i;\n" + " <clinit>() {\n" + " }\n" + " public X() {\n" + " }\n" + " public static int m(int x) {\n" + " }\n" + " private int fun(F f) {\n" + " }\n" + "}\n" + "interface F {\n" + " int foo(int x);\n" + "}\n"; String expectedReplacedSource = "X::m"; String testName = "<select>"; int selectionStart = string.indexOf(selection); int selectionEnd = selectionStart + selection.length() - 1; this.checkDietParse( string.toCharArray(), selectionStart, selectionEnd, expectedCompletionNodeToString, expectedUnitDisplayString, completionIdentifier, expectedReplacedSource, testName); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=424110, [1.8][hovering] Hover, F3 does not work for method reference in method invocation public void test424110a() throws JavaModelException { String string = "public class X {\n" + " int i = fun(X::m); // [2] Does not work\n" + " public static int m(int x) {\n" + " return x;\n" + " }\n" + " private int fun(F f) {\n" + " return f.foo(0);\n" + " }\n" + "}\n" + "interface F {\n" + " int foo(int x);\n" + "}\n"; String selection = "m"; String expectedCompletionNodeToString = "<SelectionOnReferenceExpressionName:X::m>"; String completionIdentifier = "m"; String expectedUnitDisplayString = "public class X {\n" + " int i = fun(<SelectionOnReferenceExpressionName:X::m>);\n" + " public X() {\n" + " }\n" + " public static int m(int x) {\n" + " }\n" + " private int fun(F f) {\n" + " }\n" + "}\n" + "interface F {\n" + " int foo(int x);\n" + "}\n"; String expectedReplacedSource = "X::m"; String testName = "<select>"; int selectionStart = string.indexOf(selection); int selectionEnd = selectionStart + selection.length() - 1; this.checkDietParse( string.toCharArray(), selectionStart, selectionEnd, expectedCompletionNodeToString, expectedUnitDisplayString, completionIdentifier, expectedReplacedSource, testName); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=430572, [1.8] CCE on hovering over 'super' in lambda expression public void test430572() throws JavaModelException { String string = "@FunctionalInterface\n" + "interface FI {\n" + " default int getID() {\n" + " return 11;\n" + " }\n" + " void print();\n" + "}\n" + "class T {\n" + " FI f2 = () -> System.out.println(super.toString());\n" + "}\n"; String selection = "super"; String expectedCompletionNodeToString = "<SelectOnSuper:super>"; String completionIdentifier = "super"; String expectedUnitDisplayString = "@FunctionalInterface interface FI {\n" + " default int getID() {\n" + " }\n" + " void print();\n" + "}\n" + "class T {\n" + " FI f2 = () -> System.out.println(<SelectOnSuper:super>.toString());\n" + " T() {\n" + " }\n" + "}\n"; String expectedReplacedSource = "super"; String testName = "<select>"; int selectionStart = string.indexOf(selection); int selectionEnd = selectionStart + selection.length() - 1; this.checkDietParse( string.toCharArray(), selectionStart, selectionEnd, expectedCompletionNodeToString, expectedUnitDisplayString, completionIdentifier, expectedReplacedSource, testName); } //https://bugs.eclipse.org/bugs/show_bug.cgi?id=476693 public void test476693() throws JavaModelException { String string = "import static java.util.stream.Collectors.toList;\n" + "import java.util.List;\n" + "import java.util.Spliterator;\n" + "import java.util.stream.Stream;\n" + "interface Seq<T> extends Stream<T>, Iterable<T> {\n" + " @Override\n" + " default Spliterator<T> spliterator() {\n" + " return Iterable.super.spliterator();\n" + " }\n" + "}\n" + "interface Tuple2<T1, T2> {}\n" + "interface Tuple3<T1, T2, T3> {}\n" + "\n" + "public class Test<T1, T2, T3> {\n" + " <T1, T2> Seq<Tuple2<T1, T2>> m(Stream<T1> arg1, Stream<T2> arg2) {\n" + " System.out.println(\"m1\"); return null;\n" + " }\n" + " <T1, T2> Seq<Tuple2<T1, T2>> m(Seq<T1> arg1, Seq<T2> arg2){\n" + " System.out.println(\"m3\"); return null;\n" + " }\n" + " <T1, T2, T3> void m(Seq<T1> c1, Seq<T2> c2, Seq<T3> c3) {\n" + " // Click F3 on the m() call. This will jump to m1, erroneously\n" + " List<Tuple2<T1, T2>> l = m(c1, c2).collect(toList());\n" + " System.out.println(\"Hello\"); // This shouldn't appear in the selection parse tree\n" + " }\n" + "}"; String expectedCompletionNodeToString = "<SelectOnMessageSend:m(c1, c2)>"; String completionIdentifier = "m"; String expectedUnitDisplayString = "import static java.util.stream.Collectors.toList;\n" + "import java.util.List;\n" + "import java.util.Spliterator;\n" + "import java.util.stream.Stream;\n" + "interface Seq<T> extends Stream<T>, Iterable<T> {\n" + " default @Override Spliterator<T> spliterator() {\n" + " }\n" + "}\n" + "interface Tuple2<T1, T2> {\n" + "}\n" + "interface Tuple3<T1, T2, T3> {\n" + "}\n" + "public class Test<T1, T2, T3> {\n" + " public Test() {\n" + " }\n" + " <T1, T2>Seq<Tuple2<T1, T2>> m(Stream<T1> arg1, Stream<T2> arg2) {\n" + " }\n" + " <T1, T2>Seq<Tuple2<T1, T2>> m(Seq<T1> arg1, Seq<T2> arg2) {\n" + " }\n" + " <T1, T2, T3>void m(Seq<T1> c1, Seq<T2> c2, Seq<T3> c3) {\n" + " List<Tuple2<T1, T2>> l = <SelectOnMessageSend:m(c1, c2)>.collect(toList());\n" + " }\n" + "}\n"; String expectedReplacedSource = "m(c1, c2)"; String testName = "<select>"; int selectionStart = string.indexOf("m(c1, c2)"); int selectionEnd = selectionStart; this.checkMethodParse( string.toCharArray(), selectionStart, selectionEnd, expectedCompletionNodeToString, expectedUnitDisplayString, completionIdentifier, expectedReplacedSource, testName); } public void test495912() { String string = "package xy;\n" + "public class Test {\n" + " {\n" + " Runnable r = () -> {\n" + " Integer i= 1;\n" + " byte b= i.byteValue();\n" + " if (true) {\n" + " if (false) {\n" + " }\n" + " }\n" + " String s= new String();\n" + " };\n" + " }\n" + " public void foo(Runnable r) {\n" + " }\n" + "}"; String expectedCompletionNodeToString = "<SelectOnMessageSend:i.byteValue()>"; String completionIdentifier = "byteValue"; String expectedUnitDisplayString = "package xy;\n" + "public class Test {\n" + " {\n" + " Runnable r = () -> {\n" + " Integer i;\n" + " byte b = <SelectOnMessageSend:i.byteValue()>;\n" + " if (true)\n" + " {\n" + " if (false)\n" + " {\n" + " }\n" + " }\n" + " String s;\n" + " };\n" + " }\n" + " public Test() {\n" + " }\n" + " public void foo(Runnable r) {\n" + " }\n" + "}\n"; String expectedReplacedSource = "i.byteValue()"; String testName = "<select>"; int selectionStart = string.indexOf("byteValue"); int selectionEnd = selectionStart + completionIdentifier.length() - 1; this.checkMethodParse( string.toCharArray(), selectionStart, selectionEnd, expectedCompletionNodeToString, expectedUnitDisplayString, completionIdentifier, expectedReplacedSource, testName); } public void test495912a() { String string = "package xy;\n" + "public class Test {\n" + " {\n" + " Runnable r = () -> {\n" + " Integer i= 1;\n" + " byte b= i.byteValue();\n" + " if (true) {\n" + " if (false) {\n" + " }\n" + " }\n" + " for (int i1 = 0; i1 < 42; i1++) {\n" + " }\n" + " };\n" + " }\n" + " public void foo(Runnable r) {\n" + " }\n" + "}"; String expectedCompletionNodeToString = "<SelectOnMessageSend:i.byteValue()>"; String completionIdentifier = "byteValue"; String expectedUnitDisplayString = "package xy;\n" + "public class Test {\n" + " {\n" + " Runnable r = () -> {\n" + " Integer i;\n" + " byte b = <SelectOnMessageSend:i.byteValue()>;\n" + " if (true)\n" + " {\n" + " if (false)\n" + " {\n" + " }\n" + " }\n" + " for (int i1;; (i1 < 42); i1 ++) \n" + " {\n" + " }\n" + " };\n" + " }\n" + " public Test() {\n" + " }\n" + " public void foo(Runnable r) {\n" + " }\n" + "}\n"; String expectedReplacedSource = "i.byteValue()"; String testName = "<select>"; int selectionStart = string.indexOf("byteValue"); int selectionEnd = selectionStart + completionIdentifier.length() - 1; this.checkMethodParse( string.toCharArray(), selectionStart, selectionEnd, expectedCompletionNodeToString, expectedUnitDisplayString, completionIdentifier, expectedReplacedSource, testName); } public void test495912b() { String string = "package xy;\n" + "import org.eclipse.e4.ui.internal.workbench.PartServiceImpl;\n" + "import org.eclipse.e4.ui.model.application.ui.basic.MPart;\n" + "import org.eclipse.swt.widgets.Table;\n" + "import org.eclipse.ui.IWorkbenchWindow;\n" + "public abstract class CycleViewHandler extends CycleBaseHandler {\n" + " @Override\n" + " protected void addItems(Table table, WorkbenchPage page) {\n" + " List<MPart> parts = null;\n" + " parts.stream().sorted((firstPart, secondPart) -> {\n" + " Long firstPartActivationTime = (Long) firstPart.getTransientData()\n" + " .getOrDefault(PartServiceImpl.PART_ACTIVATION_TIME, Long.MIN_VALUE);\n" + " Long secondPartActivationTime = (Long) secondPart.getTransientData()\n" + " .getOrDefault(PartServiceImpl.PART_ACTIVATION_TIME, Long.MIN_VALUE);\n" + " return 0;\n" + " }).forEach(part -> {\n" + " if (true) {\n" + " if (true) {\n" + " }\n" + " } \n" + " else {\n" + " IWorkbenchWindow iwbw = page.getWorkbenchWindow();\n" + " if (true){\n" + " }\n" + " }\n" + " });\n" + " }\n" + "}"; String expectedSelectionNodeToString = "<SelectOnMessageSend:firstPart.getTransientData()>"; String selectionIdentifier = "getTransientData"; String expectedUnitDisplayString = "package xy;\n" + "import org.eclipse.e4.ui.internal.workbench.PartServiceImpl;\n" + "import org.eclipse.e4.ui.model.application.ui.basic.MPart;\n" + "import org.eclipse.swt.widgets.Table;\n" + "import org.eclipse.ui.IWorkbenchWindow;\n" + "public abstract class CycleViewHandler extends CycleBaseHandler {\n" + " public CycleViewHandler() {\n" + " }\n" + " protected @Override void addItems(Table table, WorkbenchPage page) {\n" + " List<MPart> parts;\n" + // this is the missing part without the fix in RecoveredMethod#add(Block....) " parts.stream().sorted((<no type> firstPart, <no type> secondPart) -> {\n" + " Long firstPartActivationTime = (Long) <SelectOnMessageSend:firstPart.getTransientData()>.getOrDefault(PartServiceImpl.PART_ACTIVATION_TIME, Long.MIN_VALUE);\n" + " Long secondPartActivationTime;\n" + " return 0;\n" + "}).forEach((<no type> part) -> {\n" + " if (true)\n" + " {\n" + " if (true)\n" + " {\n" + " }\n" + " }\n" + " else\n" + " {\n" + " IWorkbenchWindow iwbw;\n" + " if (true)\n" + " {\n" + " }\n" + " }\n" + "});\n" + " }\n" + "}\n"; String expectedReplacedSource = "firstPart.getTransientData()"; String testName = "<select>"; int selectionStart = string.indexOf("getTransientData"); int selectionEnd = selectionStart + selectionIdentifier.length() - 1; this.checkMethodParse( string.toCharArray(), selectionStart, selectionEnd, expectedSelectionNodeToString, expectedUnitDisplayString, selectionIdentifier, expectedReplacedSource, testName); } }