Bug 573943 - [17][switch pattern][search] Search changes for JEP 406

There are 2 main changes done here. 

First is the addition of local variable declaration of the case
statement for SelectionParser in buildInitialRecoveryState.
Second is the searching for the type pattern variable of CaseStatement
in MatchLocatorParser 
Both the changes are required in selecting a pattern variable in case
statement as well as looking for the declaration of the same.

Change-Id: Ie453a6609ccf52d629dfbe034f2db79015dd1e5e
Signed-off-by: Vikas Chandra <Vikas.Chandra@in.ibm.com>
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.core/+/182644
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs17Tests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs17Tests.java
new file mode 100644
index 0000000..9d75637
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs17Tests.java
@@ -0,0 +1,1255 @@
+/*******************************************************************************
+ * Copyright (c) 2021 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * 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
+ *******************************************************************************/
+package org.eclipse.jdt.core.tests.model;
+
+import java.io.IOException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.ILocalVariable;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.WorkingCopyOwner;
+import org.eclipse.jdt.core.search.IJavaSearchConstants;
+import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.core.search.ReferenceMatch;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.core.search.SearchMatch;
+import org.eclipse.jdt.core.search.SearchPattern;
+import org.eclipse.jdt.core.search.TypeReferenceMatch;
+import org.eclipse.jdt.internal.core.LocalVariable;
+import org.eclipse.jdt.internal.core.SourceField;
+
+import junit.framework.Test;
+
+public class JavaSearchBugs17Tests extends AbstractJavaSearchTests {
+
+	static {
+		// org.eclipse.jdt.internal.core.search.BasicSearchEngine.VERBOSE = true;
+		// TESTS_NUMBERS = new int[] { 19 };
+		// TESTS_RANGE = new int[] { 1, -1 };
+		// TESTS_NAMES = new String[] {"testBug542559_001"};
+	}
+
+	public JavaSearchBugs17Tests(String name) {
+		super(name);
+		this.endChar = "";
+	}
+
+	public static Test suite() {
+		return buildModelTestSuite(JavaSearchBugs17Tests.class, BYTECODE_DECLARATION_ORDER);
+	}
+
+	class TestCollector extends JavaSearchResultCollector {
+		public void acceptSearchMatch(SearchMatch searchMatch) throws CoreException {
+			super.acceptSearchMatch(searchMatch);
+		}
+	}
+
+	class ReferenceCollector extends JavaSearchResultCollector {
+		protected void writeLine() throws CoreException {
+			super.writeLine();
+			ReferenceMatch refMatch = (ReferenceMatch) this.match;
+			IJavaElement localElement = refMatch.getLocalElement();
+			if (localElement != null) {
+				this.line.append("+[");
+				if (localElement.getElementType() == IJavaElement.ANNOTATION) {
+					this.line.append('@');
+					this.line.append(localElement.getElementName());
+					this.line.append(" on ");
+					this.line.append(localElement.getParent().getElementName());
+				} else {
+					this.line.append(localElement.getElementName());
+				}
+				this.line.append(']');
+			}
+		}
+	}
+
+	class TypeReferenceCollector extends ReferenceCollector {
+		protected void writeLine() throws CoreException {
+			super.writeLine();
+			TypeReferenceMatch typeRefMatch = (TypeReferenceMatch) this.match;
+			IJavaElement[] others = typeRefMatch.getOtherElements();
+			int length = others == null ? 0 : others.length;
+			if (length > 0) {
+				this.line.append("+[");
+				for (int i = 0; i < length; i++) {
+					IJavaElement other = others[i];
+					if (i > 0)
+						this.line.append(',');
+					if (other.getElementType() == IJavaElement.ANNOTATION) {
+						this.line.append('@');
+						this.line.append(other.getElementName());
+						this.line.append(" on ");
+						this.line.append(other.getParent().getElementName());
+					} else {
+						this.line.append(other.getElementName());
+					}
+				}
+				this.line.append(']');
+			}
+		}
+	}
+
+	protected IJavaProject setUpJavaProject(final String projectName, String compliance, boolean useFullJCL)
+			throws CoreException, IOException {
+		// copy files in project from source workspace to target workspace
+		IJavaProject setUpJavaProject = super.setUpJavaProject(projectName, compliance, useFullJCL);
+		return setUpJavaProject;
+	}
+
+	IJavaSearchScope getJavaSearchScope() {
+		return SearchEngine.createJavaSearchScope(new IJavaProject[] { getJavaProject("JavaSearchBugs") });
+	}
+
+	IJavaSearchScope getJavaSearchScopeBugs(String packageName, boolean addSubpackages) throws JavaModelException {
+		if (packageName == null)
+			return getJavaSearchScope();
+		return getJavaSearchPackageScope("JavaSearchBugs", packageName, addSubpackages);
+	}
+
+	public ICompilationUnit getWorkingCopy(String path, String source) throws JavaModelException {
+		if (this.wcOwner == null) {
+			this.wcOwner = new WorkingCopyOwner() {
+			};
+		}
+		return getWorkingCopy(path, source, this.wcOwner);
+	}
+
+	@Override
+	public void setUpSuite() throws Exception {
+		super.setUpSuite();
+		JAVA_PROJECT = setUpJavaProject("JavaSearchBugs", "17");
+	}
+
+	public void tearDownSuite() throws Exception {
+		deleteProject("JavaSearchBugs");
+		super.tearDownSuite();
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.resultCollector = new TestCollector();
+		this.resultCollector.showAccuracy(true);
+	}
+
+	// switch pattern search - test reference of an object in case statement
+	public void testBug573943_001() throws CoreException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+				"public class X {\n" +
+						"public static void main(String[] args) {\n" +
+						"foo(Integer.valueOf(5));\n" +
+						"foo(new Object());\n" +
+						"}\n" +
+						"private static void foo(Object o) {\n" +
+						" switch (o) {\n" +
+						"	case Integer i     -> System.out.println(\"Integer:\" + i);\n" +
+						"	case String /*here*/s     -> System.out.println(\"String:\" + s + s);\n" +
+						"	default       -> System.out.println(\"Object\" + o);\n" +
+						" 	}\n" +
+						"}\n" +
+						"}\n"
+				);
+		IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+		// working copies
+		String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+		try {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+			String str = this.workingCopies[0].getSource();
+			String selection = "/*here*/s";
+			int start = str.indexOf(selection);
+			int length = selection.length();
+
+			IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+			ILocalVariable local = (ILocalVariable) elements[0];
+			search(local, REFERENCES, EXACT_RULE);
+			assertSearchResults("src/X.java void X.foo(Object) [s] EXACT_MATCH\n"
+					+ "src/X.java void X.foo(Object) [s] EXACT_MATCH");
+		} finally {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+		}
+	}
+	// find reference on a field in switch pattern
+	public void testBug573943_002() throws CoreException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+				"public class X {\n" +
+						"public static  int /*here*/field \n" +
+						"public static void main(String[] args) {\n" +
+						"foo(Integer.valueOf(5));\n" +
+						"foo(new Object());\n" +
+						"}\n" +
+						"private static void foo(Object o) {\n" +
+						" switch (o) {\n" +
+						"	case Integer i   -> System.out.println(\"Integer:\" + i);\n" +
+						"	case String s     -> System.out.println(\"String:\" + s + field);\n" +
+						"	default       -> System.out.println(\"Object\" + o);\n" +
+						" 	}\n" +
+						"}\n" +
+						"}\n"
+				);
+		IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+		// working copies
+		String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+		try {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+			String str = this.workingCopies[0].getSource();
+			String selection = "/*here*/field";
+			int start = str.indexOf(selection);
+			int length = selection.length();
+
+			IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+			SourceField field = (SourceField) elements[0];
+			search(field, REFERENCES, EXACT_RULE);
+			assertSearchResults("src/X.java void X.foo(Object) [field] EXACT_MATCH");
+		} finally {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+		}
+	}
+	// find all occurrence of a field in switch pattern
+	public void testBug573943_003() throws CoreException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+				"public class X {\n" +
+						"public static  int /*here*/field \n" +
+						"public static void main(String[] args) {\n" +
+						"foo(Integer.valueOf(5));\n" +
+						"foo(new Object());\n" +
+						"}\n" +
+						"private static void foo(Object o) {\n" +
+						" switch (o) {\n" +
+						"	case Integer i   -> System.out.println(\"Integer:\" + i);\n" +
+						"	case String s     -> System.out.println(\"String:\" + s + field);\n" +
+						"	default       -> System.out.println(\"Object\" + o);\n" +
+						" 	}\n" +
+						"}\n" +
+						"}\n"
+				);
+		IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+		// working copies
+		String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+		try {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+			String str = this.workingCopies[0].getSource();
+			String selection = "/*here*/field";
+			int start = str.indexOf(selection);
+			int length = selection.length();
+
+			IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+			SourceField field = (SourceField) elements[0];
+			search(field, ALL_OCCURRENCES, EXACT_RULE);
+			assertSearchResults("src/X.java X.field [field] EXACT_MATCH\n"
+					+ "src/X.java void X.foo(Object) [field] EXACT_MATCH");
+		} finally {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+		}
+	}
+
+	// find all reference of a local variable in switch pattern
+	public void testBug573943_004() throws CoreException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+				"public class X {\n" +
+						"public static  int /*here*/field \n" +
+						"public static void main(String[] args) {\n" +
+						"foo(Integer.valueOf(5));\n" +
+						"foo(new Object());\n" +
+						"}\n" +
+						"private static void foo(Object o) {\n" +
+						" int /*here*/local=0" +
+						" switch (o) {\n" +
+						"	case Integer i   -> System.out.println(\"Integer:\" + i);\n" +
+						"	case String s     -> System.out.println(\"String:\" + s + local);\n" +
+						"	default       -> System.out.println(\"Object\" + o);\n" +
+						" 	}\n" +
+						"}\n" +
+						"}\n"
+				);
+		IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+		// working copies
+		String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+		try {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+			String str = this.workingCopies[0].getSource();
+			String selection = "/*here*/local";
+			int start = str.indexOf(selection);
+			int length = selection.length();
+
+			IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+			ILocalVariable field = (ILocalVariable) elements[0];
+			search(field, REFERENCES, EXACT_RULE);
+			assertSearchResults("src/X.java void X.foo(Object) [local] EXACT_MATCH");
+		} finally {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+		}
+	}
+	// find all reference of a local variable in switch pattern
+	public void testBug573943_005() throws CoreException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+				"public class X {\n" +
+						"public static  int /*here*/field \n" +
+						"public static void main(String[] args) {\n" +
+						"foo(Integer.valueOf(5));\n" +
+						"foo(new Object());\n" +
+						"}\n" +
+						"private static void foo(Object o) {\n" +
+						" int /*here*/local=0" +
+						" switch (o) {\n" +
+						"	case Integer i   -> System.out.println(\"Integer:\" + i +local);\n" +
+						"	case String s     -> System.out.println(\"String:\" + s + local);\n" +
+						"	default       -> System.out.println(\"Object\" + o);\n" +
+						" 	}\n" +
+						"}\n" +
+						"}\n"
+				);
+		IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+		// working copies
+		String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+		try {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+			String str = this.workingCopies[0].getSource();
+			String selection = "/*here*/local";
+			int start = str.indexOf(selection);
+			int length = selection.length();
+
+			IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+			ILocalVariable field = (ILocalVariable) elements[0];
+			search(field, ALL_OCCURRENCES, EXACT_RULE);
+			assertSearchResults("src/X.java void X.foo(Object).local [local] EXACT_MATCH\n"
+					+ "src/X.java void X.foo(Object) [local] EXACT_MATCH\n"
+					+ "src/X.java void X.foo(Object) [local] EXACT_MATCH");
+		} finally {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+		}
+	}
+	// find all occurrence of a field in switch case statement and switch expression
+	public void testBug573943_006() throws CoreException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+				"public class X {\n" +
+						"public static  int /*here*/field \n" +
+						"public static void main(String[] args) {\n" +
+						"foo(Integer.valueOf(5));\n" +
+						"foo(new Object());\n" +
+						"}\n" +
+						"private static void foo(Object o) {\n" +
+						" switch (o) {\n" +
+						"	case Integer i && field > 0  -> System.out.println(\"Integer:\" + i);\n" +
+						"	case String s     -> System.out.println(\"String:\" + s + field);\n" +
+						"	default       -> System.out.println(\"Object\" + o);\n" +
+						" 	}\n" +
+						"}\n" +
+						"}\n"
+				);
+		IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+		// working copies
+		String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+		try {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+			String str = this.workingCopies[0].getSource();
+			String selection = "/*here*/field";
+			int start = str.indexOf(selection);
+			int length = selection.length();
+
+			IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+			SourceField field = (SourceField) elements[0];
+			search(field, ALL_OCCURRENCES, EXACT_RULE);
+			assertSearchResults("src/X.java X.field [field] EXACT_MATCH\n"
+					+ "src/X.java void X.foo(Object) [field] EXACT_MATCH\n"
+					+ "src/X.java void X.foo(Object) [field] EXACT_MATCH");
+		} finally {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+		}
+	}
+	// find all reference of a local variable in switch pattern amd case statements
+	public void testBug573943_007() throws CoreException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+				"public class X {\n" +
+						"public static  int /*here*/field \n" +
+						"public static void main(String[] args) {\n" +
+						"foo(Integer.valueOf(5));\n" +
+						"foo(new Object());\n" +
+						"}\n" +
+						"private static void foo(Object o) {\n" +
+						" int /*here*/local=0" +
+						" switch (o) {\n" +
+						"	case Integer i && local >9  -> System.out.println(\"Integer:\" + i +local);\n" +
+						"	case String s     -> System.out.println(\"String:\" + s + local);\n" +
+						"	default       -> System.out.println(\"Object\" + o);\n" +
+						" 	}\n" +
+						"}\n" +
+						"}\n"
+				);
+		IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+		// working copies
+		String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+		try {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+			String str = this.workingCopies[0].getSource();
+			String selection = "/*here*/local";
+			int start = str.indexOf(selection);
+			int length = selection.length();
+
+			IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+			ILocalVariable field = (ILocalVariable) elements[0];
+			search(field, ALL_OCCURRENCES, EXACT_RULE);
+			assertSearchResults("src/X.java void X.foo(Object).local [local] EXACT_MATCH\n"
+					+ "src/X.java void X.foo(Object) [local] EXACT_MATCH\n"
+					+ "src/X.java void X.foo(Object) [local] EXACT_MATCH\n"
+					+ "src/X.java void X.foo(Object) [local] EXACT_MATCH");
+		} finally {
+			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+		}
+	}
+	// switch pattern search - test reference of an object in case statement as well as switch expression
+		public void testBug573943_008() throws CoreException {
+			this.workingCopies = new ICompilationUnit[1];
+			this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+					"public class X {\n" +
+							"public static void main(String[] args) {\n" +
+							"foo(Integer.valueOf(5));\n" +
+							"foo(new Object());\n" +
+							"}\n" +
+							"private static void foo(Object o) {\n" +
+							" switch (o) {\n" +
+							"	case Integer i     -> System.out.println(\"Integer:\" + i);\n" +
+							"	case String /*here*/s && s.hashCode()>0    -> System.out.println(\"String:\" );\n" +
+							"	default       -> System.out.println(\"Object\" + o);\n" +
+							" 	}\n" +
+							"}\n" +
+							"}\n"
+					);
+			IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+			// working copies
+			String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+			try {
+				javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+				String str = this.workingCopies[0].getSource();
+				String selection = "/*here*/s";
+				int start = str.indexOf(selection);
+				int length = selection.length();
+
+				IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+				ILocalVariable local = (ILocalVariable) elements[0];
+				search(local, REFERENCES, EXACT_RULE);
+				assertSearchResults("src/X.java void X.foo(Object) [s] EXACT_MATCH");
+			} finally {
+				javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+			}
+		}
+
+		// switch pattern search - test reference of an custom class object in case statement
+		public void testBug573943_009() throws CoreException {
+			this.workingCopies = new ICompilationUnit[1];
+			this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+					"sealed interface I permits A, B {}\n" +
+					"final class A implements S {}\n" +
+					"final class B implements S {}\n" +
+					"public class X {\n" +
+							"public static void main(String[] args) {\n" +
+							"foo(new A());\n" +
+							"}\n" +
+							"private static void foo(S o) {\n" +
+							" switch (o) {\n" +
+							"	case A /*here*/a :     System.out.println(\"A:\" + a +a); break;\n" +
+							"	case B b :     System.out.println(\"B:\" + b);\n" +
+							"	default  : System.out.println(\"Object\" + o);\n" +
+							" 	}\n" +
+							"}\n" +
+							"}\n"
+					);
+			IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+			// working copies
+			String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+			try {
+				javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+				String str = this.workingCopies[0].getSource();
+				String selection = "/*here*/a";
+				int start = str.indexOf(selection);
+				int length = selection.length();
+
+				IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+				ILocalVariable local = (ILocalVariable) elements[0];
+				search(local, REFERENCES, EXACT_RULE);
+				assertSearchResults("src/X.java void X.foo(S) [a] EXACT_MATCH\n"
+						+ "src/X.java void X.foo(S) [a] EXACT_MATCH");
+			} finally {
+				javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+			}
+		}
+		// switch pattern search - test reference of an custom class object in case statement amd switch statement
+		public void testBug573943_010() throws CoreException {
+			this.workingCopies = new ICompilationUnit[1];
+			this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+					"sealed interface I permits A, B {}\n" +
+					"final class A implements S {}\n" +
+					"final class B implements S {}\n" +
+					"public class X {\n" +
+							"public static void main(String[] args) {\n" +
+							"foo(new A());\n" +
+							"}\n" +
+							"private static void foo(S o) {\n" +
+							" switch (o) {\n" +
+							"	case A /*here*/a && a.hashCode()> 0 :     System.out.println(\"A:\" + a +a); break;\n" +
+							"	case B b :     System.out.println(\"B:\" + b);\n" +
+							"	default  :     System.out.println(\"Object\" + o);\n" +
+							" 	}\n" +
+							"}\n" +
+							"}\n"
+					);
+			IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+			// working copies
+			String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+			try {
+				javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+				String str = this.workingCopies[0].getSource();
+				String selection = "/*here*/a";
+				int start = str.indexOf(selection);
+				int length = selection.length();
+
+				IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+				ILocalVariable local = (ILocalVariable) elements[0];
+				search(local, REFERENCES, EXACT_RULE);
+				assertSearchResults("src/X.java void X.foo(S) [a] EXACT_MATCH\n"
+						+ "src/X.java void X.foo(S) [a] EXACT_MATCH\n"
+						+ "src/X.java void X.foo(S) [a] EXACT_MATCH");
+			} finally {
+				javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+			}
+		}
+		// switch pattern search - test reference of an custom record object in case statement
+		public void testBug573943_011() throws CoreException {
+			this.workingCopies = new ICompilationUnit[1];
+			this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+					"sealed interface I permits A, B {}\n" +
+					"record A (int i) implements S {}\n" +
+					"record B (int i) implements S {}\n" +
+					"public class X {\n" +
+							"public static void main(String[] args) {\n" +
+							"foo(new A());\n" +
+							"}\n" +
+							"private static void foo(S o) {\n" +
+							" switch (o) {\n" +
+							"	case A /*here*/a :     System.out.println(\"A:\" + a +a); break;\n" +
+							"	case B b :     System.out.println(\"B:\" + b);break;\n" +
+							"	default   :    System.out.println(\"Object\" + o);\n" +
+							" 	}\n" +
+							"}\n" +
+							"}\n"
+					);
+			IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+			// working copies
+			String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+			try {
+				javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+				String str = this.workingCopies[0].getSource();
+				String selection = "/*here*/a";
+				int start = str.indexOf(selection);
+				int length = selection.length();
+
+				IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+				ILocalVariable local = (ILocalVariable) elements[0];
+				search(local, REFERENCES, EXACT_RULE);
+				assertSearchResults("src/X.java void X.foo(S) [a] EXACT_MATCH\n"
+						+ "src/X.java void X.foo(S) [a] EXACT_MATCH");
+			} finally {
+				javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+			}
+		}
+		// switch pattern search - test reference of an custom record object in case statement and switch statement
+				public void testBug573943_012() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"sealed interface I permits A, B {}\n" +
+							"record A (int i) implements S {}\n" +
+							"record B (int i) implements S {}\n" +
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(new A());\n" +
+									"}\n" +
+									"private static void foo(S o) {\n" +
+									" switch (o) {\n" +
+									"	case A /*here*/a && a.hashCode() :     System.out.println(\"A:\" + a +a); break;\n" +
+									"	case B b :     System.out.println(\"B:\" + b);\n" +
+									"	default  :     System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						String str = this.workingCopies[0].getSource();
+						String selection = "/*here*/a";
+						int start = str.indexOf(selection);
+						int length = selection.length();
+
+						IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+						ILocalVariable local = (ILocalVariable) elements[0];
+						search(local, REFERENCES, EXACT_RULE);
+						assertSearchResults("src/X.java void X.foo(S) [a] EXACT_MATCH\n"
+								+ "src/X.java void X.foo(S) [a] EXACT_MATCH\n"
+								+ "src/X.java void X.foo(S) [a] EXACT_MATCH");
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+				// switch pattern search - test reference of an custom class object in case statement and switch expression
+				public void testBug573943_013() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"sealed interface I permits A, B {}\n" +
+							"final class A implements S {}\n" +
+							"final class B implements S {}\n" +
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(new A());\n" +
+									"}\n" +
+									"private static int foo(S o) {\n" +
+									" switch (o) {\n" +
+									"	case A /*here*/a && a.hashCode()> 0 -> 1;\n" +
+									"	case B b ->2;\n" +
+									"	default  -> 3;\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						String str = this.workingCopies[0].getSource();
+						String selection = "/*here*/a";
+						int start = str.indexOf(selection);
+						int length = selection.length();
+
+						IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+						ILocalVariable local = (ILocalVariable) elements[0];
+						search(local, REFERENCES, EXACT_RULE);
+						assertSearchResults("src/X.java int X.foo(S) [a] EXACT_MATCH");
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+				// switch pattern search - test reference of an object in case statement as well as switch pattern
+				public void testBug573943_014() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(Integer.valueOf(5));\n" +
+									"foo(new Object());\n" +
+									"}\n" +
+									"private static void foo(Object o) {\n" +
+									" switch (o) {\n" +
+									"	case Integer i     : System.out.println(\"Integer:\" + i);break;\n" +
+									"	case String /*here*/s     : System.out.println(\"String:\" + s + s);break;\n" +
+									"	default       : System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						String str = this.workingCopies[0].getSource();
+						System.out.println(str);
+						String selection = "/*here*/s";
+						int start = str.indexOf(selection);
+						int length = selection.length();
+
+						IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+						ILocalVariable local = (ILocalVariable) elements[0];
+						search(local, REFERENCES, EXACT_RULE);
+						assertSearchResults("src/X.java void X.foo(Object) [s] EXACT_MATCH\n"
+								+ "src/X.java void X.foo(Object) [s] EXACT_MATCH");
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+				// switch pattern search - test reference of an object in case statement as well as switch pattern
+				public void testBug573943_015() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(Integer.valueOf(5));\n" +
+									"foo(new Object());\n" +
+									"}\n" +
+									"private static void foo(Object o) {\n" +
+									" switch (o) {\n" +
+									"	case Integer i     : System.out.println(\"Integer:\" + i);break;\n" +
+									"	case String /*here*/s && s.hashCode()>0    : System.out.println(\"String:\" );break;\n" +
+									"	default       : System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						String str = this.workingCopies[0].getSource();
+						String selection = "/*here*/s";
+						int start = str.indexOf(selection);
+						int length = selection.length();
+
+						IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+						ILocalVariable local = (ILocalVariable) elements[0];
+						search(local, REFERENCES, EXACT_RULE);
+						assertSearchResults("src/X.java void X.foo(Object) [s] EXACT_MATCH");
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+				// type reference with a switch expression pattern
+				// see testBug573943_012 for switch pattern and type reference
+				public void testBug573943_016() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"sealed interface I permits A, B {}\n" +
+							"final class A implements S {}\n" +
+							"final class B implements S {}\n" +
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(new A());\n" +
+									"}\n" +
+									"private static void foo(S o) {\n" +
+									" switch (o) {\n" +
+									"	case A /*here*/a ->     System.out.println(\"A:\" + a +a); \n" +
+									"	case B b ->    System.out.println(\"B:\" + b);\n" +
+									"	default  -> System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						String str = this.workingCopies[0].getSource();
+						String selection = "/*here*/a";
+						int start = str.indexOf(selection);
+						int length = selection.length();
+
+						IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+						ILocalVariable local = (ILocalVariable) elements[0];
+						search(local, REFERENCES, EXACT_RULE);
+						assertSearchResults("src/X.java void X.foo(S) [a] EXACT_MATCH\n"
+								+ "src/X.java void X.foo(S) [a] EXACT_MATCH");
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+
+				// type reference with a switch expression pattern
+				public void testBug573943_017() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"sealed interface I permits A, B {}\n" +
+							"final class A implements S {}\n" +
+							"final class B implements S {}\n" +
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(new A());\n" +
+									"}\n" +
+									"private static void foo(S o) {\n" +
+									" switch (o) {\n" +
+									"	case A /*here*/a && a.toString().length()>2 ->     System.out.println(\"A:\" + a +a); \n" +
+									"	case B b ->    System.out.println(\"B:\" + b);\n" +
+									"	default  -> System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						String str = this.workingCopies[0].getSource();
+						String selection = "/*here*/a";
+						int start = str.indexOf(selection);
+						int length = selection.length();
+
+						IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+						ILocalVariable local = (ILocalVariable) elements[0];
+						search(local, REFERENCES, EXACT_RULE);
+						assertSearchResults("src/X.java void X.foo(S) [a] EXACT_MATCH\n"
+									+"src/X.java void X.foo(S) [a] EXACT_MATCH\n"
+								+ "src/X.java void X.foo(S) [a] EXACT_MATCH");
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+				// selection of pattern variable in case statement and verify that it is local variable
+				public void testBug573943_018() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(Integer.valueOf(5));\n" +
+									"foo(new Object());\n" +
+									"}\n" +
+									"private static void foo(Object o) {\n" +
+									" switch (o) {\n" +
+									"	case Integer i     -> System.out.println(\"Integer:\" + i);\n" +
+									"	case String s     -> System.out.println(\"String:\" + /*here*/s + s);\n" +
+									"	default       -> System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						String str = this.workingCopies[0].getSource();
+						String selection = "/*here*/s";
+						int start = str.indexOf(selection);
+						int length = selection.length();
+
+						IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+						assertTrue(elements[0] instanceof LocalVariable);
+
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+				// selection of pattern variable in case statement and search for declaration
+				public void testBug573943_019() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(Integer.valueOf(5));\n" +
+									"foo(new Object());\n" +
+									"}\n" +
+									"private static void foo(Object o) {\n" +
+									" switch (o) {\n" +
+									"	case Integer i     -> System.out.println(\"Integer:\" + i);\n" +
+									"	case String s     -> System.out.println(\"String:\" + /*here*/s + s);\n" +
+									"	default       -> System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						String str = this.workingCopies[0].getSource();
+						String selection = "/*here*/s";
+						int start = str.indexOf(selection);
+						int length = selection.length();
+
+						IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+						ILocalVariable local = (ILocalVariable) elements[0];
+						search(local, DECLARATIONS, EXACT_RULE);
+						assertSearchResults("src/X.java void X.foo(Object).s [s] EXACT_MATCH");
+
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+				// selection of guarded pattern variable in case statement and verify that it is local variable
+				public void testBug573943_020() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(Integer.valueOf(5));\n" +
+									"foo(new Object());\n" +
+									"}\n" +
+									"private static void foo(Object o) {\n" +
+									" final int a=0; \n" +
+									" switch (o) {\n" +
+									"	case Integer i  && a > 5  -> System.out.println(\"Integer:\" + /*here*/i);\n" +
+									"	case String s     -> System.out.println(\"String:\" + s + s);\n" +
+									"	default       -> System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						String str = this.workingCopies[0].getSource();
+						String selection = "/*here*/i";
+						int start = str.indexOf(selection);
+						int length = selection.length();
+
+						IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+						assertTrue(elements[0] instanceof LocalVariable);
+
+
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+				// selection of pattern variable in case statement and search for declaration
+				public void testBug573943_021() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(Integer.valueOf(5));\n" +
+									"foo(new Object());\n" +
+									"}\n" +
+									"private static void foo(Object o) {\n" +
+									" final int a=0; \n" +
+									" switch (o) {\n" +
+									"	case Integer i  && a > 5  -> System.out.println(\"Integer:\" + /*here*/i);\n" +
+									"	case String s     -> System.out.println(\"String:\" + s + s);\n" +
+									"	default       -> System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						String str = this.workingCopies[0].getSource();
+						String selection = "/*here*/i";
+						int start = str.indexOf(selection);
+						int length = selection.length();
+
+						IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+						ILocalVariable local = (ILocalVariable) elements[0];
+						search(local, DECLARATIONS, EXACT_RULE);
+						assertSearchResults("src/X.java void X.foo(Object).i [i] EXACT_MATCH");
+
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+				//not a working copy test
+				public void testBug573943_022() throws Exception {
+					try {
+						IJavaProject project = createJavaProject("first", new String[] {"src"}, new String[] {"JCL17_LIB"}, "bin", "17");
+						project.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						project.open(null);
+						createFolder("/first/src/p1");
+						createFile("/first/src/p1/BClass.java",
+								"package p1;\n" +
+								"public class BClass {\n" +
+								"}\n"
+								);
+						createFile("/first/src/p1/X.java",
+								"package p1;\n" +
+										"public class X {\n" +
+										"public static void main(String[] args) {\n" +
+										"foo(Integer.valueOf(5));\n" +
+										"foo(new Object());\n" +
+										"}\n" +
+										"private static void foo(Object o) {\n" +
+										" switch (o) {\n" +
+										"	case BClass i   -> System.out.println(\"Integer:\" + i);\n" +
+										"	default       -> System.out.println(\"Object\" + o);\n" +
+										" 	}\n" +
+										"}\n" +
+										"}\n"
+								);
+						project.close();
+						project.open(null);
+						waitUntilIndexesReady();
+
+						SearchPattern pattern = SearchPattern.createPattern("BClass", IJavaSearchConstants.TYPE, REFERENCES, SearchPattern.R_EXACT_MATCH);
+						IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
+								{project});
+						search(pattern, scope, this.resultCollector);
+						assertSearchResults(
+								"src/p1/X.java void p1.X.foo(Object) [BClass] EXACT_MATCH",
+							this.resultCollector);
+					}
+					finally {
+
+						deleteProject("first");
+					}
+				}
+				// find reference on a field in switch pattern - without select
+				public void testBug573943_023() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"public class X {\n" +
+									"public static  int /*here*/fieldj17 \n" +
+									"public static void main(String[] args) {\n" +
+									"foo(Integer.valueOf(5));\n" +
+									"foo(new Object());\n" +
+									"}\n" +
+									"private static void foo(Object o) {\n" +
+									" switch (o) {\n" +
+									"	case Integer i   -> System.out.println(\"Integer:\" + i);\n" +
+									"	case String s     -> System.out.println(\"String:\" + s + fieldj17 +fieldj17);\n" +
+									"	default       -> System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+
+						search("fieldj17", FIELD, REFERENCES);
+						assertSearchResults("src/X.java void X.foo(Object) [fieldj17] EXACT_MATCH\n"
+								+ "src/X.java void X.foo(Object) [fieldj17] EXACT_MATCH");
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+					}
+				// find all occurrence on a field in switch pattern - without select
+				public void testBug573943_024() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"public class X {\n" +
+									"public static  int /*here*/fieldj17 \n" +
+									"public static void main(String[] args) {\n" +
+									"foo(Integer.valueOf(5));\n" +
+									"foo(new Object());\n" +
+									"}\n" +
+									"private static void foo(Object o) {\n" +
+									" switch (o) {\n" +
+									"	case Integer i   -> System.out.println(\"Integer:\" + i);\n" +
+									"	case String s     -> System.out.println(\"String:\" + s + fieldj17 +fieldj17);\n" +
+									"	default       -> System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+
+						search("fieldj17", FIELD, ALL_OCCURRENCES);
+						assertSearchResults("src/X.java X.fieldj17 [fieldj17] EXACT_MATCH\n"+
+								"src/X.java void X.foo(Object) [fieldj17] EXACT_MATCH\n"
+								+ "src/X.java void X.foo(Object) [fieldj17] EXACT_MATCH");
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+					}
+				// find all occurrence on a class in switch pattern - without select ( switch statement)
+				public void testBug573943_026() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"sealed interface I permits A17, B {}\n" +
+							"final class AJ17 implements S {}\n" +
+							"final class B implements S {}\n" +
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(new A());\n" +
+									"}\n" +
+									"private static void foo(S o) {\n" +
+									" switch (o) {\n" +
+									"	case AJ17 /*here*/a :     System.out.println(); break;\n" +
+									"	case B b :     System.out.println(\"B:\" + b);\n" +
+									"	default  : System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						search("AJ17", CLASS, ALL_OCCURRENCES);
+						assertSearchResults("src/X.java AJ17 [AJ17] EXACT_MATCH\n"
+								+ "src/X.java void X.foo(S) [AJ17] EXACT_MATCH");
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+				// find all reference on a class in switch pattern - without select ( Switch Statement)
+				public void testBug573943_027() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"sealed interface I permits A17, B {}\n" +
+							"final class AJ17 implements S {}\n" +
+							"final class B implements S {}\n" +
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(new A());\n" +
+									"}\n" +
+									"private static void foo(S o) {\n" +
+									" switch (o) {\n" +
+									"	case AJ17 /*here*/a :     System.out.println(); break;\n" +
+									"	case B b :     System.out.println(\"B:\" + b);\n" +
+									"	default  : System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						search("AJ17", CLASS, REFERENCES);
+						assertSearchResults("src/X.java void X.foo(S) [AJ17] EXACT_MATCH");
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+				// find all reference on a class in switch pattern - without select
+				public void testBug573943_028() throws CoreException {
+					this.workingCopies = new ICompilationUnit[1];
+					this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/X.java",
+							"sealed interface I permits A17, B {}\n" +
+							"final class AJ17 implements S {}\n" +
+							"final class B implements S {}\n" +
+							"public class X {\n" +
+									"public static void main(String[] args) {\n" +
+									"foo(new A());\n" +
+									"}\n" +
+									"private static void foo(S o) {\n" +
+									" switch (o) {\n" +
+									"	case AJ17 /*here*/a ->     System.out.println(); \n" +
+									"	case B b ->     System.out.println(\"B:\" + b);\n" +
+									"	default  -> System.out.println(\"Object\" + o);\n" +
+									" 	}\n" +
+									"}\n" +
+									"}\n"
+							);
+					IJavaProject javaProject = this.workingCopies[0].getJavaProject(); // assuming single project for all
+					// working copies
+					String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+					try {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						search("AJ17", CLASS, REFERENCES);
+						assertSearchResults("src/X.java void X.foo(S) [AJ17] EXACT_MATCH");
+					} finally {
+						javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+					}
+				}
+				// find all occurrence on a class in switch pattern - without select
+				public void testBug573943_029() throws Exception {
+					try {
+						IJavaProject project = createJavaProject("first", new String[] {"src"}, new String[] {"JCL17_LIB"}, "bin", "17");
+						project.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						project.open(null);
+						createFolder("/first/src/p1");
+						createFile("/first/src/p1/BClass.java",
+								"package p1;\n" +
+								"public class BClass {\n" +
+								"}\n"
+								);
+						createFile("/first/src/p1/X.java",
+								"package p1;\n" +
+										"public class X {\n" +
+										" public int field_j17; "+
+										"public static void main(String[] args) {\n" +
+										"foo(Integer.valueOf(5));\n" +
+										"foo(new Object());\n" +
+										"}\n" +
+										"private static void foo(Object o) {\n" +
+										" switch (o) {\n" +
+										"	case BClass i && field_j17>0  -> System.out.println(\"Integer:\" + i);\n" +
+										"	default       -> System.out.println(\"Object\" + o);\n" +
+										" 	}\n" +
+										"}\n" +
+										"}\n"
+								);
+						project.close();
+						project.open(null);
+						waitUntilIndexesReady();
+
+						SearchPattern pattern = SearchPattern.createPattern("field_j17", IJavaSearchConstants.FIELD, ALL_OCCURRENCES, SearchPattern.R_EXACT_MATCH);
+						IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
+								{project});
+						search(pattern, scope, this.resultCollector);
+						assertSearchResults(
+								"src/p1/X.java p1.X.field_j17 [field_j17] EXACT_MATCH\n"
+								+ "src/p1/X.java void p1.X.foo(Object) [field_j17] EXACT_MATCH",
+							this.resultCollector);
+					}
+					finally {
+
+						deleteProject("first");
+					}
+				}
+				// find all references on a class in switch pattern - without select
+				public void testBug573943_030() throws Exception {
+					try {
+						IJavaProject project = createJavaProject("first", new String[] {"src"}, new String[] {"JCL17_LIB"}, "bin", "17");
+						project.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+						project.open(null);
+						createFolder("/first/src/p1");
+						createFile("/first/src/p1/BClass.java",
+								"package p1;\n" +
+								"public class BClass {\n" +
+								"}\n"
+								);
+						createFile("/first/src/p1/X.java",
+								"package p1;\n" +
+										"public class X {\n" +
+										" public int field_j17; "+
+										"public static void main(String[] args) {\n" +
+										"foo(Integer.valueOf(5));\n" +
+										"foo(new Object());\n" +
+										"}\n" +
+										"private static void foo(Object o) {\n" +
+										" switch (o) {\n" +
+										"	case BClass i && field_j17>0  -> System.out.println(\"Integer:\" + i);\n" +
+										"	default       -> System.out.println(\"Object\" + o);\n" +
+										" 	}\n" +
+										"}\n" +
+										"}\n"
+								);
+						project.close();
+						project.open(null);
+						waitUntilIndexesReady();
+
+						SearchPattern pattern = SearchPattern.createPattern("field_j17", IJavaSearchConstants.FIELD, REFERENCES, SearchPattern.R_EXACT_MATCH);
+						IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
+								{project});
+						search(pattern, scope, this.resultCollector);
+						assertSearchResults(
+								"src/p1/X.java void p1.X.foo(Object) [field_j17] EXACT_MATCH",
+							this.resultCollector);
+					}
+					finally {
+
+						deleteProject("first");
+					}
+				}
+}
+
+
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunJavaSearchTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunJavaSearchTests.java
index 131c537..4d71f79 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunJavaSearchTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/RunJavaSearchTests.java
@@ -69,6 +69,7 @@
 		allClasses.add(JavaSearchBugs13Tests.class);
 		allClasses.add(JavaSearchBugs15Tests.class);
 		allClasses.add(JavaSearchBugs16Tests.class);
+		allClasses.add(JavaSearchBugs17Tests.class);
 		allClasses.add(JavaSearchMultipleProjectsTests.class);
 		allClasses.add(SearchTests.class);
 		allClasses.add(JavaSearchScopeTests.class);
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 f6b29f0..5aeb4b0 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
  *******************************************************************************/
@@ -27,6 +31,7 @@
 import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;
 import org.eclipse.jdt.internal.compiler.ast.Annotation;
 import org.eclipse.jdt.internal.compiler.ast.Block;
+import org.eclipse.jdt.internal.compiler.ast.CaseStatement;
 import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
 import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;
 import org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;
@@ -349,9 +354,15 @@
 					element = element.add(stmt, 0);
 					this.lastCheckPoint = stmt.sourceEnd + 1;
 				} else if (stmt.containsPatternVariable()) {
+					LocalDeclaration localDeclaration = null;
+					if(stmt instanceof CaseStatement) {
+						localDeclaration = ((CaseStatement)stmt).getLocalDeclaration();
+						if(localDeclaration !=null)
+							element.add(localDeclaration, 0);
+					}
 					element.add(stmt, 0);
 					this.lastCheckPoint = stmt.sourceEnd + 1;
-					this.isOrphanCompletionNode = false;
+					this.isOrphanCompletionNode = localDeclaration !=null;
 				}
 			}
 			continue;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CaseStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CaseStatement.java
index c7f3a1f..b560bcf 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CaseStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CaseStatement.java
@@ -427,4 +427,15 @@
 	}
 	visitor.endVisit(this, blockScope);
 }
+/**
+ * @noreference This method is not intended to be referenced by clients.
+ * To be used in SelectionParser/AssistParser only if containsPatternVariable is positive
+ * @return local declaration in the type pattern if any else null
+ */
+public LocalDeclaration getLocalDeclaration() {
+	Expression cexp = this.constantExpressions[this.patternIndex];
+	LocalDeclaration patternVariableIntroduced = cexp.getPatternVariableIntroduced();
+	return patternVariableIntroduced;
+}
+
 }
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java
index 9e5e3be..ee685c8 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -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
  *******************************************************************************/
@@ -829,6 +833,17 @@
 }
 
 @Override
+protected void consumeTypePattern() {
+	super.consumeTypePattern();
+	if (this.patternFineGrain == 0) {
+		TypePattern td = (TypePattern) this.astStack[this.astPtr];
+		if (td.local != null) {
+			this.patternLocator.match(td.local, this.nodeSet);
+		}
+	}
+}
+
+@Override
 protected void consumeTypeParameterWithExtendsAndBounds() {
 	super.consumeTypeParameterWithExtendsAndBounds();
 	if ((this.patternFineGrain & IJavaSearchConstants.TYPE_VARIABLE_BOUND_TYPE_REFERENCE) != 0) {