Bug 542560 - [13][completion] Code completion Support for Switch
Expressions

Change-Id: I82f86c5c029927d976e86cf8c3614f0a97921084
Signed-off-by: Jay Arthanareeswaran <jarthana@in.ibm.com>

# Conflicts:
#	org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java

Change-Id: I4eceb7297a7b037d406e2c90ec249279ab88dd5a
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest12.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest12.java
index b7de234..7912c9e 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest12.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/SelectionParserTest12.java
@@ -500,11 +500,13 @@
 			"  public X() {\n" + 
 			"  }\n" + 
 			"  public static void foo(Num num_) {\n" + 
-			"    {\n" + 
-			"      {\n" + 
-			"        int i_j;\n" + 
-			"        <SelectOnName:i_j>;\n" + 
-			"      }\n" + 
+			"    switch (num_) {\n" + 
+			"    case THREE ->\n" + 
+			"        {\n" + 
+			"          int i_j;\n" + 
+			"          System.out.println(<SelectOnName:i_j>);\n" + 
+			"          break;\n" + 
+			"        }\n" + 
 			"    }\n" + 
 			"  }\n" + 
 			"}\n";
diff --git a/org.eclipse.jdt.core.tests.model/JCL/jclMin13.jar b/org.eclipse.jdt.core.tests.model/JCL/jclMin13.jar
new file mode 100644
index 0000000..0f621d1
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/JCL/jclMin13.jar
Binary files differ
diff --git a/org.eclipse.jdt.core.tests.model/JCL/jclMin13src.zip b/org.eclipse.jdt.core.tests.model/JCL/jclMin13src.zip
new file mode 100644
index 0000000..bf05b46
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/JCL/jclMin13src.zip
Binary files differ
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
index 85ad17c..07a741c 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
@@ -3318,7 +3318,7 @@
 			}
 		} else if ("13".equals(compliance)) {
 			if (JavaCore.getClasspathVariable("JCL13_LIB") == null) {
-				setupExternalJCL("jclMin12"); // No need for an explicit jclmin13, just use the same old one.
+				setupExternalJCL("jclMin13"); // No need for an explicit jclmin13, just use the same old one.
 				JavaCore.setClasspathVariables(
 					new String[] {"JCL13_LIB", "JCL13_SRC", "JCL_SRCROOT"},
 					new IPath[] {getExternalJCLPath("13"), getExternalJCLSourcePath("13"), getExternalJCLRootSourcePath()},
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests12.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests12.java
deleted file mode 100644
index ea03702..0000000
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests12.java
+++ /dev/null
@@ -1,856 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2019 IBM and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- * 
- *******************************************************************************/
-package org.eclipse.jdt.core.tests.model;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.codeassist.RelevanceConstants;
-
-import junit.framework.Test;
-
-public class CompletionTests12 extends AbstractJavaModelCompletionTests {
-
-	static {
-//		TESTS_NAMES = new String[]{"test018e"};
-	}
-
-	public CompletionTests12(String name) {
-		super(name);
-	}
-	public void setUpSuite() throws Exception {
-		if (COMPLETION_PROJECT == null)  {
-			COMPLETION_PROJECT = setUpJavaProject("Completion", "12");
-		} else {
-			setUpProjectCompliance(COMPLETION_PROJECT, "12");
-		}
-		super.setUpSuite();
-	}
-	public static Test suite() {
-		return buildModelTestSuite(CompletionTests12.class);
-	}
-	public void test001() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(MyDay day) {\n" + 
-						"		switch (day) {\n" + 
-						"		case SATURDAY, SUN ->\n" + 
-						"			System.out.println(day.toString());\n" + 
-						"		}\n" + 
-						"	}\n" + 
-						"	public static void main(String[] args) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n" + 
-				"enum MyDay { SATURDAY, SUNDAY}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "SATURDAY, SUN";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"SUNDAY[FIELD_REF]{SUNDAY, LMyDay;, LMyDay;, SUNDAY, null, "+ 
-						(RelevanceConstants.R_DEFAULT + RelevanceConstants.R_RESOLVED + RelevanceConstants.R_INTERESTING+
-								RelevanceConstants.R_CASE + RelevanceConstants.R_EXACT_EXPECTED_TYPE +
-								RelevanceConstants.R_ENUM + RelevanceConstants.R_ENUM_CONSTANT +
-								RelevanceConstants.R_UNQUALIFIED + RelevanceConstants.R_NON_RESTRICTED)+ "}",
-						requestor.getResults());
-	}
-	public void test002() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(MyDay day) {\n" + 
-						"		switch (day) {\n" + 
-						"		case SATURDAY, SUN :\n" + 
-						"			System.out.println(day.toString());\n" + 
-						"		}\n" + 
-						"	}\n" + 
-						"	public static void main(String[] args) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n" + 
-				"enum MyDay { SATURDAY, SUNDAY}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "SATURDAY, SUN";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"SUNDAY[FIELD_REF]{SUNDAY, LMyDay;, LMyDay;, SUNDAY, null, "+ 
-						(RelevanceConstants.R_DEFAULT + RelevanceConstants.R_RESOLVED + RelevanceConstants.R_INTERESTING+
-								RelevanceConstants.R_CASE + RelevanceConstants.R_EXACT_EXPECTED_TYPE +
-								RelevanceConstants.R_ENUM + RelevanceConstants.R_ENUM_CONSTANT +
-								RelevanceConstants.R_UNQUALIFIED + RelevanceConstants.R_NON_RESTRICTED)+ "}",
-						requestor.getResults());
-	}
-	public void test003() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(MyDay day) {\n" + 
-						"		switch (day) {\n" + 
-						"		case SATU -> \n" + 
-						"			System.out.println(day.toString());\n" + 
-						"		}\n" + 
-						"	}\n" + 
-						"	public static void main(String[] args) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n" + 
-				"enum MyDay { SATURDAY, SUNDAY}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "SATU";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"SATURDAY[FIELD_REF]{SATURDAY, LMyDay;, LMyDay;, SATURDAY, null, "+ 
-						(RelevanceConstants.R_DEFAULT + RelevanceConstants.R_RESOLVED + RelevanceConstants.R_INTERESTING+
-								RelevanceConstants.R_CASE + RelevanceConstants.R_EXACT_EXPECTED_TYPE +
-								RelevanceConstants.R_ENUM + RelevanceConstants.R_ENUM_CONSTANT +
-								RelevanceConstants.R_UNQUALIFIED + RelevanceConstants.R_NON_RESTRICTED)+ "}",
-						requestor.getResults());
-	}
-	public void test004() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(MyDay day) {\n" + 
-						"		switch (day) {\n" + 
-						"		case SATURDAY, SUNDAY, MOND -> \n" + 
-						"			System.out.println(day.toString());\n" + 
-						"		}\n" + 
-						"	}\n" + 
-						"	public static void main(String[] args) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n" + 
-				"enum MyDay { SATURDAY, SUNDAY, MONDAY}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "MOND";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"MONDAY[FIELD_REF]{MONDAY, LMyDay;, LMyDay;, MONDAY, null, "+ 
-						(RelevanceConstants.R_DEFAULT + RelevanceConstants.R_RESOLVED + RelevanceConstants.R_INTERESTING+
-								RelevanceConstants.R_CASE + RelevanceConstants.R_EXACT_EXPECTED_TYPE +
-								RelevanceConstants.R_ENUM + RelevanceConstants.R_ENUM_CONSTANT +
-								RelevanceConstants.R_UNQUALIFIED + RelevanceConstants.R_NON_RESTRICTED)+ "}",
-						requestor.getResults());
-	}
-	public void test005() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(MyDay day) {\n" + 
-						"		switch (day) {\n" + 
-						"		case SATURDAY, SUND, MONDAY -> \n" + 
-						"			System.out.println(day.toString());\n" + 
-						"		}\n" + 
-						"	}\n" + 
-						"	public static void main(String[] args) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n" + 
-				"enum MyDay { SATURDAY, SUNDAY, MONDAY}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "SUND";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"SUNDAY[FIELD_REF]{SUNDAY, LMyDay;, LMyDay;, SUNDAY, null, "+ 
-						(RelevanceConstants.R_DEFAULT + RelevanceConstants.R_RESOLVED + RelevanceConstants.R_INTERESTING+
-								RelevanceConstants.R_CASE + RelevanceConstants.R_EXACT_EXPECTED_TYPE +
-								RelevanceConstants.R_ENUM + RelevanceConstants.R_ENUM_CONSTANT +
-								RelevanceConstants.R_UNQUALIFIED + RelevanceConstants.R_NON_RESTRICTED)+ "}",
-						requestor.getResults());
-	}
-	public void test005a() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(MyDay day) {\n" + 
-						"		switch (day) {\n" + 
-						"		case SATURDAY, SUNDAY -> \n" + 
-						"			System.out.println(day.toString());\n" + 
-						"		case MON -> \n" + 
-						"			System.out.println(day.toString());\n" + 
-						"		}\n" + 
-						"	}\n" + 
-						"	public static void main(String[] args) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n" + 
-				"enum MyDay { SATURDAY, SUNDAY, MONDAY}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "case MON";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"MONDAY[FIELD_REF]{MONDAY, LMyDay;, LMyDay;, MONDAY, null, "+ 
-						(RelevanceConstants.R_DEFAULT + RelevanceConstants.R_RESOLVED + RelevanceConstants.R_INTERESTING+
-								RelevanceConstants.R_CASE + RelevanceConstants.R_EXACT_EXPECTED_TYPE +
-								RelevanceConstants.R_ENUM + RelevanceConstants.R_ENUM_CONSTANT +
-								RelevanceConstants.R_UNQUALIFIED + RelevanceConstants.R_NON_RESTRICTED)+ "}",
-						requestor.getResults());
-	}
-	public void test006() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(MyDay day) {\n" + 
-						"		switch (day.toS) {\n" + 
-						"		case \"SATURDAY\" -> \n" + 
-						"			System.out.println(day.toString());\n" + 
-						"		}\n" + 
-						"	}\n" + 
-						"	public static void main(String[] args) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n" + 
-						"enum MyDay { SATURDAY, SUNDAY}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "day.toS";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, 60}",
-						requestor.getResults());
-	}
-	public void test007() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(MyDay day) {\n" + 
-						"		switch (day.o) {\n" + 
-						"		case 0 -> \n" + 
-						"			System.out.println(day.toString());\n" + 
-						"		}\n" + 
-						"	}\n" + 
-						"	public static void main(String[] args) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n" + 
-						"enum MyDay { SATURDAY, SUNDAY}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "day.o";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"ordinal[METHOD_REF]{ordinal(), Ljava.lang.Enum<LMyDay;>;, ()I, ordinal, null, 60}",
-						requestor.getResults());
-	}
-	public void test008() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(MyDay day) {\n" + 
-						"		switch (1 + day.o) {\n" + 
-						"		case 0 -> \n" + 
-						"			System.out.println(day.toString());\n" + 
-						"		}\n" + 
-						"	}\n" + 
-						"	public static void main(String[] args) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n" + 
-						"enum MyDay { SATURDAY, SUNDAY}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "day.o";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"ordinal[METHOD_REF]{ordinal(), Ljava.lang.Enum<LMyDay;>;, ()I, ordinal, null, 90}",
-						requestor.getResults());
-	}
-	public void test009() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(MyDay day) {\n" + 
-						"		switch (1 + da) {\n" + 
-						"		case 0 -> \n" + 
-						"			System.out.println(day.toString());\n" + 
-						"		}\n" + 
-						"	}\n" + 
-						"	public static void main(String[] args) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n" + 
-						"enum MyDay { SATURDAY, SUNDAY}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "1 + da";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"day[LOCAL_VARIABLE_REF]{day, null, LMyDay;, day, null, 52}",
-						requestor.getResults());
-	}
-	public void test010() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(MyDay day) {\n" + 
-						"		switch (1 + da + 1) {\n" + 
-						"		case 0 -> \n" + 
-						"			System.out.println(day.toString());\n" + 
-						"		}\n" + 
-						"	}\n" + 
-						"	public static void main(String[] args) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n" + 
-						"enum MyDay { SATURDAY, SUNDAY}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "1 + da";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"day[LOCAL_VARIABLE_REF]{day, null, LMyDay;, day, null, 52}",
-						requestor.getResults());
-	}
-	public void test011() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(int arg0) {\n" + 
-						"		foo(\n" + 
-						"		switch (arg) {\n" + 
-						"		case 1 -> 1;\n" + 
-						"		default -> 0;\n" +
-						"		}\n" + 
-						"	});\n" + 
-						"	public static void foo(int arg0) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "switch (arg";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"arg0[LOCAL_VARIABLE_REF]{arg0, null, I, arg0, null, 52}",
-						requestor.getResults());
-	}
-	public void test012() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(int arg0) {\n" + 
-						"		foo(\n" + 
-						"		switch (arg0) {\n" + 
-						"		case 1 -> arg;\n" + 
-						"		default -> 0;\n" +
-						"		}\n" + 
-						"	});\n" + 
-						"	public static void foo(int arg0) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "-> arg";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"arg0[LOCAL_VARIABLE_REF]{arg0, null, I, arg0, null, 52}",
-						requestor.getResults());
-	}
-	public void test013() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/Switch.java",
-				"public class Switch {\n" + 
-						"	public static void bar(int arg0) {\n" + 
-						"		foo(\n" + 
-						"		switch (0 + arg) {\n" + 
-						"		case 1 -> 1;\n" + 
-						"		default -> 0;\n" +
-						"		}\n" + 
-						"	});\n" + 
-						"	public static void foo(int arg0) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "0 + arg";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"arg0[LOCAL_VARIABLE_REF]{arg0, null, I, arg0, null, 82}",
-						requestor.getResults());
-	}
-	public void test014() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"public class X {\n" + 
-						"	public static void bar(int arg0) {\n" + 
-						"		foo(\n" + 
-						"		swi);\n" + 
-						"	public static void foo(int arg0) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "swi";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"switch[KEYWORD]{switch, null, null, switch, null, 49}",
-						requestor.getResults());
-	}
-	public void _test015() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"public class Switch {\n" + 
-						"	public static void bar(int arg0) {\n" + 
-						"		foo(\n" + 
-						"		switch (0 + arg0) {\n" + 
-						"		case 1 -> {break ar;}\n" + 
-						"		default -> 0;\n" +
-						"		}\n" + 
-						"	});\n" + 
-						"	public static void foo(int arg0) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "break ar";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"arg0[LOCAL_VARIABLE_REF]{arg0, null, I, arg0, null, 52}",
-						requestor.getResults());
-	}
-	public void test016() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"public class Switch {\n" + 
-						"	public static void bar(int arg0) {\n" + 
-						"		foo(\n" + 
-						"		switch (0 + arg0) {\n" + 
-						"		case 1 -> {break 1;}\n" + 
-						"		default -> ar;\n" +
-						"		}\n" + 
-						"	});\n" + 
-						"	public static void foo(int arg0) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "-> ar";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"arg0[LOCAL_VARIABLE_REF]{arg0, null, I, arg0, null, 52}",
-						requestor.getResults());
-	}
-	public void _test017() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"public class Switch {\n" + 
-						"	public static void bar(int arg0) {\n" + 
-						"		int arg1 = 0;\n" + 
-						"		foo(\n" + 
-						"		switch (0 + arg0) {\n" + 
-						"		case 1 -> 1;\n" + 
-						"		default -> {break ar;}\n" +
-						"		}\n" + 
-						"	});\n" + 
-						"	public static void foo(int arg0) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "break ar";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"arg0[LOCAL_VARIABLE_REF]{arg0, null, I, arg0, null, 52}",
-						requestor.getResults());
-	}
-	public void _test017a() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"public class Switch {\n" + 
-						"	public static void bar(int arg0) {\n" + 
-						"		foo(\n" + 
-						"		argLabel: switch (0 + arg0) {\n" + 
-						"		case 1 -> 1;\n" + 
-						"		default -> {break ar;}\n" +
-						"		}\n" + 
-						"	});\n" + 
-						"	public static void foo(int arg0) {\n" + 
-						"		bar(MyDay.SUNDAY);\n" + 
-						"	}\n" + 
-						"}\n");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "break ar";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"arg0[LOCAL_VARIABLE_REF]{arg0, null, I, arg0, null, 52}\n" +
-				"argLabel[LABEL_REF]{argLabel, null, null, argLabel, null, 49}",
-						requestor.getResults());
-	}
-	public void test018a() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"import org.eclipse.jdt.annotation.*;\n" + 
-				"import java.util.function.*;\n" + 
-				"interface IN0 {} \n" + 
-				"interface IN1 extends IN0 {} \n" + 
-				"interface IN2 extends IN0 {}\n" + 
-				"public class X {\n" + 
-				"	@NonNull IN1 n_1() { return new IN1() {}; } \n" + 
-				"	IN2 n_2() { return null; } \n" + 
-				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
-				"	void testSw(int i) { \n" + 
-				"		m(switch(i) { \n" + 
-				"			case 1 -> this::n_; \n" + 
-				"			case 2 -> () -> n1(); \n" + 
-				"			case 3 -> null; \n" + 
-				"			case 4 -> () -> n2(); \n" + 
-				"			default -> this::n2; }); \n" + 
-				"	}\n" + 
-				"}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "this::n_";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"n_1[METHOD_NAME_REFERENCE]{n_1, LX;, ()LIN1;, n_1, null, 60}\n" + 
-				"n_2[METHOD_NAME_REFERENCE]{n_2, LX;, ()LIN2;, n_2, null, 60}",
-						requestor.getResults());
-	}
-	public void test018b() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"import org.eclipse.jdt.annotation.*;\n" + 
-				"interface IN0 {} \n" + 
-				"interface IN1 extends IN0 {} \n" + 
-				"interface IN2 extends IN0 {}\n" + 
-				"public class X {\n" + 
-				"	@NonNull IN1 n_1() { return new IN1() {}; } \n" + 
-				"	IN2 n_2() { return null; } \n" + 
-				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
-				"	void testSw(int i) { \n" + 
-				"		m(switch(i) { \n" + 
-				"			case 2 -> () -> n_; \n" + 
-				"	}\n" + 
-				"}\n" +
-				"interface Supplier<T> {\n" + 
-				"    T get();\n" + 
-				"}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "-> n_";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"n_1[METHOD_REF]{n_1(), LX;, ()LIN1;, n_1, null, 52}\n" + 
-				"n_2[METHOD_REF]{n_2(), LX;, ()LIN2;, n_2, null, 52}",
-						requestor.getResults());
-	}
-	public void test018c() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"import org.eclipse.jdt.annotation.*;\n" + 
-				"interface IN0 {} \n" + 
-				"interface IN1 extends IN0 {} \n" + 
-				"interface IN2 extends IN0 {}\n" + 
-				"public class X {\n" + 
-				"	@NonNull IN1 n_1() { return new IN1() {}; } \n" + 
-				"	IN2 n_2() { return null; } \n" + 
-				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
-				"	void testSw(int i) { \n" + 
-				"		m(switch(i) { \n" + 
-				"			default -> this::n_; }); \n" + 
-				"	}\n" + 
-				"}\n" +
-				"interface Supplier<T> {\n" + 
-				"    T get();\n" + 
-				"}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "this::n_";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"n_1[METHOD_NAME_REFERENCE]{n_1, LX;, ()LIN1;, n_1, null, 60}\n" + 
-				"n_2[METHOD_NAME_REFERENCE]{n_2, LX;, ()LIN2;, n_2, null, 60}",
-						requestor.getResults());
-	}
-	public void test018d() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"import org.eclipse.jdt.annotation.*;\n" + 
-				"interface IN0 {} \n" + 
-				"interface IN1 extends IN0 {} \n" + 
-				"interface IN2 extends IN0 {}\n" + 
-				"public class X {\n" + 
-				"	@NonNull IN1 n_1() { return new IN1() {}; } \n" + 
-				"	IN2 n_2() { return null; } \n" + 
-				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
-				"	void testSw(int i) { \n" + 
-				"		m(switch(i) { \n" + 
-				"			default -> () -> n_; }); \n" + 
-				"	}\n" + 
-				"}\n" +
-				"interface Supplier<T> {\n" + 
-				"    T get();\n" + 
-				"}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "() -> n_";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"n_1[METHOD_REF]{n_1(), LX;, ()LIN1;, n_1, null, 52}\n" + 
-				"n_2[METHOD_REF]{n_2(), LX;, ()LIN2;, n_2, null, 52}",
-						requestor.getResults());
-	}
-	public void test018e() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"import org.eclipse.jdt.annotation.*;\n" + 
-				"interface IN0 {} \n" + 
-				"interface IN1 extends IN0 {} \n" + 
-				"interface IN2 extends IN0 {}\n" + 
-				"public class X {\n" + 
-				"	@NonNull IN1 n_1() { return new IN1() {}; } \n" + 
-				"	IN2 n_2() { return null; } \n" + 
-				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
-				"	void testSw(int i) { \n" + 
-				"		m(switch(i) { \n" + 
-				"			case 1 -> this::n_1; \n" + 
-				"			case 2 -> () -> n_; \n" + 
-				"	}\n" + 
-				"}\n" +
-				"interface Supplier<T> {\n" + 
-				"    T get();\n" + 
-				"}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "() -> n_";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"n_1[LOCAL_VARIABLE_REF]{n_1, null, Ljava.lang.Object;, n_1, null, 51}\n" + 
-				"n_1[METHOD_REF]{n_1(), LX;, ()LIN1;, n_1, null, 52}\n" + 
-				"n_2[METHOD_REF]{n_2(), LX;, ()LIN2;, n_2, null, 52}",
-						requestor.getResults());
-	}
-	public void test018f() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"import org.eclipse.jdt.annotation.*;\n" + 
-				"interface IN0 {} \n" + 
-				"interface IN1 extends IN0 {} \n" + 
-				"interface IN2 extends IN0 {}\n" + 
-				"public class X {\n" + 
-				"	@NonNull IN1 n_1() { return new IN1() {}; } \n" + 
-				"	IN2 n_2() { return null; } \n" + 
-				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
-				"	void testSw(int i) { \n" + 
-				"		m(switch(i) { \n" + 
-				"			case 1 -> () -> n_1; \n" + 
-				"			case 2 -> this::n_; \n" + 
-				"	}\n" + 
-				"}\n" +
-				"interface Supplier<T> {\n" + 
-				"    T get();\n" + 
-				"}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "this::n_";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"n_1[METHOD_NAME_REFERENCE]{n_1, LX;, ()LIN1;, n_1, null, 60}\n" + 
-				"n_2[METHOD_NAME_REFERENCE]{n_2, LX;, ()LIN2;, n_2, null, 60}",
-						requestor.getResults());
-	}
-	public void test019() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"import org.eclipse.jdt.annotation.*;\n" + 
-				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
-				"public class X {\n" + 
-				"	void testSw(int i) { \n" + 
-				"		m(swi);\n" + 
-				"}\n" +
-				"interface Supplier<T> {\n" + 
-				"    T get();\n" + 
-				"}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "swi";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"switch[KEYWORD]{switch, null, null, switch, null, 49}",
-						requestor.getResults());
-	}
-	public void test020() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"public class X {\n" + 
-				"	static final String MONDAY = \"MONDAY\";\n" + 
-				"	static final String TUESDAY = \"TUESDAY\";\n" + 
-				"	static final String WEDNESDAY = \"WEDNESDAY\";\n" + 
-				"	static final String THURSDAY = \"THURSDAY\";\n" + 
-				"	static final String FRIDAY = \"FRIDAY\";\n" + 
-				"	static final String SATURDAY = \"SATURDAY\";\n" + 
-				"	static final String SUNDAY = \"SUNDAY\"; \n" + 
-				"	@SuppressWarnings(\"preview\")\n" + 
-				"	public static void main(String[] args) {\n" + 
-				"		String day = \"MONDAY\";\n" + 
-				"		switch (day) {\n" + 
-				"		    case MONDAY, FRIDAY, SUNDAY  -> System.out.println(6);\n" + 
-				"		    case TUESDAY           		 -> System.out.println(7);\n" + 
-				"		    case THURSDAY, SATURDAY     -> System.out.println(8);\n" + 
-				"		    case WEDNESDAY              -> System.out.println(9);\n" + 
-				"		}\n" + 
-				"		int k = switch (day) {\n" + 
-				"	    case MONDAY  -> throw new NullPointerException();\n" + 
-				"	    case TUESDAY -> 1;\n" + 
-				"	    case WEDNESDAY -> {break 10;}\n" + 
-				"	    default      -> {\n" + 
-				"	        int g = day.h();\n" + 
-				"	        int result = f(g);\n" + 
-				"	        break result;\n" + 
-				"	    }};\n" + 
-				"	}\n" + 
-				"	static int f(int k) {\n" + 
-				"		return k*k;\n" + 
-				"	}\n" + 
-				"}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "day.h";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"hashCode[METHOD_REF]{hashCode, Ljava.lang.Object;, ()I, hashCode, null, 90}",
-						requestor.getResults());
-	}
-	public void test021() throws JavaModelException {
-		this.workingCopies = new ICompilationUnit[1];
-		this.workingCopies[0] = getWorkingCopy(
-				"/Completion/src/X.java",
-				"public class X {\n" + 
-				"	static final String MONDAY = \"MONDAY\";\n" + 
-				"	static final String TUESDAY = \"TUESDAY\";\n" + 
-				"	static final String WEDNESDAY = \"WEDNESDAY\";\n" + 
-				"	static final String THURSDAY = \"THURSDAY\";\n" + 
-				"	static final String FRIDAY = \"FRIDAY\";\n" + 
-				"	static final String SATURDAY = \"SATURDAY\";\n" + 
-				"	static final String SUNDAY = \"SUNDAY\"; \n" + 
-				"	@SuppressWarnings(\"preview\")\n" + 
-				"	public static void main(String[] args) {\n" + 
-				"		String day = \"MONDAY\";\n" + 
-				"		int k = switch (day) {\n" + 
-				"	    case MONDAY  -> throw new NullPointerException();\n" + 
-				"	    case TUESDAY -> 1;\n" + 
-				"	    case WEDNESDAY -> {break 10;}\n" + 
-				"	    default      -> {\n" + 
-				"	        int g = day.h();\n" + 
-				"	        int result = f(g);\n" + 
-				"	        break result;\n" + 
-				"	    }};\n" + 
-				"	}\n" + 
-				"	static int f(int k) {\n" + 
-				"		return k*k;\n" + 
-				"	}\n" + 
-				"}");
-		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-		requestor.allowAllRequiredProposals();
-		String str = this.workingCopies[0].getSource();
-		String completeBehind = "day.h";
-		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-		assertResults(
-				"hashCode[METHOD_REF]{hashCode, Ljava.lang.Object;, ()I, hashCode, null, 90}",
-						requestor.getResults());
-	}
-}
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunCompletionModelTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunCompletionModelTests.java
index 348ad9c..992ad6f 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunCompletionModelTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunCompletionModelTests.java
@@ -41,7 +41,6 @@
 			COMPLETION_SUITES.add(CompletionTests9.class);
 			COMPLETION_SUITES.add(CompletionTests10.class);
 			COMPLETION_SUITES.add(CompletionTests11.class);
-			COMPLETION_SUITES.add(CompletionTests12.class);
 			COMPLETION_SUITES.add(CompletionContextTests.class);
 			COMPLETION_SUITES.add(CompletionContextTests_1_5.class);
 			COMPLETION_SUITES.add(CompletionWithMissingTypesTests.class);
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
index 38eaad8..3ae6696 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
@@ -7,6 +7,10 @@
  * https://www.eclipse.org/legal/epl-2.0/
  *
  * SPDX-License-Identifier: EPL-2.0
+ *
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
  * 
  * Contributors:
  *		IBM Corporation - initial API and implementation
@@ -99,6 +103,7 @@
 	protected static final int K_AFTER_NAME_IN_PROVIDES_STATEMENT = COMPLETION_PARSER + 49;
 	protected static final int K_AFTER_WITH_IN_PROVIDES_STATEMENT = COMPLETION_PARSER + 50;
 	protected static final int K_INSIDE_OPENS_STATEMENT = COMPLETION_PARSER + 51;
+	protected static final int K_YIELD_KEYWORD = COMPLETION_PARSER + 52;
 
 
 	public final static char[] FAKE_TYPE_NAME = new char[]{' '};
@@ -1675,6 +1680,14 @@
 	}
 	return false;
 }
+private boolean checkYieldKeyword() {
+	// Clients to ensure that we are already inside a method
+	char[] id = this.scanner.getCurrentIdentifierSource();
+	if(id.length > 0 && CharOperation.prefixEquals(id, Keywords.YIELD)) {
+		return true;
+	}
+	return false;
+}
 /**
  * Checks if the completion is inside a method invocation or a constructor invocation.
  * Returns whether we found a completion node.
@@ -3798,6 +3811,12 @@
 	}
 }
 @Override
+protected void consumeSwitchLabeledBlock() {
+	popUntilElement(K_SWITCH_LABEL);
+	popElement(K_SWITCH_LABEL);
+	concatNodeLists();
+}
+@Override
 protected void consumeToken(int token) {
 	if(this.isFirst) {
 		super.consumeToken(token);
@@ -3826,6 +3845,10 @@
 				break;
 			case TokenNameLBRACE:
 				popElement(K_BETWEEN_NEW_AND_LEFT_BRACKET);
+				if(topKnownElementKind(COMPLETION_OR_ASSIST_PARSER) == K_SWITCH_LABEL
+						&& previous == TokenNameARROW) {
+					pushOnElementStack(K_SWITCH_EXPRESSION_DELIMITTER);
+				}
 				break;
 			case TokenNameLBRACKET:
 				if(topKnownElementKind(COMPLETION_OR_ASSIST_PARSER) == K_BETWEEN_NEW_AND_LEFT_BRACKET) {
@@ -3916,6 +3939,16 @@
 			case TokenNameIdentifier:
 				if (this.inReferenceExpression)
 					break;
+				if (this.scanner.previewEnabled && isInsideSwitch() && checkYieldKeyword()) {
+					pushOnElementStack(K_YIELD_KEYWORD);
+					// Take the short cut here.
+					// Instead of injecting the TokenNameRestrictedIdentifierYield, totally ignore it
+					// and let completion take it course. We will not be constructing the 
+					// YieldStatement and thus not producing accurate completion, but completion doesn't have
+					// enough information anyway about the LHS anyway.
+					token = this.currentToken = this.getNextToken();
+					super.consumeToken(this.currentToken);
+				}
 				if (previous == TokenNameDOT) { // e.g. foo().[fred]()
 					if (this.invocationType != SUPER_RECEIVER // e.g. not super.[fred]()
 						&& this.invocationType != NAME_RECEIVER // e.g. not bar.[fred]()
@@ -4321,6 +4354,7 @@
 				pushOnElementStack(K_BETWEEN_FOR_AND_RIGHT_PAREN, this.bracketDepth);
 				break;
 			case TokenNameswitch:
+				popElement(K_LOCAL_INITIALIZER_DELIMITER);
 				pushOnElementStack(K_BETWEEN_SWITCH_AND_RIGHT_PAREN, this.bracketDepth);
 				break;
 			case TokenNamesynchronized:
@@ -4864,7 +4898,8 @@
 			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=269493: Keywords are not proposed in a for
 			// loop without block. Completion while at K_CONTROL_STATEMENT_DELIMITER case needs to handled
 			// similar to the K_BLOCK_DELIMITER with minor differences.
-			if(kind == K_BLOCK_DELIMITER || kind == K_CONTROL_STATEMENT_DELIMITER || kind == K_LAMBDA_EXPRESSION_DELIMITER) {
+			if(kind == K_BLOCK_DELIMITER || kind == K_CONTROL_STATEMENT_DELIMITER || kind == K_LAMBDA_EXPRESSION_DELIMITER
+					|| kind == K_SWITCH_EXPRESSION_DELIMITTER) {
 				if(this.canBeExplicitConstructor == YES) {
 					canBeExplicitConstructorCall = true;
 				}
@@ -4906,6 +4941,9 @@
 				if(isInsideBreakable()) {
 					keywords[count++]= Keywords.BREAK;
 				}
+				if(isInsideSwitch()) {
+					keywords[count++]= Keywords.YIELD;
+				}
 			} else if (kind == K_BETWEEN_FOR_AND_RIGHT_PAREN) {
 				if (this.options.complianceLevel >= ClassFileConstants.JDK10) {
 					keywords[count++]= Keywords.VAR;
@@ -4920,13 +4958,16 @@
 				keywords[count++]= Keywords.TRUE;
 				keywords[count++]= Keywords.FALSE;
 				keywords[count++]= Keywords.NULL;
-
+				if (kind == K_YIELD_KEYWORD) {
+					keywords[count++]= Keywords.YIELD;
+				}
 				if(kind == K_SWITCH_LABEL) {
 					if(topKnownElementInfo(COMPLETION_OR_ASSIST_PARSER) != DEFAULT) {
 						keywords[count++]= Keywords.DEFAULT;
 					}
 					keywords[count++]= Keywords.BREAK;
 					keywords[count++]= Keywords.CASE;
+					keywords[count++]= Keywords.YIELD;
 					if (this.options.complianceLevel >= ClassFileConstants.JDK1_4) {
 						keywords[count++]= Keywords.ASSERT;
 					}
@@ -5124,9 +5165,7 @@
 @Override
 protected void consumePostfixExpression() {
 	// PostfixExpression ::= Name
-	if(this.topKnownElementKind(COMPLETION_OR_ASSIST_PARSER) == K_INSIDE_BREAK_STATEMENT) {
-		// Do nothing, just let checkLabelStatement() do the job
-	} else {
+	if (topKnownElementKind(COMPLETION_OR_ASSIST_PARSER) != K_YIELD_KEYWORD) {
 		super.consumePostfixExpression();
 	}
 }
@@ -5231,24 +5270,11 @@
 	return false;
 }
 
-protected boolean isIndirectlyInsideBlock(){
-	int i = this.elementPtr;
-	while(i > -1) {
-		if(this.elementKindStack[i] == K_BLOCK_DELIMITER)
-			return true;
-		i--;
-	}
-	return false;
-}
-
-protected boolean isInsideBlock(){
+protected boolean isInsideSwitch(){
 	int i = this.elementPtr;
 	while(i > -1) {
 		switch (this.elementKindStack[i]) {
-			case K_TYPE_DELIMITER : return false;
-			case K_METHOD_DELIMITER : return false;
-			case K_FIELD_INITIALIZER_DELIMITER : return false;
-			case K_BLOCK_DELIMITER : return true;
+			case K_SWITCH_LABEL : return true;
 		}
 		i--;
 	}
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
index 9980463..fa1531d 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
@@ -8,6 +8,10 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  *
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -104,6 +108,7 @@
 	protected static final int K_ENUM_CONSTANT_DELIMITER = ASSIST_PARSER + 6; // whether we are inside a field initializer
 	protected static final int K_LAMBDA_EXPRESSION_DELIMITER = ASSIST_PARSER + 7; // whether we are inside a lambda expression
 	protected static final int K_MODULE_INFO_DELIMITER = ASSIST_PARSER + 8; // whether we are inside a module info declaration
+	protected static final int K_SWITCH_EXPRESSION_DELIMITTER = ASSIST_PARSER + 9; // whether we are inside a switch expression
 
 	// selector constants
 	protected static final int THIS_CONSTRUCTOR = -1;
@@ -1281,11 +1286,8 @@
 			break;
 	}
 }
-private boolean lastArrowAssociatedWithCase = false;
 @Override
 protected void consumeToken(int token) {
-	if (TokenNameARROW == token)
-		this.lastArrowAssociatedWithCase = this.caseFlagSet; // remember the arrow association before reset.
 	super.consumeToken(token);
 
 	if(this.isFirst) {
@@ -1318,9 +1320,10 @@
 				}
 				break;
 			case TokenNameLBRACE:
-				if (this.previousToken == TokenNameARROW && !this.lastArrowAssociatedWithCase) {
+				if (this.previousToken == TokenNameARROW) {
 					popElement(K_LAMBDA_EXPRESSION_DELIMITER);
-					pushOnElementStack(K_LAMBDA_EXPRESSION_DELIMITER, BLOCK_BODY, this.previousObjectInfo);
+					if (topKnownElementKind(ASSIST_PARSER, 1) != K_SWITCH_EXPRESSION_DELIMITTER)
+						pushOnElementStack(K_LAMBDA_EXPRESSION_DELIMITER, BLOCK_BODY, this.previousObjectInfo);
 				}
 				break;
 		}
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/Keywords.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/Keywords.java
index 2fb6ab5..ba10f2c 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/Keywords.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/Keywords.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2018 IBM Corporation and others.
+ * Copyright (c) 2000, 2019 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -7,7 +7,11 @@
  * https://www.eclipse.org/legal/epl-2.0/
  *
  * SPDX-License-Identifier: EPL-2.0
- * 
+ *
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *      Jesper Steen Møller - Contributions for
@@ -22,6 +26,7 @@
 	char[] ASSERT = "assert".toCharArray(); //$NON-NLS-1$
 	char[] BREAK = "break".toCharArray(); //$NON-NLS-1$
 	char[] CASE = "case".toCharArray(); //$NON-NLS-1$
+	char[] YIELD = "yield".toCharArray(); //$NON-NLS-1$
 	char[] CATCH = "catch".toCharArray(); //$NON-NLS-1$
 	char[] CLASS = "class".toCharArray(); //$NON-NLS-1$
 	char[] CONTINUE = "continue".toCharArray(); //$NON-NLS-1$
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/YieldStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/YieldStatement.java
index 8fd2e97..0e8962b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/YieldStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/YieldStatement.java
@@ -32,8 +32,8 @@
 	 */
 	public boolean isImplicit;
 
-public YieldStatement(Expression exp, int sourceStart, int e) {
-	super(null, sourceStart, e);
+public YieldStatement(Expression exp, int sourceStart, int sourceEnd) {
+	super(null, sourceStart, sourceEnd);
 	this.expression = exp;
 }
 @Override
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
index 2f9e6af..6add7a5 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
@@ -9794,7 +9794,7 @@
 	//System.out.println(this.scanner.toStringAction(type));
 	switch (type) {
 		case TokenNameARROW:
-			if (!this.caseFlagSet  && this.scanner.lookBack[0] != TokenNamedefault)
+			if (!this.caseFlagSet && this.scanner.lookBack[0] != TokenNamedefault)
 				consumeLambdaHeader();
 			this.caseFlagSet = false;
 			break;
diff --git a/org.eclipse.jdt.tests.latestBREE/META-INF/MANIFEST.MF b/org.eclipse.jdt.tests.latestBREE/META-INF/MANIFEST.MF
index 8ea3f60..527baf4 100644
--- a/org.eclipse.jdt.tests.latestBREE/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.tests.latestBREE/META-INF/MANIFEST.MF
@@ -12,6 +12,7 @@
  org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.jdt.annotation;bundle-version="[1.1.0,2.0.0)";resolution:=optional,
  org.eclipse.jdt.annotation;bundle-version="[2.0.0,3.0.0)";resolution:=optional,
+ org.eclipse.jdt.core.tests.model;bundle-version="[3.10.0,4.0.0)",
  org.eclipse.jdt.core.tests.compiler;bundle-version="[3.10.0,4.0.0)",
  javax.annotation
 Bundle-RequiredExecutionEnvironment: JavaSE-13
diff --git a/org.eclipse.jdt.tests.latestBREE/src/org/eclipse/jdt/core/tests/compiler/regression/latest/TestAll.java b/org.eclipse.jdt.tests.latestBREE/src/org/eclipse/jdt/core/tests/compiler/regression/latest/TestAll.java
index e8443b2..cdf4712 100644
--- a/org.eclipse.jdt.tests.latestBREE/src/org/eclipse/jdt/core/tests/compiler/regression/latest/TestAll.java
+++ b/org.eclipse.jdt.tests.latestBREE/src/org/eclipse/jdt/core/tests/compiler/regression/latest/TestAll.java
@@ -3,6 +3,7 @@
 import java.util.ArrayList;
 
 import org.eclipse.jdt.core.tests.junit.extension.TestCase;
+import org.eclipse.jdt.core.tests.model.CompletionTests13;
 import org.eclipse.jdt.core.tests.util.AbstractCompilerTest;
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 
@@ -20,6 +21,7 @@
 	// Common test suites
 	ArrayList standardTests = new ArrayList();
 	standardTests.add(TextBlockTest.class);
+	standardTests.add(CompletionTests13.class);
 	TestSuite all = new TestSuite(TestAll.class.getName());
 	int possibleComplianceLevels = AbstractCompilerTest.getPossibleComplianceLevels();
 	if ((possibleComplianceLevels & AbstractCompilerTest.F_13) != 0) {
diff --git a/org.eclipse.jdt.tests.latestBREE/src/org/eclipse/jdt/core/tests/model/CompletionTests13.java b/org.eclipse.jdt.tests.latestBREE/src/org/eclipse/jdt/core/tests/model/CompletionTests13.java
new file mode 100644
index 0000000..844da06
--- /dev/null
+++ b/org.eclipse.jdt.tests.latestBREE/src/org/eclipse/jdt/core/tests/model/CompletionTests13.java
@@ -0,0 +1,1555 @@
+/*******************************************************************************
+ * Copyright (c) 2019 IBM and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ *******************************************************************************/
+package org.eclipse.jdt.core.tests.model;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.codeassist.RelevanceConstants;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+
+import junit.framework.Test;
+
+@SuppressWarnings("preview")
+public class CompletionTests13 extends AbstractJavaModelCompletionTests {
+
+	static {
+//		TESTS_NAMES = new String[]{"test034"};
+	}
+
+	public CompletionTests13(String name) {
+		super(name);
+	}
+	public void setUpSuite() throws Exception {
+		if (COMPLETION_PROJECT == null)  {
+			COMPLETION_PROJECT = setUpJavaProject("Completion", "13");
+		} else {
+			setUpProjectCompliance(COMPLETION_PROJECT, "13");
+		}
+		super.setUpSuite();
+	}
+	public static Test suite() {
+		return buildModelTestSuite(CompletionTests13.class);
+	}
+	public void test001() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(MyDay day) {\n" + 
+						"		switch (day) {\n" + 
+						"		case SATURDAY, SUN ->\n" + 
+						"			System.out.println(day.toString());\n" + 
+						"		}\n" + 
+						"	}\n" + 
+						"	public static void main(String[] args) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n" + 
+				"enum MyDay { SATURDAY, SUNDAY}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "SATURDAY, SUN";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"SUNDAY[FIELD_REF]{SUNDAY, LMyDay;, LMyDay;, SUNDAY, null, "+ 
+						(RelevanceConstants.R_DEFAULT + RelevanceConstants.R_RESOLVED + RelevanceConstants.R_INTERESTING+
+								RelevanceConstants.R_CASE + RelevanceConstants.R_EXACT_EXPECTED_TYPE +
+								RelevanceConstants.R_ENUM + RelevanceConstants.R_ENUM_CONSTANT +
+								RelevanceConstants.R_UNQUALIFIED + RelevanceConstants.R_NON_RESTRICTED)+ "}",
+						requestor.getResults());
+	}
+	public void test002() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(MyDay day) {\n" + 
+						"		switch (day) {\n" + 
+						"		case SATURDAY, SUN :\n" + 
+						"			System.out.println(day.toString());\n" + 
+						"		}\n" + 
+						"	}\n" + 
+						"	public static void main(String[] args) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n" + 
+				"enum MyDay { SATURDAY, SUNDAY}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "SATURDAY, SUN";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"SUNDAY[FIELD_REF]{SUNDAY, LMyDay;, LMyDay;, SUNDAY, null, "+ 
+						(RelevanceConstants.R_DEFAULT + RelevanceConstants.R_RESOLVED + RelevanceConstants.R_INTERESTING+
+								RelevanceConstants.R_CASE + RelevanceConstants.R_EXACT_EXPECTED_TYPE +
+								RelevanceConstants.R_ENUM + RelevanceConstants.R_ENUM_CONSTANT +
+								RelevanceConstants.R_UNQUALIFIED + RelevanceConstants.R_NON_RESTRICTED)+ "}",
+						requestor.getResults());
+	}
+	public void test003() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(MyDay day) {\n" + 
+						"		switch (day) {\n" + 
+						"		case SATU -> \n" + 
+						"			System.out.println(day.toString());\n" + 
+						"		}\n" + 
+						"	}\n" + 
+						"	public static void main(String[] args) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n" + 
+				"enum MyDay { SATURDAY, SUNDAY}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "SATU";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"SATURDAY[FIELD_REF]{SATURDAY, LMyDay;, LMyDay;, SATURDAY, null, "+ 
+						(RelevanceConstants.R_DEFAULT + RelevanceConstants.R_RESOLVED + RelevanceConstants.R_INTERESTING+
+								RelevanceConstants.R_CASE + RelevanceConstants.R_EXACT_EXPECTED_TYPE +
+								RelevanceConstants.R_ENUM + RelevanceConstants.R_ENUM_CONSTANT +
+								RelevanceConstants.R_UNQUALIFIED + RelevanceConstants.R_NON_RESTRICTED)+ "}",
+						requestor.getResults());
+	}
+	public void test004() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(MyDay day) {\n" + 
+						"		switch (day) {\n" + 
+						"		case SATURDAY, SUNDAY, MOND -> \n" + 
+						"			System.out.println(day.toString());\n" + 
+						"		}\n" + 
+						"	}\n" + 
+						"	public static void main(String[] args) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n" + 
+				"enum MyDay { SATURDAY, SUNDAY, MONDAY}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "MOND";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"MONDAY[FIELD_REF]{MONDAY, LMyDay;, LMyDay;, MONDAY, null, "+ 
+						(RelevanceConstants.R_DEFAULT + RelevanceConstants.R_RESOLVED + RelevanceConstants.R_INTERESTING+
+								RelevanceConstants.R_CASE + RelevanceConstants.R_EXACT_EXPECTED_TYPE +
+								RelevanceConstants.R_ENUM + RelevanceConstants.R_ENUM_CONSTANT +
+								RelevanceConstants.R_UNQUALIFIED + RelevanceConstants.R_NON_RESTRICTED)+ "}",
+						requestor.getResults());
+	}
+	public void test005() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(MyDay day) {\n" + 
+						"		switch (day) {\n" + 
+						"		case SATURDAY, SUND, MONDAY -> \n" + 
+						"			System.out.println(day.toString());\n" + 
+						"		}\n" + 
+						"	}\n" + 
+						"	public static void main(String[] args) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n" + 
+				"enum MyDay { SATURDAY, SUNDAY, MONDAY}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "SUND";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"SUNDAY[FIELD_REF]{SUNDAY, LMyDay;, LMyDay;, SUNDAY, null, "+ 
+						(RelevanceConstants.R_DEFAULT + RelevanceConstants.R_RESOLVED + RelevanceConstants.R_INTERESTING+
+								RelevanceConstants.R_CASE + RelevanceConstants.R_EXACT_EXPECTED_TYPE +
+								RelevanceConstants.R_ENUM + RelevanceConstants.R_ENUM_CONSTANT +
+								RelevanceConstants.R_UNQUALIFIED + RelevanceConstants.R_NON_RESTRICTED)+ "}",
+						requestor.getResults());
+	}
+	public void test005a() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(MyDay day) {\n" + 
+						"		switch (day) {\n" + 
+						"		case SATURDAY, SUNDAY -> \n" + 
+						"			System.out.println(day.toString());\n" + 
+						"		case MON -> \n" + 
+						"			System.out.println(day.toString());\n" + 
+						"		}\n" + 
+						"	}\n" + 
+						"	public static void main(String[] args) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n" + 
+				"enum MyDay { SATURDAY, SUNDAY, MONDAY}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "case MON";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"MONDAY[FIELD_REF]{MONDAY, LMyDay;, LMyDay;, MONDAY, null, "+ 
+						(RelevanceConstants.R_DEFAULT + RelevanceConstants.R_RESOLVED + RelevanceConstants.R_INTERESTING+
+								RelevanceConstants.R_CASE + RelevanceConstants.R_EXACT_EXPECTED_TYPE +
+								RelevanceConstants.R_ENUM + RelevanceConstants.R_ENUM_CONSTANT +
+								RelevanceConstants.R_UNQUALIFIED + RelevanceConstants.R_NON_RESTRICTED)+ "}",
+						requestor.getResults());
+	}
+	public void test006() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				""" 
+					public class Switch { 
+						public static void bar(MyDay day) {
+							switch (day.toS) {
+							case "SATURDAY" -> 
+								System.out.println(day.toString());
+							}
+						}
+						public static void main(String[] args) {
+							bar(MyDay.SUNDAY);
+						}
+					}
+					enum MyDay { SATURDAY, SUNDAY}
+					"""
+							);
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "day.toS";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, 60}",
+						requestor.getResults());
+	}
+	public void test007() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(MyDay day) {\n" + 
+						"		switch (day.o) {\n" + 
+						"		case 0 -> \n" + 
+						"			System.out.println(day.toString());\n" + 
+						"		}\n" + 
+						"	}\n" + 
+						"	public static void main(String[] args) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n" + 
+						"enum MyDay { SATURDAY, SUNDAY}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "day.o";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"ordinal[METHOD_REF]{ordinal(), Ljava.lang.Enum<LMyDay;>;, ()I, ordinal, null, 60}",
+						requestor.getResults());
+	}
+	public void test008() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(MyDay day) {\n" + 
+						"		switch (1 + day.o) {\n" + 
+						"		case 0 -> \n" + 
+						"			System.out.println(day.toString());\n" + 
+						"		}\n" + 
+						"	}\n" + 
+						"	public static void main(String[] args) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n" + 
+						"enum MyDay { SATURDAY, SUNDAY}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "day.o";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"ordinal[METHOD_REF]{ordinal(), Ljava.lang.Enum<LMyDay;>;, ()I, ordinal, null, 90}",
+						requestor.getResults());
+	}
+	public void test009() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(MyDay day) {\n" + 
+						"		switch (1 + da) {\n" + 
+						"		case 0 -> \n" + 
+						"			System.out.println(day.toString());\n" + 
+						"		}\n" + 
+						"	}\n" + 
+						"	public static void main(String[] args) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n" + 
+						"enum MyDay { SATURDAY, SUNDAY}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "1 + da";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"day[LOCAL_VARIABLE_REF]{day, null, LMyDay;, day, null, 52}",
+						requestor.getResults());
+	}
+	public void test010() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(MyDay day) {\n" + 
+						"		switch (1 + da + 1) {\n" + 
+						"		case 0 -> \n" + 
+						"			System.out.println(day.toString());\n" + 
+						"		}\n" + 
+						"	}\n" + 
+						"	public static void main(String[] args) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n" + 
+						"enum MyDay { SATURDAY, SUNDAY}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "1 + da";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"day[LOCAL_VARIABLE_REF]{day, null, LMyDay;, day, null, 52}",
+						requestor.getResults());
+	}
+	public void test011() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(int arg0) {\n" + 
+						"		foo(\n" + 
+						"		switch (arg) {\n" + 
+						"		case 1 -> 1;\n" + 
+						"		default -> 0;\n" +
+						"		}\n" + 
+						"	});\n" + 
+						"	public static void foo(int arg0) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "switch (arg";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"arg0[LOCAL_VARIABLE_REF]{arg0, null, I, arg0, null, 52}",
+						requestor.getResults());
+	}
+	public void test012() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(int arg0) {\n" + 
+						"		foo(\n" + 
+						"		switch (arg0) {\n" + 
+						"		case 1 -> arg;\n" + 
+						"		default -> 0;\n" +
+						"		}\n" + 
+						"	});\n" + 
+						"	public static void foo(int arg0) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "-> arg";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"arg0[LOCAL_VARIABLE_REF]{arg0, null, I, arg0, null, 52}",
+						requestor.getResults());
+	}
+	public void test013() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Switch.java",
+				"public class Switch {\n" + 
+						"	public static void bar(int arg0) {\n" + 
+						"		foo(\n" + 
+						"		switch (0 + arg) {\n" + 
+						"		case 1 -> 1;\n" + 
+						"		default -> 0;\n" +
+						"		}\n" + 
+						"	});\n" + 
+						"	public static void foo(int arg0) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "0 + arg";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"arg0[LOCAL_VARIABLE_REF]{arg0, null, I, arg0, null, 82}",
+						requestor.getResults());
+	}
+	public void test014() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"public class X {\n" + 
+						"	public static void bar(int arg0) {\n" + 
+						"		foo(\n" + 
+						"		swi);\n" + 
+						"	public static void foo(int arg0) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "swi";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"switch[KEYWORD]{switch, null, null, switch, null, 49}",
+						requestor.getResults());
+	}
+	public void test015() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"""
+				public class Switch {
+					public static void bar(int arg0) {
+						pointer: foo(
+						switch (0 + arg0) {
+							case 1 -> {break ;}
+							default -> 0;
+						}
+					});
+					public static void foo(int arg0) {
+						bar(MyDay.SUNDAY);
+					}
+				}""");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "break ";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"pointer[LABEL_REF]{pointer, null, null, pointer, null, 49}",
+						requestor.getResults());
+	}
+	public void test016() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"public class Switch {\n" + 
+						"	public static void bar(int arg0) {\n" + 
+						"		foo(\n" + 
+						"		switch (0 + arg0) {\n" + 
+						"		case 1 -> {break 1;}\n" + 
+						"		default -> ar;\n" +
+						"		}\n" + 
+						"	});\n" + 
+						"	public static void foo(int arg0) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "-> ar";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"arg0[LOCAL_VARIABLE_REF]{arg0, null, I, arg0, null, 52}",
+						requestor.getResults());
+	}
+	public void test017() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"""
+				public class Switch {
+					public static void bar(int arg0) {
+						int arg1 = 0;
+						pointer: foo(
+						switch (0 + arg0) {
+						case 1 -> 1;
+						default -> {break p;}
+						}
+					});
+					public static void foo(int arg0) {
+						bar(MyDay.SUNDAY);
+					}
+				}""");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "break p";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"pointer[LABEL_REF]{pointer, null, null, pointer, null, 49}",
+						requestor.getResults());
+	}
+	public void test017a() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"public class Switch {\n" + 
+						"	public static void bar(int arg0) {\n" + 
+						"		foo(\n" + 
+						"		argLabel: switch (0 + arg0) {\n" + 
+						"		case 1 -> 1;\n" + 
+						"		default -> {break ar;}\n" +
+						"		}\n" + 
+						"	});\n" + 
+						"	public static void foo(int arg0) {\n" + 
+						"		bar(MyDay.SUNDAY);\n" + 
+						"	}\n" + 
+						"}\n");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "break ar";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"argLabel[LABEL_REF]{argLabel, null, null, argLabel, null, 49}",
+						requestor.getResults());
+	}
+	public void test018a() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"import org.eclipse.jdt.annotation.*;\n" + 
+				"import java.util.function.*;\n" + 
+				"interface IN0 {} \n" + 
+				"interface IN1 extends IN0 {} \n" + 
+				"interface IN2 extends IN0 {}\n" + 
+				"public class X {\n" + 
+				"	@NonNull IN1 n_1() { return new IN1() {}; } \n" + 
+				"	IN2 n_2() { return null; } \n" + 
+				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
+				"	void testSw(int i) { \n" + 
+				"		m(switch(i) { \n" + 
+				"			case 1 -> this::n_; \n" + 
+				"			case 2 -> () -> n1(); \n" + 
+				"			case 3 -> null; \n" + 
+				"			case 4 -> () -> n2(); \n" + 
+				"			default -> this::n2; }); \n" + 
+				"	}\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "this::n_";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"n_1[METHOD_NAME_REFERENCE]{n_1, LX;, ()LIN1;, n_1, null, 60}\n" + 
+				"n_2[METHOD_NAME_REFERENCE]{n_2, LX;, ()LIN2;, n_2, null, 60}",
+						requestor.getResults());
+	}
+	public void test018b() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"import org.eclipse.jdt.annotation.*;\n" + 
+				"interface IN0 {} \n" + 
+				"interface IN1 extends IN0 {} \n" + 
+				"interface IN2 extends IN0 {}\n" + 
+				"public class X {\n" + 
+				"	@NonNull IN1 n_1() { return new IN1() {}; } \n" + 
+				"	IN2 n_2() { return null; } \n" + 
+				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
+				"	void testSw(int i) { \n" + 
+				"		m(switch(i) { \n" + 
+				"			case 2 -> () -> n_; \n" + 
+				"	}\n" + 
+				"}\n" +
+				"interface Supplier<T> {\n" + 
+				"    T get();\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "-> n_";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"n_1[METHOD_REF]{n_1(), LX;, ()LIN1;, n_1, null, 52}\n" + 
+				"n_2[METHOD_REF]{n_2(), LX;, ()LIN2;, n_2, null, 52}",
+						requestor.getResults());
+	}
+	public void test018c() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"import org.eclipse.jdt.annotation.*;\n" + 
+				"interface IN0 {} \n" + 
+				"interface IN1 extends IN0 {} \n" + 
+				"interface IN2 extends IN0 {}\n" + 
+				"public class X {\n" + 
+				"	@NonNull IN1 n_1() { return new IN1() {}; } \n" + 
+				"	IN2 n_2() { return null; } \n" + 
+				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
+				"	void testSw(int i) { \n" + 
+				"		m(switch(i) { \n" + 
+				"			default -> this::n_; }); \n" + 
+				"	}\n" + 
+				"}\n" +
+				"interface Supplier<T> {\n" + 
+				"    T get();\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "this::n_";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"n_1[METHOD_NAME_REFERENCE]{n_1, LX;, ()LIN1;, n_1, null, 60}\n" + 
+				"n_2[METHOD_NAME_REFERENCE]{n_2, LX;, ()LIN2;, n_2, null, 60}",
+						requestor.getResults());
+	}
+	public void test018d() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"import org.eclipse.jdt.annotation.*;\n" + 
+				"interface IN0 {} \n" + 
+				"interface IN1 extends IN0 {} \n" + 
+				"interface IN2 extends IN0 {}\n" + 
+				"public class X {\n" + 
+				"	@NonNull IN1 n_1() { return new IN1() {}; } \n" + 
+				"	IN2 n_2() { return null; } \n" + 
+				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
+				"	void testSw(int i) { \n" + 
+				"		m(switch(i) { \n" + 
+				"			default -> () -> n_; }); \n" + 
+				"	}\n" + 
+				"}\n" +
+				"interface Supplier<T> {\n" + 
+				"    T get();\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "() -> n_";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"n_1[METHOD_REF]{n_1(), LX;, ()LIN1;, n_1, null, 52}\n" + 
+				"n_2[METHOD_REF]{n_2(), LX;, ()LIN2;, n_2, null, 52}",
+						requestor.getResults());
+	}
+	public void test018e() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"import org.eclipse.jdt.annotation.*;\n" + 
+				"interface IN0 {} \n" + 
+				"interface IN1 extends IN0 {} \n" + 
+				"interface IN2 extends IN0 {}\n" + 
+				"public class X {\n" + 
+				"	@NonNull IN1 n_1() { return new IN1() {}; } \n" + 
+				"	IN2 n_2() { return null; } \n" + 
+				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
+				"	void testSw(int i) { \n" + 
+				"		m(switch(i) { \n" + 
+				"			case 1 -> this::n_1; \n" + 
+				"			case 2 -> () -> n_; \n" + 
+				"	}\n" + 
+				"}\n" +
+				"interface Supplier<T> {\n" + 
+				"    T get();\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "() -> n_";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"n_1[LOCAL_VARIABLE_REF]{n_1, null, Ljava.lang.Object;, n_1, null, 51}\n" + 
+				"n_1[METHOD_REF]{n_1(), LX;, ()LIN1;, n_1, null, 52}\n" + 
+				"n_2[METHOD_REF]{n_2(), LX;, ()LIN2;, n_2, null, 52}",
+						requestor.getResults());
+	}
+	public void test018f() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"import org.eclipse.jdt.annotation.*;\n" + 
+				"interface IN0 {} \n" + 
+				"interface IN1 extends IN0 {} \n" + 
+				"interface IN2 extends IN0 {}\n" + 
+				"public class X {\n" + 
+				"	@NonNull IN1 n_1() { return new IN1() {}; } \n" + 
+				"	IN2 n_2() { return null; } \n" + 
+				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
+				"	void testSw(int i) { \n" + 
+				"		m(switch(i) { \n" + 
+				"			case 1 -> () -> n_1; \n" + 
+				"			case 2 -> this::n_; \n" + 
+				"	}\n" + 
+				"}\n" +
+				"interface Supplier<T> {\n" + 
+				"    T get();\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "this::n_";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"n_1[METHOD_NAME_REFERENCE]{n_1, LX;, ()LIN1;, n_1, null, 60}\n" + 
+				"n_2[METHOD_NAME_REFERENCE]{n_2, LX;, ()LIN2;, n_2, null, 60}",
+						requestor.getResults());
+	}
+	public void test019() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"import org.eclipse.jdt.annotation.*;\n" + 
+				"	<M> void m(@NonNull Supplier<@NonNull M> m2) { } \n" + 
+				"public class X {\n" + 
+				"	void testSw(int i) { \n" + 
+				"		m(swi);\n" + 
+				"}\n" +
+				"interface Supplier<T> {\n" + 
+				"    T get();\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "swi";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"switch[KEYWORD]{switch, null, null, switch, null, 49}",
+						requestor.getResults());
+	}
+	public void test020() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"public class X {\n" + 
+				"	static final String MONDAY = \"MONDAY\";\n" + 
+				"	static final String TUESDAY = \"TUESDAY\";\n" + 
+				"	static final String WEDNESDAY = \"WEDNESDAY\";\n" + 
+				"	static final String THURSDAY = \"THURSDAY\";\n" + 
+				"	static final String FRIDAY = \"FRIDAY\";\n" + 
+				"	static final String SATURDAY = \"SATURDAY\";\n" + 
+				"	static final String SUNDAY = \"SUNDAY\"; \n" + 
+				"	@SuppressWarnings(\"preview\")\n" + 
+				"	public static void main(String[] args) {\n" + 
+				"		String day = \"MONDAY\";\n" + 
+				"		switch (day) {\n" + 
+				"		    case MONDAY, FRIDAY, SUNDAY  -> System.out.println(6);\n" + 
+				"		    case TUESDAY           		 -> System.out.println(7);\n" + 
+				"		    case THURSDAY, SATURDAY     -> System.out.println(8);\n" + 
+				"		    case WEDNESDAY              -> System.out.println(9);\n" + 
+				"		}\n" + 
+				"		int k = switch (day) {\n" + 
+				"	    case MONDAY  -> throw new NullPointerException();\n" + 
+				"	    case TUESDAY -> 1;\n" + 
+				"	    case WEDNESDAY -> {break 10;}\n" + 
+				"	    default      -> {\n" + 
+				"	        int g = day.h();\n" + 
+				"	        int result = f(g);\n" + 
+				"	        break result;\n" + 
+				"	    }};\n" + 
+				"	}\n" + 
+				"	static int f(int k) {\n" + 
+				"		return k*k;\n" + 
+				"	}\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "day.h";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"hashCode[METHOD_REF]{hashCode, Ljava.lang.Object;, ()I, hashCode, null, 90}",
+						requestor.getResults());
+	}
+	public void test021() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"public class X {\n" + 
+				"	static final String MONDAY = \"MONDAY\";\n" + 
+				"	static final String TUESDAY = \"TUESDAY\";\n" + 
+				"	static final String WEDNESDAY = \"WEDNESDAY\";\n" + 
+				"	static final String THURSDAY = \"THURSDAY\";\n" + 
+				"	static final String FRIDAY = \"FRIDAY\";\n" + 
+				"	static final String SATURDAY = \"SATURDAY\";\n" + 
+				"	static final String SUNDAY = \"SUNDAY\"; \n" + 
+				"	@SuppressWarnings(\"preview\")\n" + 
+				"	public static void main(String[] args) {\n" + 
+				"		String day = \"MONDAY\";\n" + 
+				"		int k = switch (day) {\n" + 
+				"	    case MONDAY  -> throw new NullPointerException();\n" + 
+				"	    case TUESDAY -> 1;\n" + 
+				"	    case WEDNESDAY -> {break 10;}\n" + 
+				"	    default      -> {\n" + 
+				"	        int g = day.h();\n" + 
+				"	        int result = f(g);\n" + 
+				"	        break result;\n" + 
+				"	    }};\n" + 
+				"	}\n" + 
+				"	static int f(int k) {\n" + 
+				"		return k*k;\n" + 
+				"	}\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "day.h";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"hashCode[METHOD_REF]{hashCode, Ljava.lang.Object;, ()I, hashCode, null, 90}",
+						requestor.getResults());
+	}
+	/*
+	 * Try completion for break keyword inside switch expression - negative
+	 */
+	public void test022() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"public class X {\n" + 
+				"	static final String MONDAY = \"MONDAY\";\n" + 
+				"	static final String TUESDAY = \"TUESDAY\";\n" + 
+				"	static final String WEDNESDAY = \"WEDNESDAY\";\n" + 
+				"	@SuppressWarnings(\"preview\")\n" + 
+				"	public static void main(String[] args) {\n" + 
+				"		String day = \"MONDAY\";\n" + 
+				"		int k = switch (day) {\n" + 
+				"	    case MONDAY  -> throw new NullPointerException();\n" + 
+				"	    case TUESDAY -> 1;\n" + 
+				"	    case WEDNESDAY -> {br;}\n" + 
+				"	    default      -> {\n" + 
+				"	        int g = day.hashCode();\n" + 
+				"	        int result = f(g);\n" + 
+				"	        yield result;\n" + 
+				"	    }};\n" + 
+				"	}\n" + 
+				"	static int f(int k) {\n" + 
+				"		return k*k;\n" + 
+				"	}\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "case WEDNESDAY -> {br";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"break[KEYWORD]{break, null, null, break, null, 49}",
+						requestor.getResults());
+	}
+	/*
+	 * Try completion for yield keyword - positive
+	 */
+	public void test023() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"""
+					public class X {
+						@SuppressWarnings("preview")
+						public static void main(String[] args) {
+							String day = "MONDAY";
+							int k = switch (day) {
+						    case "M"  -> throw new NullPointerException();
+						    case "T" -> 1;
+						    case "W" -> {yi ;}
+						    default      -> {
+						        int g = day.hashCode();
+						        int result = f(g);
+						        yield result;
+						    }};
+						}
+						static int f(int k) {
+							return k*k;
+						}
+					}
+				""");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "case \"W\" -> {yi";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"yield[KEYWORD]{yield, null, null, yield, null, 49}",
+						requestor.getResults());
+	}
+	/*
+	 * Try completion for yield with identifier - positive
+	 */
+	public void test024() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"public class X {\n" + 
+				"	@SuppressWarnings(\"preview\")\n" + 
+				"	public static void main(String day) {\n" + 
+				"		int k = switch (day) {\n" + 
+				"	    default      -> {\n" + 
+				"	        int g = day.hashCode();\n" + 
+				"	        int result = f(g);\n" + 
+				"	        yield res;\n" + 
+				"	    }};\n" + 
+				"	}\n" + 
+				"	static int f(int k) {\n" + 
+				"		return k*k;\n" + 
+				"	}\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "yield res";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"result[LOCAL_VARIABLE_REF]{result, null, I, result, null, 52}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion for yield with identifier with a preceding case with yield - positive
+	 */
+	public void test024a() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"public class X {\n" + 
+				"	@SuppressWarnings(\"preview\")\n" + 
+				"	public static void main(String day) {\n" + 
+				"		int k = switch (day) {\n" + 
+				"	    case TUESDAY -> { yield 1;}\n" + 
+				"	    default      -> {\n" + 
+				"	        int g = day.hashCode();\n" + 
+				"	        int result = f(g);\n" + 
+				"	        yield res;\n" + 
+				"	    }};\n" + 
+				"	}\n" + 
+				"	static int f(int k) {\n" + 
+				"		return k*k;\n" + 
+				"	}\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "yield res";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"result[LOCAL_VARIABLE_REF]{result, null, I, result, null, 52}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion for yield with identifier with a preceding case with yield - positive
+	 */
+	public void test024b() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"public class X {\n" + 
+				"	@SuppressWarnings(\"preview\")\n" + 
+				"	public static void main(String day) {\n" + 
+				"		int k = switch (day) {\n" + 
+				"	    case TUESDAY -> { yield 1;}\n" + 
+				"	    default      -> {\n" + 
+				"	        int g = day.hashCode();\n" + 
+				"	        int result = f(g);\n" + 
+				"	        yield 0 + res;\n" + 
+				"	    }};\n" + 
+				"	}\n" + 
+				"	static int f(int k) {\n" + 
+				"		return k*k;\n" + 
+				"	}\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "yield 0 + res";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"result[LOCAL_VARIABLE_REF]{result, null, I, result, null, 52}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion in a switch expression case block without any assist keyword
+	 */
+	public void test024c() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"public class X {\n" + 
+				"	@SuppressWarnings(\"preview\")\n" + 
+				"	public static void main(String day) {\n" + 
+				"		int k = switch (day) {\n" + 
+				"	    case TUESDAY -> { yield 1;}\n" + 
+				"	    default      -> {\n" + 
+				"	        int[] g = new int[0];\n" + 
+				"	        yield g.;\n" + 
+				"	    }};\n" + 
+				"	}\n" + 
+				"	static int f(int k) {\n" + 
+				"		return k*k;\n" + 
+				"	}\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "yield g.";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"length[FIELD_REF]{length, [I, I, length, null, 49}\n" + 
+				"clone[METHOD_REF]{clone(), [I, ()[I, clone, null, 60}\n" + 
+				"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), 60}\n" + 
+				"finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 60}\n" + 
+				"getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class<+Ljava.lang.Object;>;, getClass, null, 60}\n" + 
+				"hashCode[METHOD_REF]{hashCode(), Ljava.lang.Object;, ()I, hashCode, null, 60}\n" + 
+				"notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 60}\n" + 
+				"notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 60}\n" + 
+				"toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, 60}\n" + 
+				"wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 60}\n" + 
+				"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 60}\n" + 
+				"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 60}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion in a switch expression case block without any assist keyword
+	 */
+	public void test024d() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"public class X {\n" + 
+				"	@SuppressWarnings(\"preview\")\n" + 
+				"	public static void main(String[] args) {\n" + 
+				"	String day = args[0];\n" + 
+				"		int k = switch (day) {\n" + 
+				"	    case TUESDAY -> { yield 1;}\n" + 
+				"	    default      -> {\n" + 
+				"	        int[] g = args.;\n" + 
+				"	        yield g;\n" + 
+				"	    }};\n" + 
+				"	}\n" + 
+				"	static int f(int k) {\n" + 
+				"		return k*k;\n" + 
+				"	}\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "int[] g = args.";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"length[FIELD_REF]{length, [Ljava.lang.String;, I, length, null, 49}\n" + 
+				"finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 55}\n" + 
+				"notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 55}\n" + 
+				"notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 55}\n" + 
+				"wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 55}\n" + 
+				"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 55}\n" + 
+				"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 55}\n" + 
+				"clone[METHOD_REF]{clone(), [Ljava.lang.String;, ()[Ljava.lang.String;, clone, null, 60}\n" + 
+				"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), 60}\n" + 
+				"getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class<+Ljava.lang.Object;>;, getClass, null, 60}\n" + 
+				"hashCode[METHOD_REF]{hashCode(), Ljava.lang.Object;, ()I, hashCode, null, 60}\n" + 
+				"toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, 60}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion for yield with value inside switch - positive
+	 * 
+	 */
+	public void test025() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"public class X {\n" + 
+				"	static final String MONDAY = \"MONDAY\";\n" + 
+				"	static final String TUESDAY = \"TUESDAY\";\n" + 
+				"	static final String WEDNESDAY = \"WEDNESDAY\";\n" + 
+				"	@SuppressWarnings(\"preview\")\n" + 
+				"	public static void main(String[] args) {\n" + 
+				"	 resolve: {" + 
+				"		String day = \"MONDAY\";\n" + 
+				"		int k = switch (day) {\n" + 
+				"	    case MONDAY  -> throw new NullPointerException();\n" + 
+				"	    case TUESDAY -> 1;\n" + 
+				"	    case WEDNESDAY -> {yield 10;}\n" + 
+				"	    default      -> {\n" + 
+				"	        yield day.h;\n" + 
+				"	    }};\n" + 
+				"	 }" + 
+				"	}\n" + 
+				"	static int f(int k) {\n" + 
+				"		return k*k;\n" + 
+				"	}\n" + 
+				"}");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "yield day.h";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"hashCode[METHOD_REF]{hashCode(), Ljava.lang.Object;, ()I, hashCode, null, 60}",
+						requestor.getResults());
+	}
+	/*
+	 * Try completion for yield keyword - inside nested block
+	 */
+	public void test026() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"""
+					public class X {
+						@SuppressWarnings("preview")
+						public static void main(String day) {
+							int k = switch (day) {
+						    case "W" -> {yield 2;}
+						    default      -> {
+						        int g = day.hashCode();
+						        int result = f(g);
+						        {
+						        	yie;
+						        }
+						    }};
+						}
+						static int f(int k) {
+							return k*k;
+						}
+					}
+				""");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "yie";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"yield[KEYWORD]{yield, null, null, yield, null, 49}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion for yield - inside nested block
+	 */
+	public void test027() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"""
+					public class X {
+						@SuppressWarnings("preview")
+						public static void main(String day) {
+							int k = switch (day) {
+						    case "W" -> {yield 2;}
+						    default      -> {
+						        int g = day.hashCode();
+						        int result = f(g);
+						        {
+						        	yield res;
+						        }
+						    }};
+						}
+						static int f(int k) {
+							return k*k;
+						}
+					}
+				""");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "yield res";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"result[LOCAL_VARIABLE_REF]{result, null, I, result, null, 52}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion for yield - inside nested block
+	 */
+	public void test028() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"""
+					public class X {
+						@SuppressWarnings("preview")
+						public static void main(String day) {
+							int k = switch (day) {
+						    case "W" -> {yield 2;}
+						    default      -> {
+						        int g = day.hashCode();
+						        int result = f(g);
+						        {
+						        	for(int i = 0; i < 3; i++) {
+						        		if (i == 0) {
+						        			yield day.h
+						        		}
+						        	}
+						        	yield 0;
+						        }
+						    }};
+						}
+						static int f(int k) {
+							return k*k;
+						}
+					}
+				""");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "yield day.h";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"hashCode[METHOD_REF]{hashCode(), Ljava.lang.Object;, ()I, hashCode, null, 60}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion of other keywords inside switch expression nested block
+	 */
+	public void test029() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"""
+					public class X {
+						@SuppressWarnings("preview")
+						public static void main(String day) {
+							int k = switch (day) {
+						    case "W" -> {yield 2;}
+						    default      -> {
+						        int g = day.hashCode();
+						        int result = f(g);
+						        {
+						        	for(int i = 0; i < 3; i++) {
+						        		if (i == 0) {
+						        			thr
+						        		}
+						        	}
+						        	yield 0;
+						        }
+						    }};
+						}
+						static int f(int k) {
+							return k*k;
+						}
+					}
+				""");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "thr";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"Throwable[TYPE_REF]{Throwable, java.lang, Ljava.lang.Throwable;, null, null, 42}\n" + 
+				"throw[KEYWORD]{throw, null, null, throw, null, 49}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion of other keywords inside switch expression nested block
+	 */
+	public void test030() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"""
+					public class X {
+						@SuppressWarnings("preview")
+						public static void main(String day) {
+							int k = switch (day) {
+						    case "W" -> {yield 2;}
+						    default      -> {
+						        int g = day.hashCode();
+						        int result = f(g);
+						        {
+						        	for(int i = 0; i < 3; i++) {
+						        		if (i == 0) {
+						        			throw Exc
+						        		}
+						        	}
+						        	yield 0;
+						        }
+						    }};
+						}
+						static int f(int k) {
+							return k*k;
+						}
+					}
+				""");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "throw Exc";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"Exception[TYPE_REF]{Exception, java.lang, Ljava.lang.Exception;, null, null, 52}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion inside a lambda nested inside a switch expression
+	 */
+	public void test031() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"""
+				public class X {
+					@SuppressWarnings("preview")
+					public static void main(String[] args) {
+						String day = "";
+						int i = switch (day) {
+						default -> {
+							for (int j = 0; j < 3; j++) {
+								if (j == 0) {
+									IntPredicate pre = (_value) -> !test(_v);
+									};
+								}
+							}
+							yield 0;
+						}
+						};
+					}
+					private static boolean test(int value) {
+						return false;
+					}
+				}
+				interface IntPredicate {
+					boolean test(int value);
+				}
+				""");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "test(_v";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"_value[LOCAL_VARIABLE_REF]{_value, null, I, _value, null, 52}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion inside a lambda (block) nested inside a switch expression
+	 */
+	public void test032() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"""
+				public class X {
+					@SuppressWarnings("preview")
+					public static void main(String[] args) {
+						String day = "";
+						int i = switch (day) {
+						default -> {
+							for (int j = 0; j < 3; j++) {
+								if (j == 0) {
+									IntPredicate pre = (_value) -> {
+										return !test(_v);
+									};
+								}
+							}
+							yield 0;
+						}
+						};
+					}
+					private static boolean test(int value) {
+						return false;
+					}
+				}
+				interface IntPredicate {
+					boolean test(int value);
+				}
+				""");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "test(_v";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"_value[LOCAL_VARIABLE_REF]{_value, null, I, _value, null, 52}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion inside a switch expression nested inside a lambda expression
+	 */
+	public void test033() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"""
+				public class X {
+					@SuppressWarnings("preview")
+					public static void main(String[] args) {
+						IntPredicate pre = (_value) -> !test(
+								switch (_value) {
+									default -> {
+										yield _v;
+									}
+								}
+								);
+					}
+					private static boolean test(int value) {
+						return false;
+					}
+				}
+				interface IntPredicate {
+					boolean test(int value);
+				}
+				""");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "yield _v";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"_value[LOCAL_VARIABLE_REF]{_value, null, I, _value, null, 52}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+	/*
+	 * Try completion inside a switch expression nested inside a lambda expression
+	 */
+	public void test034() throws JavaModelException {
+		String old = COMPLETION_PROJECT.getOption(CompilerOptions.OPTION_EnablePreviews, true);
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/X.java",
+				"""
+				public class X {
+					@SuppressWarnings("preview")
+					public static void main(String[] args) {
+						IntPredicate pre = (_value) -> {
+							return !test(
+								switch (_value) {
+									default -> {
+										yield _v;
+									}
+								}
+								);
+						};
+					}
+					private static boolean test(int value) {
+						return false;
+					}
+				}
+				interface IntPredicate {
+					boolean test(int value);
+				}
+				""");
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "yield _v";
+		int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults(
+				"_value[LOCAL_VARIABLE_REF]{_value, null, I, _value, null, 52}",
+						requestor.getResults());
+		COMPLETION_PROJECT.setOption(CompilerOptions.OPTION_EnablePreviews, old);
+	}
+}