Fixed bug 521362: [9][compiler] Error not reported for exports directive
in module-info when the exported package contains an empty java file

Change-Id: Id66208a1b459c3b260986509b7a723fb9e22f3b0
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InMemoryNameEnvironment9.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InMemoryNameEnvironment9.java
index f5f6b2b..4cc41f1 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InMemoryNameEnvironment9.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/InMemoryNameEnvironment9.java
@@ -77,8 +77,8 @@
 	}
 
 	@Override
-	public boolean hasCompilationUnit(char[][] qualifiedPackageName, char[] moduleName) {
-		return fromFirstClassLib(env -> env.hasCompilationUnit(qualifiedPackageName, moduleName) ? Boolean.TRUE : null);
+	public boolean hasCompilationUnit(char[][] qualifiedPackageName, char[] moduleName, boolean checkCUs) {
+		return fromFirstClassLib(env -> env.hasCompilationUnit(qualifiedPackageName, moduleName, checkCUs) ? Boolean.TRUE : null);
 	}
 
 	@Override
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ModuleCompilationTests.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ModuleCompilationTests.java
index fe22cd3..04f528a 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ModuleCompilationTests.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ModuleCompilationTests.java
@@ -3172,4 +3172,123 @@
 				false,
 				outDir);
 	}
+public void testBug521362_emptyFile() {
+		File outputDirectory = new File(OUTPUT_DIR);
+		Util.flushDirectoryContent(outputDirectory);
+		String out = "bin";
+		String directory = OUTPUT_DIR + File.separator + "src";
+		String moduleLoc = directory + File.separator + "mod.one";
+		List<String> files = new ArrayList<>(); 
+		writeFileCollecting(files, moduleLoc, "module-info.java", 
+						"module mod.one { \n" +
+						"	exports p1;\n" +
+						"}");
+		writeFileCollecting(files, moduleLoc + File.separator + "p1", "X.java", 
+						"");
+
+		StringBuffer buffer = new StringBuffer();
+		buffer.append("-d " + OUTPUT_DIR + File.separator + out )
+			.append(" -9 ")
+			.append(" -classpath \"")
+			.append(Util.getJavaClassLibsAsString())
+			.append("\" ")
+			.append(" --module-source-path " + "\"" + directory + "\"");
+
+		runNegativeModuleTest(files, 
+			buffer,
+			"",
+			"----------\n" + 
+			"1. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 2)\n" + 
+			"	exports p1;\n" + 
+			"	        ^^\n" + 
+			"The package p1 does not exist or is empty\n" + 
+			"----------\n" +
+			"----------\n" + 
+			"2. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/p1/X.java\n" + 
+			"Must declare a named package because this compilation unit is associated to the named module \'mod.one\'\n" + 
+			"----------\n" + 
+			"2 problems (2 errors)\n",
+			false,
+			OUTPUT_DIR + File.separator + out);
+	}
+	public void testBug521362_mismatchingdeclaration() {
+		File outputDirectory = new File(OUTPUT_DIR);
+		Util.flushDirectoryContent(outputDirectory);
+		String out = "bin";
+		String directory = OUTPUT_DIR + File.separator + "src";
+		String moduleLoc = directory + File.separator + "mod.one";
+		List<String> files = new ArrayList<>(); 
+		writeFileCollecting(files, moduleLoc, "module-info.java", 
+						"module mod.one { \n" +
+						"	exports p1;\n" +
+						"}");
+		writeFileCollecting(files, moduleLoc + File.separator + "p1", "X.java", 
+						"package q;\n");
+
+		StringBuffer buffer = new StringBuffer();
+		buffer.append("-d " + OUTPUT_DIR + File.separator + out )
+			.append(" -9 ")
+			.append(" -classpath \"")
+			.append(Util.getJavaClassLibsAsString())
+			.append("\" ")
+			.append(" --module-source-path " + "\"" + directory + "\"");
+
+		runNegativeModuleTest(files, 
+			buffer,
+			"",
+			"----------\n" + 
+			"1. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 2)\n" + 
+			"	exports p1;\n" + 
+			"	        ^^\n" + 
+			"The package p1 does not exist or is empty\n" + 
+			"----------\n" + 
+			"1 problem (1 error)\n",
+			false,
+			OUTPUT_DIR + File.separator + out);
+	}
+	public void testBug521362_multiplePackages() {
+		File outputDirectory = new File(OUTPUT_DIR);
+		Util.flushDirectoryContent(outputDirectory);
+		String out = "bin";
+		String directory = OUTPUT_DIR + File.separator + "src";
+		String moduleLoc = directory + File.separator + "mod.one";
+		List<String> files = new ArrayList<>(); 
+		writeFileCollecting(files, moduleLoc, "module-info.java", 
+						"module mod.one { \n" +
+						"	exports p1;\n" +
+						"	exports p2;\n" +
+						"	exports p3;\n" +
+						"}");
+		writeFileCollecting(files, moduleLoc + File.separator + "p1", "X.java", 
+						"package q;\n");
+		writeFileCollecting(files, moduleLoc + File.separator + "p2", "X.java", 
+				"package q2;\n");
+		writeFileCollecting(files, moduleLoc + File.separator + "p3", "X.java", 
+				"package p3;\n");
+		StringBuffer buffer = new StringBuffer();
+		buffer.append("-d " + OUTPUT_DIR + File.separator + out )
+			.append(" -9 ")
+			.append(" -classpath \"")
+			.append(Util.getJavaClassLibsAsString())
+			.append("\" ")
+			.append(" --module-source-path " + "\"" + directory + "\"");
+
+		runNegativeModuleTest(files, 
+			buffer,
+			"",
+			"----------\n" + 
+			"1. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 2)\n" + 
+			"	exports p1;\n" + 
+			"	        ^^\n" + 
+			"The package p1 does not exist or is empty\n" + 
+			"----------\n" + 
+			"2. ERROR in ---OUTPUT_DIR_PLACEHOLDER---/src/mod.one/module-info.java (at line 3)\n" + 
+			"	exports p2;\n" + 
+			"	        ^^\n" + 
+			"The package p2 does not exist or is empty\n" + 
+			"----------\n" + 
+			"2 problems (2 errors)\n",
+			false,
+			OUTPUT_DIR + File.separator + out);
+	}
 }
diff --git a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.java b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.java
index 42de3ea..c3b37dd 100644
--- a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.java
+++ b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/ClasspathDirectory.java
@@ -44,6 +44,8 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Stream;
 
 @SuppressWarnings({"rawtypes", "unchecked"})
 public class ClasspathDirectory extends ClasspathLocation {
@@ -304,6 +306,24 @@
 	}
 	return false;
 }
+public boolean hasCUDeclaringPackage(String qualifiedPackageName, Function<CompilationUnit, String> pkgNameExtractor) {
+	String qp2 = File.separatorChar == '/' ? qualifiedPackageName : qualifiedPackageName.replace('/', File.separatorChar);
+	return Stream.of(directoryList(qp2)).anyMatch(entry -> {
+		String entryLC = entry.toLowerCase();
+		boolean hasDeclaration = false;
+		String fullPath = this.path + qp2 + "/" + entryLC; //$NON-NLS-1$
+		String pkgName = null;
+		if (entryLC.endsWith(SUFFIX_STRING_class)) {
+			return true;
+		} else if (entryLC.endsWith(SUFFIX_STRING_java)) {
+			CompilationUnit cu = new CompilationUnit(null, fullPath, this.encoding);
+			pkgName = pkgNameExtractor.apply(cu);
+		}
+		if (pkgName != null && pkgName.equals(qualifiedPackageName))
+			hasDeclaration = true;
+		return hasDeclaration;
+	});
+}
 public void reset() {
 	this.directoryCache = new Hashtable(11);
 }
diff --git a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/FileSystem.java b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/FileSystem.java
index 76773a4..44dd232 100644
--- a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/FileSystem.java
+++ b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/FileSystem.java
@@ -24,12 +24,16 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.Consumer;
+import java.util.function.Function;
 import java.util.zip.ZipFile;
 
 import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.internal.compiler.CompilationResult;
+import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies;
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader;
 import org.eclipse.jdt.internal.compiler.classfmt.ExternalAnnotationDecorator;
 import org.eclipse.jdt.internal.compiler.env.AccessRuleSet;
@@ -39,9 +43,12 @@
 import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer;
 import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding;
 import org.eclipse.jdt.internal.compiler.parser.Parser;
+import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
+import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
 import org.eclipse.jdt.internal.compiler.env.IUpdatableModule;
 import org.eclipse.jdt.internal.compiler.env.IUpdatableModule.UpdateKind;
 import org.eclipse.jdt.internal.compiler.env.IUpdatableModule.UpdatesByKind;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.eclipse.jdt.internal.compiler.util.JRTUtil;
 import org.eclipse.jdt.internal.compiler.util.SuffixConstants;
 import org.eclipse.jdt.internal.compiler.util.Util;
@@ -65,6 +72,9 @@
 		NameEnvironmentAnswer findClass(char[] typeName, String qualifiedPackageName, String moduleName, String qualifiedBinaryFileName, boolean asBinaryOnly);
 		boolean isPackage(String qualifiedPackageName, /*@Nullable*/String moduleName);
 		default boolean hasModule() { return getModule() != null; }
+		default boolean hasCUDeclaringPackage(String qualifiedPackageName, Function<CompilationUnit, String> pkgNameExtractor) {
+			return hasCompilationUnit(qualifiedPackageName, null);
+		}
 		/**
 		 * Return a list of the jar file names defined in the Class-Path section
 		 * of the jar file manifest if any, null else. Only ClasspathJar (and
@@ -541,18 +551,35 @@
 	}
 	return allNames;
 }
-
+private Parser getParser() {
+	Map<String,String> opts = new HashMap<String, String>();
+	opts.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_9);
+	return new Parser(
+			new ProblemReporter(DefaultErrorHandlingPolicies.exitOnFirstError(), new CompilerOptions(opts), new DefaultProblemFactory(Locale.getDefault())),
+			false);
+}
 @Override
-public boolean hasCompilationUnit(char[][] qualifiedPackageName, char[] moduleName) {
+public boolean hasCompilationUnit(char[][] qualifiedPackageName, char[] moduleName, boolean checkCUs) {
 	String qPackageName = String.valueOf(CharOperation.concatWith(qualifiedPackageName, '/'));
 	String moduleNameString = String.valueOf(moduleName);
 	LookupStrategy strategy = LookupStrategy.get(moduleName);
+	Parser parser = checkCUs ? getParser() : null;
+	Function<CompilationUnit, String> pkgNameExtractor = (sourceUnit) -> {
+		String pkgName = null;	
+		CompilationResult compilationResult = new CompilationResult(sourceUnit, 0, 0, 1);
+		char[][] name = parser.parsePackageDeclaration(sourceUnit.getContents(), compilationResult);
+		if (name != null) {
+			pkgName = CharOperation.toString(name);
+		}
+		return pkgName;
+	};
 	switch (strategy) {
 		case Named:
 			if (this.moduleLocations != null) {
 				Classpath location = this.moduleLocations.get(moduleNameString);
 				if (location != null)
-					return location.hasCompilationUnit(qPackageName, moduleNameString);
+					return checkCUs ? location.hasCUDeclaringPackage(qPackageName, pkgNameExtractor)
+							: location.hasCompilationUnit(qPackageName, moduleNameString);
 			}
 			return false;
 		default:
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java
index 43de885..cdc7206 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java
@@ -127,7 +127,7 @@
 			}
 		}
 		if (this.moduleDeclaration != null) {
-			this.moduleDeclaration.analyseModuleGraph(this.scope);
+			this.moduleDeclaration.analyseCode(this.scope);
 		}
 		// request inner emulation propagation
 		propagateInnerEmulationForAllLocalTypes();
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ModuleDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ModuleDeclaration.java
index 851d898..9d9a667 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ModuleDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ModuleDeclaration.java
@@ -35,6 +35,7 @@
 import org.eclipse.jdt.internal.compiler.lookup.PackageBinding;
 import org.eclipse.jdt.internal.compiler.lookup.Scope;
 import org.eclipse.jdt.internal.compiler.lookup.SourceModuleBinding;
+import org.eclipse.jdt.internal.compiler.lookup.SplitPackageBinding;
 import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
 import org.eclipse.jdt.internal.compiler.problem.AbortType;
 import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
@@ -254,6 +255,25 @@
 		this.binding.setServices(interfaces.toArray(new TypeBinding[interfaces.size()]));
 	}
 
+	public void analyseCode(CompilationUnitScope skope) {
+		analyseModuleGraph(skope);
+		analyseExportedPackages(skope);
+	}
+	
+	private void analyseExportedPackages(CompilationUnitScope skope) {
+		if (this.exports != null) {
+			for (ExportsStatement export : this.exports) {
+				PackageBinding pb = export.resolvedPackage;
+				if (pb == null)
+					continue;
+				if (pb instanceof SplitPackageBinding)
+					pb = ((SplitPackageBinding) pb).getIncarnation(this.binding);
+				if (pb.hasCompilationUnit(true))
+					continue;
+				skope.problemReporter().invalidPackageReference(IProblem.PackageDoesNotExistOrIsEmpty, export);
+			}
+		}
+	}
 	public void analyseModuleGraph(CompilationUnitScope skope) {
 		if (this.requires != null) {
 			// collect transitively:
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IModuleAwareNameEnvironment.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IModuleAwareNameEnvironment.java
index 5fc3dac..7136d30 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IModuleAwareNameEnvironment.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/env/IModuleAwareNameEnvironment.java
@@ -109,9 +109,10 @@
 	/**
 	 * Answer whether the given package (within the given module) contains any compilation unit.
 	 * @param qualifiedPackageName
+	 * @param checkCUs - if true, check contained Compilation Units for a matching package declaration
 	 * @return true iff the package contains at least one compilation unit.
 	 */
-	boolean hasCompilationUnit(char[][] qualifiedPackageName, char[] moduleName);
+	boolean hasCompilationUnit(char[][] qualifiedPackageName, char[] moduleName, boolean checkCUs);
 	
 	/** Get the module with the given name, which must denote a named module. */
 	IModule getModule(char[] moduleName);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
index a2b492d..9f2dc4b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
@@ -76,7 +76,7 @@
 		@Override
 		public boolean isPackageExportedTo(PackageBinding pkg, ModuleBinding client) {
 			// per JLS 7.7.5 an unnamed module exports all its packages
-			return pkg.isDeclaredIn(this) && pkg.hasCompilationUnit();
+			return pkg.isDeclaredIn(this) && pkg.hasCompilationUnit(false);
 		}
 		@Override
 		public boolean isUnnamed() {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.java
index 82ac6d6..e41c1db 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/PackageBinding.java
@@ -389,7 +389,7 @@
 public PackageBinding getVisibleFor(ModuleBinding module) {
 	return this;
 }
-public boolean hasCompilationUnit() {
+public boolean hasCompilationUnit(boolean checkCUs) {
 	if (this.knownTypes != null) {
 		for (ReferenceBinding knownType : this.knownTypes.valueTable) {
 			if (knownType != null && knownType != LookupEnvironment.TheNotFoundType)
@@ -398,7 +398,7 @@
 	}
 	if (this.environment.useModuleSystem) {
 		IModuleAwareNameEnvironment moduleEnv = (IModuleAwareNameEnvironment) this.environment.nameEnvironment;
-		return moduleEnv.hasCompilationUnit(this.compoundName, this.enclosingModule.nameForLookup());
+		return moduleEnv.hasCompilationUnit(this.compoundName, this.enclosingModule.nameForLookup(), checkCUs);
 	}
 	return false;
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SplitPackageBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SplitPackageBinding.java
index eca945d..8fb1c62 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SplitPackageBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SplitPackageBinding.java
@@ -268,7 +268,7 @@
 		int visibleCount = 0;
 		PackageBinding unique = null;
 		for (PackageBinding incarnation : this.incarnations) {
-			if (incarnation.hasCompilationUnit()) {
+			if (incarnation.hasCompilationUnit(false)) {
 				if (incarnation.enclosingModule == clientModule) {
 					return incarnation; // prefer local package over foreign
 				} else {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
index 6c2ad64..6e31989 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
@@ -11062,10 +11062,13 @@
 	this.scanner.recordLineSeparator = false;
 }
 public void goForPackageDeclaration() {
+	goForPackageDeclaration(true);
+}
+public void goForPackageDeclaration(boolean recordLineSeparators) {
 	//tells the scanner to go for package declaration parsing
 
 	this.firstToken = TokenNameQUESTION;
-	this.scanner.recordLineSeparator = true;
+	this.scanner.recordLineSeparator = recordLineSeparators;
 }
 public void goForTypeDeclaration() {
 	//tells the scanner to go for type (interface or class) declaration parsing
@@ -12182,6 +12185,29 @@
 	return parseExpression(source, offset, length, unit, recordLineSeparators);
 }
 
+public char[][] parsePackageDeclaration(char[] source, CompilationResult result) {
+	initialize();
+	goForPackageDeclaration(false);
+	this.referenceContext =
+			this.compilationUnit =
+				new CompilationUnitDeclaration(
+					problemReporter(),
+					result,
+					source.length);
+	this.scanner.setSource(source);
+	try {
+		parse();
+	} catch (AbortCompilation ex) {
+		this.lastAct = ERROR_ACTION;
+	}
+
+	if (this.lastAct == ERROR_ACTION) {
+		return null;
+	}
+
+	return this.compilationUnit.currentPackage == null ? null : this.compilationUnit.currentPackage.getImportName();
+
+}
 public Expression parseExpression(char[] source, int offset, int length, CompilationUnitDeclaration unit, boolean recordLineSeparators) {
 
 	initialize();
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java
index 611e9fc..411f637 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java
@@ -849,7 +849,7 @@
 		}
 	}
 	@Override
-	public boolean hasCompilationUnit(char[][] pkgName, char[] moduleName) {
+	public boolean hasCompilationUnit(char[][] pkgName, char[] moduleName, boolean checkCUs) {
 		LookupStrategy strategy = LookupStrategy.get(moduleName);
 		switch (strategy) {
 			case Named:
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java
index 2a7a9ab..f27e7da 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java
@@ -528,7 +528,7 @@
 }
 
 @Override
-public boolean hasCompilationUnit(char[][] qualifiedPackageName, char[] moduleName) {
+public boolean hasCompilationUnit(char[][] qualifiedPackageName, char[] moduleName, boolean checkCUs) {
 	String pkgName = String.valueOf(CharOperation.concatWith(qualifiedPackageName, '/'));
 	LookupStrategy strategy = LookupStrategy.get(moduleName);
 	String modName = LookupStrategy.getStringName(moduleName);
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.java
index 7828b0a..8379e67 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment.java
@@ -349,7 +349,7 @@
 }
 
 @Override
-public boolean hasCompilationUnit(char[][] qualifiedPackageName, char[] moduleName) {
+public boolean hasCompilationUnit(char[][] qualifiedPackageName, char[] moduleName, boolean checkCUs) {
 	String qualifiedPackageNameString = String.valueOf(CharOperation.concatWith(qualifiedPackageName, '/'));
 	LookupStrategy strategy = LookupStrategy.get(moduleName);
 	String moduleNameString = LookupStrategy.getStringName(moduleName);