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);