1 /*******************************************************************************
2  * Copyright (c) 2000, 2009 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.jdt.core.tests.model;
15 
16 import junit.framework.Test;
17 
18 import org.eclipse.core.runtime.*;
19 import org.eclipse.jdt.core.*;
20 import org.eclipse.jdt.core.search.*;
21 
22 /**
23  * Test for generic methods search using R_ERASURE_MATCH rule.
24  */
25 public class JavaSearchGenericMethodTests extends AbstractJavaSearchGenericTests {
26 
JavaSearchGenericMethodTests(String name)27 	public JavaSearchGenericMethodTests(String name) {
28 		super(name, ERASURE_RULE);
29 	}
30 	// defined for sub-classes
JavaSearchGenericMethodTests(String name, int matchRule)31 	JavaSearchGenericMethodTests(String name, int matchRule) {
32 		super(name, matchRule);
33 	}
suite()34 	public static Test suite() {
35 		return buildModelTestSuite(JavaSearchGenericMethodTests.class);
36 	}
37 	// Use this static initializer to specify subset for tests
38 	// All specified tests which do not belong to the class are skipped...
39 	static {
40 //		TESTS_PREFIX = "testMethodReferencesElementPatternSingleParamArguments";
41 //		TESTS_NAMES = new String[] { "testMethodReferencesElementPatternMultipleParamArguments04" };
42 //		TESTS_NUMBERS = new int[] { 8 };
43 //		TESTS_RANGE = new int[] { -1, -1 };
44 	}
45 
46 	/*
47 	 * Remove last type arguments from a line of an expected result.
48 	 * This line contains one search match print out.
49 	 */
removeFirstTypeArgument(char[] line)50 	long removeFirstTypeArgument(char[] line) {
51 		int idx=0;
52 		int length = line.length;
53 		while (line[idx++] != '[') {
54 			if (idx == length) return -1;
55 		}
56 		if (line[idx++] != '<') return -1;
57 		int start = idx;
58 		int n = 1;
59 		while(idx < length && n!= 0) {
60 			switch (line[idx++]) {
61 				case '<': n++; break;
62 				case '>': n--; break;
63 			}
64 		}
65 		if (n!= 0) {
66 			// something wrong here...
67 			return -1;
68 		}
69 		return ((long)start<<32) + idx;
70 	}
71 
72 	@Override
addResultLine(StringBuffer buffer, char[] line)73 	void addResultLine(StringBuffer buffer, char[] line) {
74 		long positions = removeFirstTypeArgument(line);
75 		if (buffer.length() > 0) buffer.append('\n');
76 		if (positions != -1) {
77 			int stop = (int) (positions >>> 32) - 1;
78 			int restart = (int) positions;
79 			buffer.append(line, 0, stop);
80 			buffer.append(line, restart, line.length-restart);
81 		} else {
82 			buffer.append(line);
83 		}
84 	}
85 
86 	/**
87 	 * Bug 75642: [1.5][search] Methods and constructor search does not work with generics
88 	 * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=75642"
89 	 */
90 	/*
91 	 * REFERENCES
92 	 */
93 	// Search references to methods defined in a single type parameter class
testMethodReferencesElementPatternSingleTypeParameter01()94 	public void testMethodReferencesElementPatternSingleTypeParameter01() throws CoreException {
95 		IType type = getCompilationUnit("JavaSearch15/src/g5/m/def/Single.java").getType("Single");
96 		// search reference to a standard method
97 		IMethod method = type.getMethod("standard", new String[] { "QT;" });
98 		IJavaSearchScope scope = getJavaSearchScope15();
99 		search(method, REFERENCES, scope, this.resultCollector);
100 		assertSearchResults(
101 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [standard(new Exception())] ERASURE_RAW_MATCH\n" +
102 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [standard(new Object())] ERASURE_MATCH\n" +
103 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [standard(new Exception())] ERASURE_MATCH\n" +
104 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [standard(new RuntimeException())] ERASURE_MATCH"
105 		);
106 	}
testMethodReferencesElementPatternSingleTypeParameter02()107 	public void testMethodReferencesElementPatternSingleTypeParameter02() throws CoreException {
108 		IType type = getCompilationUnit("JavaSearch15/src/g5/m/def/Single.java").getType("Single");
109 		// search reference to a generic method
110 		IMethod method = type.getMethod("generic", new String[] { "QU;" });
111 		IJavaSearchScope scope = getJavaSearchScope15();
112 		search(method, REFERENCES, scope, this.resultCollector);
113 		assertSearchResults(
114 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [generic(new Exception())] ERASURE_RAW_MATCH\n" +
115 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [generic(new Object())] ERASURE_MATCH\n" +
116 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [generic(new Exception())] ERASURE_MATCH\n" +
117 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [generic(new RuntimeException())] ERASURE_MATCH"
118 		);
119 	}
testMethodReferencesElementPatternSingleTypeParameter03()120 	public void testMethodReferencesElementPatternSingleTypeParameter03() throws CoreException {
121 		IType type = getCompilationUnit("JavaSearch15/src/g5/m/def/Single.java").getType("Single");
122 		// search reference to a method returning a parameterized type
123 		IMethod method = type.getMethod("returnParamType", new String[] {});
124 		IJavaSearchScope scope = getJavaSearchScope15();
125 		search(method, REFERENCES, scope, this.resultCollector);
126 		assertSearchResults(
127 			"src/g5/m/def/Single.java Single<T> g5.m.def.Single.complete(U, Single<T>) [returnParamType()] EXACT_MATCH\n" +
128 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [returnParamType()] ERASURE_RAW_MATCH\n" +
129 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [returnParamType()] ERASURE_MATCH\n" +
130 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [returnParamType()] ERASURE_MATCH\n" +
131 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [returnParamType()] ERASURE_MATCH\n" +
132 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testUnbound() [returnParamType()] ERASURE_MATCH\n" +
133 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testExtends() [returnParamType()] ERASURE_MATCH\n" +
134 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testSuper() [returnParamType()] ERASURE_MATCH"
135 		);
136 	}
testMethodReferencesElementPatternSingleTypeParameter04()137 	public void testMethodReferencesElementPatternSingleTypeParameter04() throws CoreException {
138 		IType type = getCompilationUnit("JavaSearch15/src/g5/m/def/Single.java").getType("Single");
139 		// search reference to a method with parameterized type arguments
140 		IMethod method = type.getMethod("paramTypesArgs", new String[] { "QSingle<QT;>;" });
141 		IJavaSearchScope scope = getJavaSearchScope15();
142 		search(method, REFERENCES, scope, this.resultCollector);
143 		assertSearchResults(
144 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [paramTypesArgs(gs)] ERASURE_RAW_MATCH\n" +
145 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [paramTypesArgs(gs)] ERASURE_MATCH\n" +
146 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [paramTypesArgs(gs)] ERASURE_MATCH\n" +
147 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [paramTypesArgs(gs)] ERASURE_MATCH\n" +
148 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testUnbound() [paramTypesArgs(gs)] POTENTIAL_MATCH\n" +
149 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testExtends() [paramTypesArgs(gs)] POTENTIAL_MATCH\n" +
150 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testSuper() [paramTypesArgs(gs)] POTENTIAL_MATCH"
151 		);
152 	}
testMethodReferencesElementPatternSingleTypeParameter05()153 	public void testMethodReferencesElementPatternSingleTypeParameter05() throws CoreException {
154 		IType type = getCompilationUnit("JavaSearch15/src/g5/m/def/Single.java").getType("Single");
155 		// search reference to a generic method returning a param type with param type parameters (=complete)
156 		IMethod method = type.getMethod("complete", new String[] { "QU;", "QSingle<QT;>;" });
157 		IJavaSearchScope scope = getJavaSearchScope15();
158 		search(method, REFERENCES, scope, this.resultCollector);
159 		assertSearchResults(
160 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [complete(new Exception(), gs)] ERASURE_RAW_MATCH\n" +
161 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [complete(new Object(), gs)] ERASURE_MATCH\n" +
162 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [complete(new Exception(), gs)] ERASURE_MATCH\n" +
163 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [complete(new RuntimeException(), gs)] ERASURE_MATCH\n" +
164 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testUnbound() [complete(new String(), gs)] POTENTIAL_MATCH\n" +
165 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testExtends() [complete(new Throwable(), gs)] POTENTIAL_MATCH\n" +
166 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testSuper() [complete(new RuntimeException(), gs)] POTENTIAL_MATCH"
167 		);
168 	}
169 
170 	// Search references to methods defined in a multiple type parameters class
testMethodReferencesElementPatternMultipleTypeParameter01()171 	public void testMethodReferencesElementPatternMultipleTypeParameter01() throws CoreException {
172 		IType type = getCompilationUnit("JavaSearch15/src/g5/m/def/Multiple.java").getType("Multiple");
173 		IMethod method = type.getMethod("standard", new String[] { "QT1;","QT2;","QT3;" });
174 		IJavaSearchScope scope = getJavaSearchScope15();
175 		search(method, REFERENCES, scope, this.resultCollector);
176 		assertSearchResults(
177 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [standard(new Object(), new Exception(), new RuntimeException())] ERASURE_MATCH\n" +
178 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [standard(new Object(), new Exception(), new RuntimeException())] ERASURE_RAW_MATCH"
179 		);
180 	}
testMethodReferencesElementPatternMultipleTypeParameter02()181 	public void testMethodReferencesElementPatternMultipleTypeParameter02() throws CoreException {
182 		IType type = getCompilationUnit("JavaSearch15/src/g5/m/def/Multiple.java").getType("Multiple");
183 		IMethod method = type.getMethod("generic", new String[] { "QU1;","QU2;","QU3;" });
184 		IJavaSearchScope scope = getJavaSearchScope15();
185 		search(method, REFERENCES, scope, this.resultCollector);
186 		assertSearchResults(
187 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [generic(new Object(), new Exception(), new RuntimeException())] ERASURE_MATCH\n" +
188 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [generic(new Object(), new RuntimeException(), new RuntimeException())] ERASURE_MATCH\n" +
189 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [generic(new Object(), new RuntimeException(), new IllegalMonitorStateException())] ERASURE_MATCH\n" +
190 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [generic(new Object(), new Exception(), new RuntimeException())] ERASURE_RAW_MATCH"
191 		);
192 	}
testMethodReferencesElementPatternMultipleTypeParameter03()193 	public void testMethodReferencesElementPatternMultipleTypeParameter03() throws CoreException {
194 		IType type = getCompilationUnit("JavaSearch15/src/g5/m/def/Multiple.java").getType("Multiple");
195 		IMethod method = type.getMethod("returnParamType", new String[] {});
196 		IJavaSearchScope scope = getJavaSearchScope15();
197 		search(method, REFERENCES, scope, this.resultCollector);
198 		assertSearchResults(
199 			"src/g5/m/def/Multiple.java Multiple<T1,T2,T3> g5.m.def.Multiple.complete(U1, U2, U3, Multiple<T1,T2,T3>) [returnParamType()] EXACT_MATCH\n" +
200 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [returnParamType()] ERASURE_MATCH\n" +
201 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testUnbound() [returnParamType()] ERASURE_MATCH\n" +
202 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [returnParamType()] ERASURE_MATCH\n" +
203 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [returnParamType()] ERASURE_MATCH\n" +
204 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [returnParamType()] ERASURE_RAW_MATCH"
205 		);
206 	}
testMethodReferencesElementPatternMultipleTypeParameter04()207 	public void testMethodReferencesElementPatternMultipleTypeParameter04() throws CoreException {
208 		IType type = getCompilationUnit("JavaSearch15/src/g5/m/def/Multiple.java").getType("Multiple");
209 		IMethod method = type.getMethod("paramTypesArgs", new String[] { "QSingle<QT1;>;","QSingle<QT2;>;","QSingle<QT3;>;","QMultiple<QT1;QT2;QT3;>;" });
210 		IJavaSearchScope scope = getJavaSearchScope15();
211 		search(method, REFERENCES, scope, this.resultCollector);
212 		assertSearchResults(
213 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [paramTypesArgs(new Single<Object>(), new Single<Exception>(), new Single<RuntimeException>(), gm)] ERASURE_MATCH\n" +
214 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testUnbound() [paramTypesArgs(new Single<Object>(), new Single<Object>(), new Single<Object>(), gm)] POTENTIAL_MATCH\n" +
215 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [paramTypesArgs(new Single<Object>(), new Single<Throwable>(), new Single<Exception>(), gm)] POTENTIAL_MATCH\n" +
216 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [paramTypesArgs(new Single<Object>(), new Single<RuntimeException>(), new Single<RuntimeException>(), gm)] POTENTIAL_MATCH\n" +
217 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [paramTypesArgs(new Single<Object>(), new Single<Exception>(), new Single<RuntimeException>(), gm)] ERASURE_RAW_MATCH"
218 		);
219 	}
testMethodReferencesElementPatternMultipleTypeParameter05()220 	public void testMethodReferencesElementPatternMultipleTypeParameter05() throws CoreException {
221 		IType type = getCompilationUnit("JavaSearch15/src/g5/m/def/Multiple.java").getType("Multiple");
222 		IMethod method = type.getMethod("complete", new String[] { "QU1;","QU2;","QU3;", "QMultiple<QT1;QT2;QT3;>;" });
223 		IJavaSearchScope scope = getJavaSearchScope15();
224 		search(method, REFERENCES, scope, this.resultCollector);
225 		assertSearchResults(
226 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [complete(new Object(), new Exception(), new RuntimeException(), gm)] ERASURE_MATCH\n" +
227 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [complete(new Object(), new RuntimeException(), new RuntimeException(), gm)] POTENTIAL_MATCH\n" +
228 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [complete(new Object(), new RuntimeException(), new IllegalMonitorStateException(), gm)] POTENTIAL_MATCH\n" +
229 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [complete(new Object(), new Exception(), new RuntimeException(), gm)] ERASURE_RAW_MATCH"
230 		);
231 	}
232 
233 	// Search references to single parameterized methods
testMethodReferencesElementPatternSingleParamArguments01()234 	public void testMethodReferencesElementPatternSingleParamArguments01() throws CoreException {
235 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefSingle.java");
236 		IMethod method = selectMethod(unit, "generic", 3);
237 		IJavaSearchScope scope = getJavaSearchScope15();
238 		search(method, REFERENCES, scope, this.resultCollector);
239 		assertSearchResults(
240 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [generic(new Exception())] EQUIVALENT_RAW_MATCH\n" +
241 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [<Object>generic(new Object())] EXACT_MATCH\n" +
242 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [generic(new Exception())] ERASURE_MATCH\n" +
243 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [generic(new RuntimeException())] ERASURE_MATCH"
244 		);
245 	}
testMethodReferencesElementPatternSingleParamArguments02()246 	public void testMethodReferencesElementPatternSingleParamArguments02() throws CoreException {
247 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefSingle.java");
248 		IMethod method = selectMethod(unit, "generic", 6);
249 		IJavaSearchScope scope = getJavaSearchScope15();
250 		search(method, REFERENCES, scope, this.resultCollector);
251 		assertSearchResults(
252 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [generic(new Exception())] EQUIVALENT_RAW_MATCH\n" +
253 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [generic(new Object())] ERASURE_MATCH\n" +
254 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [<Exception>generic(new Exception())] EXACT_MATCH\n" +
255 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [generic(new RuntimeException())] ERASURE_MATCH"
256 		);
257 	}
testMethodReferencesElementPatternSingleParamArguments03()258 	public void testMethodReferencesElementPatternSingleParamArguments03() throws CoreException {
259 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefSingle.java");
260 		IMethod method = selectMethod(unit, "complete");
261 		IJavaSearchScope scope = getJavaSearchScope15();
262 		search(method, REFERENCES, scope, this.resultCollector);
263 		assertSearchResults(
264 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [complete(new Exception(), gs)] EQUIVALENT_RAW_MATCH\n" +
265 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [<Object>complete(new Object(), gs)] EXACT_MATCH\n" +
266 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [complete(new Exception(), gs)] ERASURE_MATCH\n" +
267 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [complete(new RuntimeException(), gs)] ERASURE_MATCH\n" +
268 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testUnbound() [complete(new String(), gs)] POTENTIAL_MATCH\n" +
269 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testExtends() [complete(new Throwable(), gs)] POTENTIAL_MATCH\n" +
270 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testSuper() [complete(new RuntimeException(), gs)] POTENTIAL_MATCH"
271 		);
272 	}
testMethodReferencesElementPatternSingleParamArguments04()273 	public void testMethodReferencesElementPatternSingleParamArguments04() throws CoreException {
274 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefSingle.java");
275 		IMethod method = selectMethod(unit, "complete", 2);
276 		IJavaSearchScope scope = getJavaSearchScope15();
277 		search(method, REFERENCES, scope, this.resultCollector);
278 		assertSearchResults(
279 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [complete(new Exception(), gs)] EQUIVALENT_RAW_MATCH\n" +
280 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [complete(new Object(), gs)] ERASURE_MATCH\n" +
281 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [<Exception>complete(new Exception(), gs)] EXACT_MATCH\n" +
282 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [complete(new RuntimeException(), gs)] ERASURE_MATCH\n" +
283 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testUnbound() [complete(new String(), gs)] POTENTIAL_MATCH\n" +
284 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testExtends() [complete(new Throwable(), gs)] POTENTIAL_MATCH\n" +
285 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testSuper() [complete(new RuntimeException(), gs)] POTENTIAL_MATCH"
286 		);
287 	}
testMethodReferencesElementPatternSingleParamArguments05()288 	public void testMethodReferencesElementPatternSingleParamArguments05() throws CoreException {
289 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefRaw.java");
290 		IMethod method = selectMethod(unit, "generic", 2);
291 		IJavaSearchScope scope = getJavaSearchScope15();
292 		search(method, REFERENCES, scope, this.resultCollector);
293 		assertSearchResults(
294 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [generic(new Exception())] EXACT_RAW_MATCH\n" +
295 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [generic(new Object())] EQUIVALENT_MATCH\n" +
296 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [generic(new Exception())] EQUIVALENT_MATCH\n" +
297 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [generic(new RuntimeException())] EQUIVALENT_MATCH"
298 		);
299 	}
testMethodReferencesElementPatternSingleParamArguments06()300 	public void testMethodReferencesElementPatternSingleParamArguments06() throws CoreException {
301 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefRaw.java");
302 		IMethod method = selectMethod(unit, "complete");
303 		IJavaSearchScope scope = getJavaSearchScope15();
304 		search(method, REFERENCES, scope, this.resultCollector);
305 		assertSearchResults(
306 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [complete(new Exception(), gs)] EXACT_RAW_MATCH\n" +
307 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [complete(new Object(), gs)] EQUIVALENT_MATCH\n" +
308 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [complete(new Exception(), gs)] EQUIVALENT_MATCH\n" +
309 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [complete(new RuntimeException(), gs)] EQUIVALENT_MATCH\n" +
310 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testUnbound() [complete(new String(), gs)] POTENTIAL_MATCH\n" +
311 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testExtends() [complete(new Throwable(), gs)] POTENTIAL_MATCH\n" +
312 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testSuper() [complete(new RuntimeException(), gs)] POTENTIAL_MATCH"
313 		);
314 	}
315 
316 	// Search references to multiple parameterized methods
testMethodReferencesElementPatternMultipleParamArguments01()317 	public void testMethodReferencesElementPatternMultipleParamArguments01() throws CoreException {
318 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefMultiple.java");
319 		IMethod method = selectMethod(unit, "generic", 2);
320 		IJavaSearchScope scope = getJavaSearchScope15();
321 		search(method, REFERENCES, scope, this.resultCollector);
322 		assertSearchResults(
323 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [<Object, Exception, RuntimeException>generic(new Object(), new Exception(), new RuntimeException())] EXACT_MATCH\n" +
324 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [generic(new Object(), new RuntimeException(), new RuntimeException())] ERASURE_MATCH\n" +
325 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [generic(new Object(), new RuntimeException(), new IllegalMonitorStateException())] ERASURE_MATCH\n" +
326 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [generic(new Object(), new Exception(), new RuntimeException())] EQUIVALENT_RAW_MATCH"
327 		);
328 	}
testMethodReferencesElementPatternMultipleParamArguments02()329 	public void testMethodReferencesElementPatternMultipleParamArguments02() throws CoreException {
330 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefMultiple.java");
331 		IMethod method = selectMethod(unit, "generic", 6);
332 		search(method, REFERENCES);
333 		assertSearchResults(
334 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [generic(new Object(), new Exception(), new RuntimeException())] ERASURE_MATCH\n" +
335 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [<Object, RuntimeException, RuntimeException>generic(new Object(), new RuntimeException(), new RuntimeException())] EXACT_MATCH\n" +
336 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [generic(new Object(), new RuntimeException(), new IllegalMonitorStateException())] ERASURE_MATCH\n" +
337 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [generic(new Object(), new Exception(), new RuntimeException())] EQUIVALENT_RAW_MATCH"
338 		);
339 	}
testMethodReferencesElementPatternMultipleParamArguments03()340 	public void testMethodReferencesElementPatternMultipleParamArguments03() throws CoreException {
341 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefMultiple.java");
342 		IMethod method = selectMethod(unit, "complete");
343 		IJavaSearchScope scope = getJavaSearchScope15();
344 		search(method, REFERENCES, scope, this.resultCollector);
345 		assertSearchResults(
346 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [<Object, Exception, RuntimeException>complete(new Object(), new Exception(), new RuntimeException(), gm)] EXACT_MATCH\n" +
347 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [complete(new Object(), new RuntimeException(), new RuntimeException(), gm)] POTENTIAL_MATCH\n" +
348 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [complete(new Object(), new RuntimeException(), new IllegalMonitorStateException(), gm)] POTENTIAL_MATCH\n" +
349 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [complete(new Object(), new Exception(), new RuntimeException(), gm)] EQUIVALENT_RAW_MATCH"
350 		);
351 	}
testMethodReferencesElementPatternMultipleParamArguments04()352 	public void testMethodReferencesElementPatternMultipleParamArguments04() throws CoreException {
353 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefMultiple.java");
354 		IMethod method = selectMethod(unit, "complete", 2);
355 		IJavaSearchScope scope = getJavaSearchScope15();
356 		search(method, REFERENCES, scope, this.resultCollector);
357 		assertSearchResults(
358 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [complete(new Object(), new Exception(), new RuntimeException(), gm)] ERASURE_MATCH\n" +
359 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [<Object, RuntimeException, RuntimeException>complete(new Object(), new RuntimeException(), new RuntimeException(), gm)] POTENTIAL_MATCH\n" +
360 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [complete(new Object(), new RuntimeException(), new IllegalMonitorStateException(), gm)] POTENTIAL_MATCH\n" +
361 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [complete(new Object(), new Exception(), new RuntimeException(), gm)] EQUIVALENT_RAW_MATCH"
362 		);
363 	}
testMethodReferencesElementPatternMultipleParamArguments05()364 	public void testMethodReferencesElementPatternMultipleParamArguments05() throws CoreException {
365 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefRaw.java");
366 		IMethod method = selectMethod(unit, "generic", 4);
367 		IJavaSearchScope scope = getJavaSearchScope15();
368 		search(method, REFERENCES, scope, this.resultCollector);
369 		assertSearchResults(
370 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [generic(new Object(), new Exception(), new RuntimeException())] EQUIVALENT_MATCH\n" +
371 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [generic(new Object(), new RuntimeException(), new RuntimeException())] EQUIVALENT_MATCH\n" +
372 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [generic(new Object(), new RuntimeException(), new IllegalMonitorStateException())] EQUIVALENT_MATCH\n" +
373 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [generic(new Object(), new Exception(), new RuntimeException())] EXACT_RAW_MATCH"
374 		);
375 	}
testMethodReferencesElementPatternMultipleParamArguments06()376 	public void testMethodReferencesElementPatternMultipleParamArguments06() throws CoreException {
377 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefRaw.java");
378 		IMethod method = selectMethod(unit, "complete", 2);
379 		IJavaSearchScope scope = getJavaSearchScope15();
380 		search(method, REFERENCES, scope, this.resultCollector);
381 		assertSearchResults(
382 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [complete(new Object(), new Exception(), new RuntimeException(), gm)] EQUIVALENT_MATCH\n" +
383 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [complete(new Object(), new RuntimeException(), new RuntimeException(), gm)] POTENTIAL_MATCH\n" +
384 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [complete(new Object(), new RuntimeException(), new IllegalMonitorStateException(), gm)] POTENTIAL_MATCH\n" +
385 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [complete(new Object(), new Exception(), new RuntimeException(), gm)] EXACT_RAW_MATCH"
386 		);
387 	}
388 
389 	// Search string pattern references to single parameterized methods
testMethodReferencesStringPatternSingleParamArguments01()390 	public void testMethodReferencesStringPatternSingleParamArguments01() throws CoreException {
391 		search("<Exception>generic", METHOD, REFERENCES);
392 		assertSearchResults(
393 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [generic(new Exception())] EQUIVALENT_RAW_MATCH\n" +
394 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [generic(new Object())] ERASURE_MATCH\n" +
395 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [<Exception>generic(new Exception())] EXACT_MATCH\n" +
396 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [generic(new RuntimeException())] ERASURE_MATCH"
397 		);
398 	}
testMethodReferencesStringPatternSingleParamArguments02()399 	public void testMethodReferencesStringPatternSingleParamArguments02() throws CoreException {
400 		IJavaSearchScope scope = getJavaSearchScope15();
401 		search("<? extends Exception> complete ", METHOD, REFERENCES, scope, this.resultCollector);
402 		assertSearchResults(
403 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [complete(new Exception(), gs)] EQUIVALENT_RAW_MATCH\n" +
404 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [complete(new Object(), gs)] ERASURE_MATCH\n" +
405 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [<Exception>complete(new Exception(), gs)] EQUIVALENT_MATCH\n" +
406 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [<RuntimeException>complete(new RuntimeException(), gs)] EQUIVALENT_MATCH\n" +
407 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testUnbound() [complete(new String(), gs)] POTENTIAL_MATCH\n" +
408 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testExtends() [complete(new Throwable(), gs)] POTENTIAL_MATCH\n" +
409 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testSuper() [<RuntimeException>complete(new RuntimeException(), gs)] POTENTIAL_MATCH"
410 		);
411 	}
testMethodReferencesStringPatternSingleParamArguments03()412 	public void testMethodReferencesStringPatternSingleParamArguments03() throws CoreException {
413 		IJavaSearchScope scope = getJavaSearchScope15();
414 		search("<? super Exception>*e?e*", METHOD, REFERENCES, scope, this.resultCollector);
415 		assertSearchResults(
416 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [generic(new Exception())] EQUIVALENT_RAW_MATCH\n" +
417 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [complete(new Exception(), gs)] EQUIVALENT_RAW_MATCH\n" +
418 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [<Object>generic(new Object())] EQUIVALENT_MATCH\n" +
419 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [<Object>complete(new Object(), gs)] EQUIVALENT_MATCH\n" +
420 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [<Exception>generic(new Exception())] EQUIVALENT_MATCH\n" +
421 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [<Exception>complete(new Exception(), gs)] EQUIVALENT_MATCH\n" +
422 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [generic(new RuntimeException())] ERASURE_MATCH\n" +
423 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [complete(new RuntimeException(), gs)] ERASURE_MATCH\n" +
424 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testUnbound() [complete(new String(), gs)] POTENTIAL_MATCH\n" +
425 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testExtends() [<Throwable>complete(new Throwable(), gs)] POTENTIAL_MATCH\n" +
426 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testSuper() [complete(new RuntimeException(), gs)] POTENTIAL_MATCH"
427 		);
428 	}
testMethodReferencesStringPatternSingleParamArguments04()429 	public void testMethodReferencesStringPatternSingleParamArguments04() throws CoreException {
430 		IJavaSearchScope scope = getJavaSearchScope15("g5.m.ref", false);
431 		search("generic", METHOD, REFERENCES, scope, this.resultCollector);
432 		assertSearchResults(
433 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [generic(new Object(), new Exception(), new RuntimeException())] EXACT_MATCH\n" +
434 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [generic(new Object(), new RuntimeException(), new RuntimeException())] EXACT_MATCH\n" +
435 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [generic(new Object(), new RuntimeException(), new IllegalMonitorStateException())] EXACT_MATCH\n" +
436 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [generic(new Exception())] EXACT_MATCH\n" +
437 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [generic(new Object(), new Exception(), new RuntimeException())] EXACT_MATCH\n" +
438 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [generic(new Object())] EXACT_MATCH\n" +
439 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [generic(new Exception())] EXACT_MATCH\n" +
440 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [generic(new RuntimeException())] EXACT_MATCH"
441 		);
442 	}
testMethodReferencesStringPatternSingleParamArguments05()443 	public void testMethodReferencesStringPatternSingleParamArguments05() throws CoreException {
444 		IJavaSearchScope scope = getJavaSearchScope15();
445 		search("generic(Object)", METHOD, REFERENCES, scope, this.resultCollector);
446 		assertSearchResults(
447 			/* Results while resolving string pattern with no qualification (currently disabled as it is not comaptible with previous results):
448 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [generic(new Exception())] EQUIVALENT_RAW_MATCH\n" +
449 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [generic(new Object())] EQUIVALENT_RAW_MATCH"
450 			*/
451 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [generic(new Exception())] EXACT_MATCH\n" +
452 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [generic(new Object())] EXACT_MATCH\n" +
453 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [generic(new Exception())] EXACT_MATCH\n" +
454 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [generic(new RuntimeException())] EXACT_MATCH"
455 		);
456 	}
testMethodReferencesStringPatternSingleParamArguments06()457 	public void testMethodReferencesStringPatternSingleParamArguments06() throws CoreException {
458 		IJavaSearchScope scope = getJavaSearchScope15();
459 		search("complete(Exception, Single<Exception>)", METHOD, REFERENCES, scope, this.resultCollector);
460 		assertSearchResults(
461 			/* Results while resolving string pattern with no qualification (currently disabled as it is not comaptible with previous results):
462 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [complete(new Exception(), gs)] EQUIVALENT_RAW_MATCH"
463 			*/
464 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testSingle() [complete(new Exception(), gs)] EXACT_MATCH\n" +
465 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testObject() [complete(new Object(), gs)] EXACT_MATCH\n" +
466 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [complete(new Exception(), gs)] EXACT_MATCH\n" +
467 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testRuntimeException() [complete(new RuntimeException(), gs)] EXACT_MATCH\n" +
468 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testUnbound() [complete(new String(), gs)] EXACT_MATCH\n" +
469 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testExtends() [complete(new Throwable(), gs)] EXACT_MATCH\n" +
470 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testSuper() [complete(new RuntimeException(), gs)] EXACT_MATCH"
471 		);
472 	}
testMethodReferencesStringPatternSingleParamArguments07()473 	public void testMethodReferencesStringPatternSingleParamArguments07() throws CoreException {
474 		IJavaSearchScope scope = getJavaSearchScope15();
475 		search("<Exception> generic ( Exception ) ", METHOD, REFERENCES, scope, this.resultCollector);
476 		assertSearchResults(
477 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [<Exception>generic(new Exception())] EXACT_MATCH"
478 		);
479 	}
testMethodReferencesStringPatternSingleParamArguments08()480 	public void testMethodReferencesStringPatternSingleParamArguments08() throws CoreException {
481 		IJavaSearchScope scope = getJavaSearchScope15();
482 		search("<? extends Exception>complete(Exception, Single<? super Exception>)", METHOD, REFERENCES, scope, this.resultCollector);
483 		assertSearchResults(
484 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [<Exception>complete(new Exception(), gs)] EQUIVALENT_MATCH\n" +
485 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testUnbound() [complete(new String(), gs)] POTENTIAL_MATCH\n" +
486 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testExtends() [complete(new Throwable(), gs)] POTENTIAL_MATCH\n" +
487 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testSuper() [complete(new RuntimeException(), gs)] POTENTIAL_MATCH"
488 		);
489 	}
testMethodReferencesStringPatternSingleParamArguments09()490 	public void testMethodReferencesStringPatternSingleParamArguments09() throws CoreException {
491 		IJavaSearchScope scope = getJavaSearchScope15();
492 		search("Single.generic(Exception)", METHOD, REFERENCES, scope, this.resultCollector);
493 		assertSearchResults(
494 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [generic(new Exception())] EQUIVALENT_MATCH"
495 		);
496 	}
testMethodReferencesStringPatternSingleParamArguments10()497 	public void testMethodReferencesStringPatternSingleParamArguments10() throws CoreException {
498 		IJavaSearchScope scope = getJavaSearchScope15();
499 		search("g5.m.def.Single<Exception>.generic(Exception)", METHOD, REFERENCES, scope, this.resultCollector);
500 		assertSearchResults(
501 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [generic(new Exception())] EQUIVALENT_MATCH"
502 		);
503 	}
testMethodReferencesStringPatternSingleParamArguments11()504 	public void testMethodReferencesStringPatternSingleParamArguments11() throws CoreException {
505 		IJavaSearchScope scope = getJavaSearchScope15();
506 		search("g5.m.def.Single<? extends Exception>.<? extends Exception>generic(Exception)", METHOD, REFERENCES, scope, this.resultCollector);
507 		assertSearchResults(
508 			"src/g5/m/ref/RefSingle.java void g5.m.ref.RefSingle.testException() [<Exception>generic(new Exception())] EQUIVALENT_MATCH"
509 		);
510 	}
511 
512 	// Search string pattern references to multiple parameterized methods
testMethodReferencesStringPatternMultipleParamArguments01()513 	public void testMethodReferencesStringPatternMultipleParamArguments01() throws CoreException {
514 		IJavaSearchScope scope = getJavaSearchScope15();
515 		search("<?, ? extends Exception, ? super RuntimeException>generic", METHOD, REFERENCES, scope, this.resultCollector);
516 		assertSearchResults(
517 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [<Object, Exception, RuntimeException>generic(new Object(), new Exception(), new RuntimeException())] EQUIVALENT_MATCH\n" +
518 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [<Object, RuntimeException, RuntimeException>generic(new Object(), new RuntimeException(), new RuntimeException())] EQUIVALENT_MATCH\n" +
519 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [generic(new Object(), new RuntimeException(), new IllegalMonitorStateException())] ERASURE_MATCH\n" +
520 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [generic(new Object(), new Exception(), new RuntimeException())] EQUIVALENT_RAW_MATCH"
521 		);
522 	}
testMethodReferencesStringPatternMultipleParamArguments02()523 	public void testMethodReferencesStringPatternMultipleParamArguments02() throws CoreException {
524 		IJavaSearchScope scope = getJavaSearchScope15();
525 		search("<Object, Exception, RuntimeException>complete", METHOD, REFERENCES, scope, this.resultCollector);
526 		assertSearchResults(
527 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [<Object, Exception, RuntimeException>complete(new Object(), new Exception(), new RuntimeException(), gm)] EXACT_MATCH\n" +
528 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [complete(new Object(), new RuntimeException(), new RuntimeException(), gm)] POTENTIAL_MATCH\n" +
529 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [complete(new Object(), new RuntimeException(), new IllegalMonitorStateException(), gm)] POTENTIAL_MATCH\n" +
530 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [complete(new Object(), new Exception(), new RuntimeException(), gm)] EQUIVALENT_RAW_MATCH"
531 		);
532 	}
testMethodReferencesStringPatternMultipleParamArguments04()533 	public void testMethodReferencesStringPatternMultipleParamArguments04() throws CoreException {
534 		IJavaSearchScope scope = getJavaSearchScope15();
535 		search("generic(Object,Exception,RuntimeException)", METHOD, REFERENCES, scope, this.resultCollector);
536 		assertSearchResults(
537 			/* Results while resolving string pattern with no qualification (currently disabled as it is not comaptible with previous results):
538 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [generic(new Object(), new Exception(), new RuntimeException())] EQUIVALENT_RAW_MATCH"
539 			*/
540 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [generic(new Object(), new Exception(), new RuntimeException())] EXACT_MATCH\n" +
541 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [generic(new Object(), new RuntimeException(), new RuntimeException())] EXACT_MATCH\n" +
542 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [generic(new Object(), new RuntimeException(), new IllegalMonitorStateException())] EXACT_MATCH\n" +
543 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [generic(new Object(), new Exception(), new RuntimeException())] EXACT_MATCH"
544 		);
545 	}
testMethodReferencesStringPatternMultipleParamArguments05()546 	public void testMethodReferencesStringPatternMultipleParamArguments05() throws CoreException {
547 		IJavaSearchScope scope = getJavaSearchScope15();
548 		search("complete(Object,RuntimeException,RuntimeException,Multiple<Object, RuntimeException, RuntimeException>)", METHOD, REFERENCES, scope, this.resultCollector);
549 		assertSearchResults(
550 			/* Results while resolving string pattern with no qualification (currently disabled as it is not comaptible with previous results):
551 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [complete(new Object(), new RuntimeException(), new RuntimeException(), gm)] EQUIVALENT_RAW_MATCH"
552 			*/
553 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [complete(new Object(), new Exception(), new RuntimeException(), gm)] EXACT_MATCH\n" +
554 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [complete(new Object(), new RuntimeException(), new RuntimeException(), gm)] EXACT_MATCH\n" +
555 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [complete(new Object(), new RuntimeException(), new IllegalMonitorStateException(), gm)] EXACT_MATCH\n" +
556 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [complete(new Object(), new Exception(), new RuntimeException(), gm)] EXACT_MATCH"
557 		);
558 	}
testMethodReferencesStringPatternMultipleParamArguments06()559 	public void testMethodReferencesStringPatternMultipleParamArguments06() throws CoreException {
560 		IJavaSearchScope scope = getJavaSearchScope15();
561 		search("<Object, RuntimeException, RuntimeException>generic(*,*,*)", METHOD, REFERENCES, scope, this.resultCollector);
562 		assertSearchResults(
563 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [generic(new Object(), new Exception(), new RuntimeException())] ERASURE_MATCH\n" +
564 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [<Object, RuntimeException, RuntimeException>generic(new Object(), new RuntimeException(), new RuntimeException())] EXACT_MATCH\n" +
565 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [generic(new Object(), new RuntimeException(), new IllegalMonitorStateException())] ERASURE_MATCH\n" +
566 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [generic(new Object(), new Exception(), new RuntimeException())] EQUIVALENT_RAW_MATCH"
567 		);
568 	}
testMethodReferencesStringPatternMultipleParamArguments07()569 	public void testMethodReferencesStringPatternMultipleParamArguments07() throws CoreException {
570 		IJavaSearchScope scope = getJavaSearchScope15();
571 		search("<?,? extends Throwable,? extends RuntimeException>complete", METHOD, REFERENCES, scope, this.resultCollector);
572 		assertSearchResults(
573 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [<Object, Exception, RuntimeException>complete(new Object(), new Exception(), new RuntimeException(), gm)] EQUIVALENT_MATCH\n" +
574 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testExtends() [<Object, RuntimeException, RuntimeException>complete(new Object(), new RuntimeException(), new RuntimeException(), gm)] POTENTIAL_MATCH\n" +
575 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.testSuper() [<Object, RuntimeException, IllegalMonitorStateException>complete(new Object(), new RuntimeException(), new IllegalMonitorStateException(), gm)] POTENTIAL_MATCH\n" +
576 			"src/g5/m/ref/RefRaw.java void g5.m.ref.RefRaw.testMultiple() [complete(new Object(), new Exception(), new RuntimeException(), gm)] EQUIVALENT_RAW_MATCH"
577 		);
578 	}
testMethodReferencesStringPatternMultipleParamArguments08()579 	public void testMethodReferencesStringPatternMultipleParamArguments08() throws CoreException {
580 		IJavaSearchScope scope = getJavaSearchScope15();
581 		search("Multiple.generic(Object,Exception,RuntimeException)", METHOD, REFERENCES, scope, this.resultCollector);
582 		assertSearchResults(
583 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [generic(new Object(), new Exception(), new RuntimeException())] EQUIVALENT_MATCH"
584 		);
585 	}
testMethodReferencesStringPatternMultipleParamArguments09()586 	public void testMethodReferencesStringPatternMultipleParamArguments09() throws CoreException {
587 		IJavaSearchScope scope = getJavaSearchScope15();
588 		search("g5.m.def.Multiple<Object, RuntimeException, RuntimeException>.generic(Object,Exception,RuntimeException)", METHOD, REFERENCES, scope, this.resultCollector);
589 		assertSearchResults(
590 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [generic(new Object(), new Exception(), new RuntimeException())] ERASURE_MATCH"
591 		);
592 	}
testMethodReferencesStringPatternMultipleParamArguments10()593 	public void testMethodReferencesStringPatternMultipleParamArguments10() throws CoreException {
594 		IJavaSearchScope scope = getJavaSearchScope15();
595 		search("g5.m.def.Multiple<?,? extends Throwable,? extends RuntimeException>.<?,? extends Throwable,? extends RuntimeException>generic(Object,Exception,RuntimeException)", METHOD, REFERENCES, scope, this.resultCollector);
596 		assertSearchResults(
597 			"src/g5/m/ref/RefMultiple.java void g5.m.ref.RefMultiple.test() [<Object, Exception, RuntimeException>generic(new Object(), new Exception(), new RuntimeException())] EQUIVALENT_MATCH"
598 		);
599 	}
600 
601 	/*
602 	 * DECLARATIONS
603 	 */
604 	// Search references to single parameterized methods
testMethodDeclarationsElementPatternSingleParamArguments01()605 	public void testMethodDeclarationsElementPatternSingleParamArguments01() throws CoreException {
606 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefSingle.java");
607 		IMethod method = selectMethod(unit, "generic", 3);
608 		IJavaSearchScope scope = getJavaSearchScope15();
609 		search(method, DECLARATIONS, scope, this.resultCollector);
610 		assertSearchResults(
611 			"src/g5/m/def/Single.java T g5.m.def.Single.generic(U) [generic] EXACT_MATCH"
612 		);
613 	}
testMethodDeclarationsElementPatternSingleParamArguments02()614 	public void testMethodDeclarationsElementPatternSingleParamArguments02() throws CoreException {
615 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefSingle.java");
616 		IMethod method = selectMethod(unit, "generic", 6);
617 		IJavaSearchScope scope = getJavaSearchScope15();
618 		search(method, DECLARATIONS, scope, this.resultCollector);
619 		assertSearchResults(
620 			"src/g5/m/def/Single.java T g5.m.def.Single.generic(U) [generic] EXACT_MATCH"
621 		);
622 	}
testMethodDeclarationsElementPatternSingleParamArguments03()623 	public void testMethodDeclarationsElementPatternSingleParamArguments03() throws CoreException {
624 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefRaw.java");
625 		IMethod method = selectMethod(unit, "generic", 2);
626 		IJavaSearchScope scope = getJavaSearchScope15();
627 		search(method, DECLARATIONS, scope, this.resultCollector);
628 		assertSearchResults(
629 			"src/g5/m/def/Single.java T g5.m.def.Single.generic(U) [generic] EXACT_MATCH"
630 		);
631 	}
testMethodDeclarationsElementPatternSingleParamArguments04()632 	public void testMethodDeclarationsElementPatternSingleParamArguments04() throws CoreException {
633 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefSingle.java");
634 		IMethod method = selectMethod(unit, "complete");
635 		IJavaSearchScope scope = getJavaSearchScope15();
636 		search(method, DECLARATIONS, scope, this.resultCollector);
637 		assertSearchResults(
638 			"src/g5/m/def/Single.java Single<T> g5.m.def.Single.complete(U, Single<T>) [complete] EXACT_MATCH"
639 		);
640 	}
testMethodDeclarationsElementPatternSingleParamArguments05()641 	public void testMethodDeclarationsElementPatternSingleParamArguments05() throws CoreException {
642 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefSingle.java");
643 		IMethod method = selectMethod(unit, "complete", 2);
644 		IJavaSearchScope scope = getJavaSearchScope15();
645 		search(method, DECLARATIONS, scope, this.resultCollector);
646 		assertSearchResults(
647 			"src/g5/m/def/Single.java Single<T> g5.m.def.Single.complete(U, Single<T>) [complete] EXACT_MATCH"
648 		);
649 	}
testMethodDeclarationsElementPatternSingleParamArguments06()650 	public void testMethodDeclarationsElementPatternSingleParamArguments06() throws CoreException {
651 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefRaw.java");
652 		IMethod method = selectMethod(unit, "complete");
653 		IJavaSearchScope scope = getJavaSearchScope15();
654 		search(method, DECLARATIONS, scope, this.resultCollector);
655 		assertSearchResults(
656 			"src/g5/m/def/Single.java Single<T> g5.m.def.Single.complete(U, Single<T>) [complete] EXACT_MATCH"
657 		);
658 	}
659 
660 	// Search references to multiple parameterized methods
testMethodDeclarationsElementPatternMultipleParamArguments01()661 	public void testMethodDeclarationsElementPatternMultipleParamArguments01() throws CoreException {
662 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefMultiple.java");
663 		IMethod method = selectMethod(unit, "generic", 2);
664 		IJavaSearchScope scope = getJavaSearchScope15();
665 		search(method, DECLARATIONS, scope, this.resultCollector);
666 		assertSearchResults(
667 			"src/g5/m/def/Multiple.java T1 g5.m.def.Multiple.generic(U1, U2, U3) [generic] EXACT_MATCH"
668 		);
669 	}
testMethodDeclarationsElementPatternMultipleParamArguments02()670 	public void testMethodDeclarationsElementPatternMultipleParamArguments02() throws CoreException {
671 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefMultiple.java");
672 		IMethod method = selectMethod(unit, "generic", 6);
673 		IJavaSearchScope scope = getJavaSearchScope15();
674 		search(method, DECLARATIONS, scope, this.resultCollector);
675 		assertSearchResults(
676 			"src/g5/m/def/Multiple.java T1 g5.m.def.Multiple.generic(U1, U2, U3) [generic] EXACT_MATCH"
677 		);
678 	}
testMethodDeclarationsElementPatternMultipleParamArguments03()679 	public void testMethodDeclarationsElementPatternMultipleParamArguments03() throws CoreException {
680 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefRaw.java");
681 		IMethod method = selectMethod(unit, "generic", 4);
682 		IJavaSearchScope scope = getJavaSearchScope15();
683 		search(method, DECLARATIONS, scope, this.resultCollector);
684 		assertSearchResults(
685 			"src/g5/m/def/Multiple.java T1 g5.m.def.Multiple.generic(U1, U2, U3) [generic] EXACT_MATCH"
686 		);
687 	}
testMethodDeclarationsElementPatternMultipleParamArguments04()688 	public void testMethodDeclarationsElementPatternMultipleParamArguments04() throws CoreException {
689 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefMultiple.java");
690 		IMethod method = selectMethod(unit, "complete");
691 		IJavaSearchScope scope = getJavaSearchScope15();
692 		search(method, DECLARATIONS, scope, this.resultCollector);
693 		assertSearchResults(
694 			"src/g5/m/def/Multiple.java Multiple<T1,T2,T3> g5.m.def.Multiple.complete(U1, U2, U3, Multiple<T1,T2,T3>) [complete] EXACT_MATCH"
695 		);
696 	}
testMethodDeclarationsElementPatternMultipleParamArguments05()697 	public void testMethodDeclarationsElementPatternMultipleParamArguments05() throws CoreException {
698 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefMultiple.java");
699 		IMethod method = selectMethod(unit, "complete", 2);
700 		IJavaSearchScope scope = getJavaSearchScope15();
701 		search(method, DECLARATIONS, scope, this.resultCollector);
702 		assertSearchResults(
703 			"src/g5/m/def/Multiple.java Multiple<T1,T2,T3> g5.m.def.Multiple.complete(U1, U2, U3, Multiple<T1,T2,T3>) [complete] EXACT_MATCH"
704 		);
705 	}
testMethodDeclarationsElementPatternMultipleParamArguments06()706 	public void testMethodDeclarationsElementPatternMultipleParamArguments06() throws CoreException {
707 		ICompilationUnit unit = getCompilationUnit("JavaSearch15/src/g5/m/ref/RefRaw.java");
708 		IMethod method = selectMethod(unit, "complete", 2);
709 		IJavaSearchScope scope = getJavaSearchScope15();
710 		search(method, DECLARATIONS, scope, this.resultCollector);
711 		assertSearchResults(
712 			"src/g5/m/def/Multiple.java Multiple<T1,T2,T3> g5.m.def.Multiple.complete(U1, U2, U3, Multiple<T1,T2,T3>) [complete] EXACT_MATCH"
713 		);
714 	}
715 
716 	// Search string pattern references to single parameterized methods
testMethodDeclarationsStringPatternSingleParamArguments01()717 	public void testMethodDeclarationsStringPatternSingleParamArguments01() throws CoreException {
718 		IJavaSearchScope scope = getJavaSearchScope15();
719 		search("<Exception>generic", METHOD, DECLARATIONS, scope, this.resultCollector);
720 		assertSearchResults(
721 			"src/g5/m/def/Single.java T g5.m.def.Single.generic(U) [generic] EXACT_MATCH"
722 		);
723 	}
testMethodDeclarationsStringPatternSingleParamArguments02()724 	public void testMethodDeclarationsStringPatternSingleParamArguments02() throws CoreException {
725 		IJavaSearchScope scope = getJavaSearchScope15();
726 		search("<U>complete", METHOD, DECLARATIONS, scope, this.resultCollector);
727 		assertSearchResults(
728 			"src/g5/m/def/Single.java Single<T> g5.m.def.Single.complete(U, Single<T>) [complete] EXACT_MATCH"
729 		);
730 	}
testMethodDeclarationsStringPatternSingleParamArguments03()731 	public void testMethodDeclarationsStringPatternSingleParamArguments03() throws CoreException {
732 		IJavaSearchScope scope = getJavaSearchScope15();
733 		search("<T> *e?e*", METHOD, DECLARATIONS, scope, this.resultCollector);
734 		assertSearchResults(
735 			"src/g5/m/def/Single.java T g5.m.def.Single.generic(U) [generic] EXACT_MATCH\n" +
736 			"src/g5/m/def/Single.java Single<T> g5.m.def.Single.complete(U, Single<T>) [complete] EXACT_MATCH"
737 		);
738 	}
testMethodDeclarationsStringPatternSingleParamArguments04()739 	public void testMethodDeclarationsStringPatternSingleParamArguments04() throws CoreException {
740 		IJavaSearchScope scope = getJavaSearchScope15();
741 		search("generic(*)", METHOD, DECLARATIONS, scope, this.resultCollector);
742 		assertSearchResults(
743 			"src/g5/m/def/Single.java T g5.m.def.Single.generic(U) [generic] EXACT_MATCH"
744 		);
745 	}
testMethodDeclarationsStringPatternSingleParamArguments05()746 	public void testMethodDeclarationsStringPatternSingleParamArguments05() throws CoreException {
747 		IJavaSearchScope scope = getJavaSearchScope15();
748 		search("<Exception>generic(*)", METHOD, DECLARATIONS, scope, this.resultCollector);
749 		assertSearchResults(
750 			"src/g5/m/def/Single.java T g5.m.def.Single.generic(U) [generic] EXACT_MATCH"
751 		);
752 	}
testMethodDeclarationsStringPatternSingleParamArguments06()753 	public void testMethodDeclarationsStringPatternSingleParamArguments06() throws CoreException {
754 		IJavaSearchScope scope = getJavaSearchScope15();
755 		search("Single.<Object>generic", METHOD, DECLARATIONS, scope, this.resultCollector);
756 		assertSearchResults(
757 			"src/g5/m/def/Single.java T g5.m.def.Single.generic(U) [generic] EXACT_MATCH"
758 		);
759 	}
testMethodDeclarationsStringPatternSingleParamArguments07()760 	public void testMethodDeclarationsStringPatternSingleParamArguments07() throws CoreException {
761 		IJavaSearchScope scope = getJavaSearchScope15();
762 		search("g5.m.def.Single<Object>.<U>generic", METHOD, DECLARATIONS, scope, this.resultCollector);
763 		assertSearchResults(
764 			"src/g5/m/def/Single.java T g5.m.def.Single.generic(U) [generic] EXACT_MATCH"
765 		);
766 	}
testMethodDeclarationsStringPatternSingleParamArguments08()767 	public void testMethodDeclarationsStringPatternSingleParamArguments08() throws CoreException {
768 		IJavaSearchScope scope = getJavaSearchScope15();
769 		search("g5.m.def.Single<?>.<?>generic", METHOD, DECLARATIONS, scope, this.resultCollector);
770 		assertSearchResults(
771 			"src/g5/m/def/Single.java T g5.m.def.Single.generic(U) [generic] EXACT_MATCH"
772 		);
773 	}
774 
775 	// Search string pattern references to multiple parameterized methods
testMethodDeclarationsStringPatternMultipleParamArguments01()776 	public void testMethodDeclarationsStringPatternMultipleParamArguments01() throws CoreException {
777 		IJavaSearchScope scope = getJavaSearchScope15();
778 		search("<?, ? extends Exception, ? super RuntimeException>generic", METHOD, DECLARATIONS, scope, this.resultCollector);
779 		assertSearchResults(
780 			"src/g5/m/def/Multiple.java T1 g5.m.def.Multiple.generic(U1, U2, U3) [generic] EXACT_MATCH"
781 		);
782 	}
testMethodDeclarationsStringPatternMultipleParamArguments02()783 	public void testMethodDeclarationsStringPatternMultipleParamArguments02() throws CoreException {
784 		IJavaSearchScope scope = getJavaSearchScope15();
785 		search("<Object, Exception, RuntimeException>complete", METHOD, DECLARATIONS, scope, this.resultCollector);
786 		assertSearchResults(
787 			"src/g5/m/def/Multiple.java Multiple<T1,T2,T3> g5.m.def.Multiple.complete(U1, U2, U3, Multiple<T1,T2,T3>) [complete] EXACT_MATCH"
788 		);
789 	}
testMethodDeclarationsStringPatternMultipleParamArguments03()790 	public void testMethodDeclarationsStringPatternMultipleParamArguments03() throws CoreException {
791 		IJavaSearchScope scope = getJavaSearchScope15();
792 		search("complete(*,*,*,*)", METHOD, DECLARATIONS, scope, this.resultCollector);
793 		assertSearchResults(
794 			"src/g5/m/def/Multiple.java Multiple<T1,T2,T3> g5.m.def.Multiple.complete(U1, U2, U3, Multiple<T1,T2,T3>) [complete] EXACT_MATCH"
795 		);
796 	}
testMethodDeclarationsStringPatternMultipleParamArguments04()797 	public void testMethodDeclarationsStringPatternMultipleParamArguments04() throws CoreException {
798 		IJavaSearchScope scope = getJavaSearchScope15();
799 		search("<Object, Exception, RuntimeException>complete(*,*,*,*)", METHOD, DECLARATIONS, scope, this.resultCollector);
800 		assertSearchResults(
801 			"src/g5/m/def/Multiple.java Multiple<T1,T2,T3> g5.m.def.Multiple.complete(U1, U2, U3, Multiple<T1,T2,T3>) [complete] EXACT_MATCH"
802 		);
803 	}
testMethodDeclarationsStringPatternMultipleParamArguments05()804 	public void testMethodDeclarationsStringPatternMultipleParamArguments05() throws CoreException {
805 		IJavaSearchScope scope = getJavaSearchScope15();
806 		search("Multiple.<Object, Exception, RuntimeException>complete", METHOD, DECLARATIONS, scope, this.resultCollector);
807 		assertSearchResults(
808 			"src/g5/m/def/Multiple.java Multiple<T1,T2,T3> g5.m.def.Multiple.complete(U1, U2, U3, Multiple<T1,T2,T3>) [complete] EXACT_MATCH"
809 		);
810 	}
testMethodDeclarationsStringPatternMultipleParamArguments06()811 	public void testMethodDeclarationsStringPatternMultipleParamArguments06() throws CoreException {
812 		IJavaSearchScope scope = getJavaSearchScope15();
813 		search("g5.m.def.Multiple<Object, Exception, RuntimeException>.<U1,U2,U3>complete", METHOD, DECLARATIONS, scope, this.resultCollector);
814 		assertSearchResults(
815 			"src/g5/m/def/Multiple.java Multiple<T1,T2,T3> g5.m.def.Multiple.complete(U1, U2, U3, Multiple<T1,T2,T3>) [complete] EXACT_MATCH"
816 		);
817 	}
testMethodDeclarationsStringPatternMultipleParamArguments07()818 	public void testMethodDeclarationsStringPatternMultipleParamArguments07() throws CoreException {
819 		IJavaSearchScope scope = getJavaSearchScope15();
820 		search("g5.m.def.Multiple<?,?,?>.<?,?,?>complete", METHOD, DECLARATIONS, scope, this.resultCollector);
821 		assertSearchResults(
822 			"src/g5/m/def/Multiple.java Multiple<T1,T2,T3> g5.m.def.Multiple.complete(U1, U2, U3, Multiple<T1,T2,T3>) [complete] EXACT_MATCH"
823 		);
824 	}
825 }
826