Additional commit for Bug 519151 - [9][search] Need a way to use modules
as a search scope
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs9Tests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs9Tests.java
index 25863d3..050ee64 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs9Tests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs9Tests.java
@@ -2428,7 +2428,7 @@
 			"import pack.*;\n" +
 			"module mod.one {}");
 	String needle = "mod.one" + this.module_separator + "pack.X";
-	SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, DECLARATIONS, ERASURE_RULE);
+	SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, DECLARATIONS, ERASURE_RULE);
 	new SearchEngine(this.workingCopies).search(pattern,
 			new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()},
 			getJavaSearchWorkingCopiesScope(),
@@ -2445,7 +2445,7 @@
 	this.workingCopies[1] = getWorkingCopy("/JavaSearchBugs/src/module-info.java",
 			"import pack.*;\n" +
 			"module mod.one {}");
-	SearchPattern pattern = SearchPattern.createPattern("pack.X", IJavaSearchConstants.CLASS, DECLARATIONS, ERASURE_RULE);
+	SearchPattern pattern = SearchPattern.createPattern("pack.X", IJavaSearchConstants.TYPE, DECLARATIONS, ERASURE_RULE);
 	new SearchEngine(this.workingCopies).search(pattern,
 			new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()},
 			getJavaSearchWorkingCopiesScope(),
@@ -2463,7 +2463,7 @@
 			"import pack.*;\n" +
 			"module mod.one {}");
 	String needle = this.module_separator + "pack.X";
-	SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, DECLARATIONS, ERASURE_RULE);
+	SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, DECLARATIONS, ERASURE_RULE);
 	new SearchEngine(this.workingCopies).search(pattern,
 			new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()},
 			getJavaSearchWorkingCopiesScope(),
@@ -2506,7 +2506,7 @@
 		project1.open(null);
 		
 		String needle = "first" + this.module_separator + "pack.X";
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, DECLARATIONS, ERASURE_RULE);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, DECLARATIONS, ERASURE_RULE);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -2554,7 +2554,7 @@
 		project2.open(null);
 		project1.open(null);
 		
-		SearchPattern pattern = SearchPattern.createPattern("pack.X", IJavaSearchConstants.CLASS, DECLARATIONS, ERASURE_RULE);
+		SearchPattern pattern = SearchPattern.createPattern("pack.X", IJavaSearchConstants.TYPE, DECLARATIONS, ERASURE_RULE);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -2604,7 +2604,7 @@
 		project1.open(null);
 		
 		String needle = this.module_separator + "pack.X";
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, DECLARATIONS, ERASURE_RULE);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, DECLARATIONS, ERASURE_RULE);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -2647,7 +2647,7 @@
 		project2.open(null);
 		project1.open(null);
 		
-		SearchPattern pattern = SearchPattern.createPattern("pack.X", IJavaSearchConstants.CLASS, DECLARATIONS, ERASURE_RULE);
+		SearchPattern pattern = SearchPattern.createPattern("pack.X", IJavaSearchConstants.TYPE, DECLARATIONS, ERASURE_RULE);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -2687,7 +2687,7 @@
 		project2.open(null);
 		project1.open(null);
 		
-		SearchPattern pattern = SearchPattern.createPattern("pack.X", IJavaSearchConstants.CLASS, DECLARATIONS, ERASURE_RULE);
+		SearchPattern pattern = SearchPattern.createPattern("pack.X", IJavaSearchConstants.TYPE, DECLARATIONS, ERASURE_RULE);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -2736,7 +2736,7 @@
 		project1.open(null);
 		
 		String needle = "first,second" + this.module_separator + "pack.X";
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, DECLARATIONS, ERASURE_RULE);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, DECLARATIONS, ERASURE_RULE);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -2785,7 +2785,7 @@
 		project1.open(null);
 		
 		String needle = " first, second"+ this.module_separator +"pack.X"; // with white space
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, DECLARATIONS, ERASURE_RULE);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, DECLARATIONS, ERASURE_RULE);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -2834,7 +2834,7 @@
 		project1.open(null);
 		
 		String needle = "mod."+ this.module_separator +"pack.X";
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, DECLARATIONS, SearchPattern.R_PREFIX_MATCH);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, DECLARATIONS, SearchPattern.R_PREFIX_MATCH);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -2884,7 +2884,7 @@
 		project1.open(null);
 		
 		String needle = "mod.*" + this.module_separator + "pack.X";
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, DECLARATIONS, SearchPattern.R_PATTERN_MATCH);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, DECLARATIONS, SearchPattern.R_PATTERN_MATCH);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -2934,7 +2934,7 @@
 		project1.open(null);
 		
 		String needle = "first" + this.module_separator + "pack.Y";
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -2998,7 +2998,7 @@
 		project1.open(null);
 		
 		String needle = "third" + this.module_separator + "pack.X";
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -3064,7 +3064,7 @@
 		project1.open(null);
 		
 		String needle = "mod.second,third" + this.module_separator + "pack.X";
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -3131,7 +3131,7 @@
 		project1.open(null);
 		
 		String needle = "non.existant.module" + this.module_separator + "pack.X";
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -3195,7 +3195,7 @@
 		project1.open(null);
 		
 		String needle = this.module_separator + "pack.X";
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -3246,7 +3246,7 @@
 		project1.open(null);
 		
 		String needle = this.module_separator + "pack.X";
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -3298,7 +3298,7 @@
 		project1.open(null);
 		
 		String needle = this.explicit_unnamed + this.module_separator + "pack.X"; // "ALL-UNNAMED/pack.X"
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, IJavaSearchConstants.MODULE_GRAPH, SearchPattern.R_PATTERN_MATCH);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -3352,7 +3352,7 @@
 		String module1 = this.explicit_unnamed; // "ALL-UNNAMED/pack.X"
 		String module2 = "mod.second";
 		String needle = module1 + "," + module2 + this.module_separator + "pack.X"; // "ALL-UNNAMED,second/pack.X"
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH);
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
 		search(pattern, scope, this.resultCollector);
@@ -3414,7 +3414,7 @@
 		String module1 = this.explicit_unnamed; // "ALL-UNNAMED/pack.X"
 		String module2 = "mod.second";
 		String needle = module1 + "," + module2 + this.module_separator + "pack.X"; // "ALL-UNNAMED,second/pack.X"
-		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.CLASS, IJavaSearchConstants.MODULE_GRAPH,
+		SearchPattern pattern = SearchPattern.createPattern(needle, IJavaSearchConstants.TYPE, IJavaSearchConstants.MODULE_GRAPH,
 				SearchPattern.R_PATTERN_MATCH);
 		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
 				{getJavaProject("JavaSearchBugs9")});
@@ -3431,6 +3431,53 @@
 		deleteProject("third");
 	}
 }
+public void testBug519151_022() throws Exception {
+	try {
+
+		IJavaProject project1 = createJavaProject("JavaSearchBugs9", new String[] {"src"}, new String[] {"JCL19_LIB"}, "bin", "9");
+		project1.open(null);
+		addClasspathEntry(project1, JavaCore.newContainerEntry(new Path("org.eclipse.jdt.MODULE_PATH")));
+		String fileContent = 
+			"module first {\n" +
+			"}\n";
+		createFile("/JavaSearchBugs9/src/module-info.java",	fileContent);
+		createFolder("/JavaSearchBugs9/src/pack");
+		createFile("/JavaSearchBugs9/src/pack/X.java",
+				"package pack;\n" +
+				"public class X {}\n");
+
+		IJavaProject project2 = createJavaProject("second", new String[] {"src"}, new String[] {"JCL19_LIB"}, "bin", "9");
+		project2.open(null);
+		addClasspathEntry(project2, JavaCore.newContainerEntry(new Path("org.eclipse.jdt.MODULE_PATH")));
+		String secondFile = 
+				"module second {\n" +
+				"}\n";
+		createFile("/second/src/module-info.java",	secondFile);
+		createFolder("/second/src/pack");
+		createFile("/second/src/pack/X.java",
+				"package pack;\n" +
+				"public class X {}\n");
+
+
+		addClasspathEntry(project1, JavaCore.newProjectEntry(project2.getPath()));
+		project1.close(); // sync
+		project2.close();
+		project2.open(null);
+		project1.open(null);
+		
+		SearchPattern pattern = SearchPattern.createPattern("first/X", IJavaSearchConstants.TYPE, DECLARATIONS, ERASURE_RULE);
+		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaProject[]
+				{getJavaProject("JavaSearchBugs9")});
+		search(pattern, scope, this.resultCollector);
+		assertSearchResults(
+				"src/pack/X.java pack.X [X] EXACT_MATCH",
+			this.resultCollector);
+	}
+	finally {
+		deleteProject("JavaSearchBugs9");
+		deleteProject("second");
+	}
+}
 public void _testBug519151_0X1() throws Exception {
 	try {
 
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/QualifiedTypeDeclarationPattern.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/QualifiedTypeDeclarationPattern.java
index ce8233e..f5ec6ee 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/QualifiedTypeDeclarationPattern.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/QualifiedTypeDeclarationPattern.java
@@ -26,7 +26,7 @@
 	this.simpleName = (this.isCaseSensitive || this.isCamelCase) ? simpleName : CharOperation.toLowerCase(simpleName);
 	this.typeSuffix = typeSuffix;
 
-	this.mustResolve = this.qualification != null || typeSuffix != TYPE_SUFFIX;
+	this.mustResolve = this.qualification != null || typeSuffix != TYPE_SUFFIX || moduleNames != null;
 }
 public QualifiedTypeDeclarationPattern(char[] qualification, char[] simpleName, char typeSuffix, int matchRule) {
 	this(null, qualification, simpleName, typeSuffix, matchRule);