Fix for Bug 527873 - [9][content assist] proposes default package
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests9.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests9.java
index 49b8078..33d5140 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests9.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests9.java
@@ -604,6 +604,7 @@
String filePath2 = "/Completion9_2/src/module-info.java";
createFile(filePath2, fileContent2);
addClasspathEntry(project2, JavaCore.newContainerEntry(new Path("org.eclipse.jdt.MODULE_PATH")));
+ addClasspathEntry(project1, JavaCore.newContainerEntry(project2.getPath()));
project1.close(); // sync
project2.close();
@@ -616,8 +617,10 @@
ICompilationUnit unit = getCompilationUnit(filePath1);
unit.codeComplete(cursorLocation, requestor);
- String expected = "pack11[PACKAGE_REF]{pack11, pack11, null, null, 49}\n" +
- "pack11.packinternal[PACKAGE_REF]{pack11.packinternal, pack11.packinternal, null, null, 49}\n" +
+ String expected = "Y12[TYPE_REF]{pack12.Y12, pack12, Lpack12.Y12;, null, 39}\n" +
+ "Z12[TYPE_REF]{pack11.packinternal.Z12, pack11.packinternal, Lpack11.packinternal.Z12;, null, 39}\n" +
+ "pack11[PACKAGE_REF]{pack11, pack11, null, null, 49}\n" +
+ "pack11.packinternal[PACKAGE_REF]{pack11.packinternal, pack11.packinternal, null, null, 49}\n" +
"pack12[PACKAGE_REF]{pack12, pack12, null, null, 49}"
//+ "\nShow me the type Honey!!"
;
@@ -873,4 +876,120 @@
deleteProject(project2);
}
}
+
+public void test527873_001() throws Exception {
+ IJavaProject project1 = createJavaProject("Completion9_1", new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "9");
+ IJavaProject project2 = createJavaProject("Completion9_2", new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "9");
+ try {
+ project1.open(null);
+ createType("/Completion9_1/src/", "pack11", "X11");
+ createType("/Completion9_1/src/", "pack11.packinternal", "Z11");
+ createTypePlus("/Completion9_1/src/", "pack11.packinternal", "Z12", "implements pack22.I22", true /* isClass */, false /* createFolder */);
+ createType("/Completion9_1/src/", "pack12", "X12");
+ createTypePlus("/Completion9_1/src/", "pack12", "Y12", "implements pack22.I22", true /* isClass */, false /* createFolder */);
+ String filePath1 = "/Completion9_1/src/module-info.java";
+ String completeBehind = "with ";
+ String fileContent1 = "module first {\n"
+ + "requires second;\n"
+ + "provides pack22.I22 " + completeBehind
+ + "}\n";
+ createFile(filePath1, fileContent1);
+ addClasspathEntry(project1, JavaCore.newContainerEntry(new Path("org.eclipse.jdt.MODULE_PATH")));
+
+ project2.open(null);
+ createType("/Completion9_2/src/", "pack21", "X21");
+ createType("/Completion9_2/src/", "pack22", "X22");
+ createTypePlus("/Completion9_2/src/", "pack22", "I22", null, false /* isClass */, false /* createFolder */);
+
+ String fileContent2 = "module second { "
+ + "exports pack21 to first;\n"
+ + "exports pack22 to first;\n"
+ + "}\n";
+ String filePath2 = "/Completion9_2/src/module-info.java";
+ createFile(filePath2, fileContent2);
+ addClasspathEntry(project2, JavaCore.newContainerEntry(new Path("org.eclipse.jdt.MODULE_PATH")));
+ addClasspathEntry(project1, JavaCore.newContainerEntry(project2.getPath()));
+
+ project1.close(); // sync
+ project2.close();
+ project2.open(null);
+ project1.open(null);
+
+ int cursorLocation = fileContent1.lastIndexOf(completeBehind) + completeBehind.length();
+ CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2();
+
+ ICompilationUnit unit = getCompilationUnit(filePath1);
+ unit.codeComplete(cursorLocation, requestor);
+
+ String expected =
+ "Y12[TYPE_REF]{pack12.Y12, pack12, Lpack12.Y12;, null, 39}\n" +
+ "Z12[TYPE_REF]{pack11.packinternal.Z12, pack11.packinternal, Lpack11.packinternal.Z12;, null, 39}\n" +
+ "pack11[PACKAGE_REF]{pack11, pack11, null, null, 39}\n" +
+ "pack11.packinternal[PACKAGE_REF]{pack11.packinternal, pack11.packinternal, null, null, 39}\n" +
+ "pack12[PACKAGE_REF]{pack12, pack12, null, null, 39}";
+ assertResults(expected, requestor.getResults());
+ } finally {
+ deleteProject(project1);
+ deleteProject(project2);
+ }
+}
+public void test527873_002() throws Exception {
+ IJavaProject project1 = createJavaProject("Completion9_1", new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "9");
+ IJavaProject project2 = createJavaProject("Completion9_2", new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "9");
+ try {
+ project1.open(null);
+ createType("/Completion9_1/src/", "pack11", "X11");
+ createType("/Completion9_1/src/", "pack11.packinternal", "Z11");
+ createTypePlus("/Completion9_1/src/", "pack11.packinternal", "Z12", "implements pack22.I22", true /* isClass */, false /* createFolder */);
+ createType("/Completion9_1/src/", "pack12", "X12");
+ createTypePlus("/Completion9_1/src/", "pack12", "Y12", "implements pack22.I22", true /* isClass */, false /* createFolder */);
+ createTypePlus("/Completion9_1/src/", "", "X", "implements pack22.I22", true /* isClass */, false /* createFolder */);
+ String filePath1 = "/Completion9_1/src/module-info.java";
+ String completeBehind = "with ";
+ String fileContent1 = "module first {\n"
+ + "requires second;\n"
+ + "provides pack22.I22 " + completeBehind
+ + "}\n";
+ createFile(filePath1, fileContent1);
+ addClasspathEntry(project1, JavaCore.newContainerEntry(new Path("org.eclipse.jdt.MODULE_PATH")));
+
+ project2.open(null);
+ createType("/Completion9_2/src/", "pack21", "X21");
+ createType("/Completion9_2/src/", "pack22", "X22");
+ createTypePlus("/Completion9_2/src/", "pack22", "I22", null, false /* isClass */, false /* createFolder */);
+
+ String fileContent2 = "module second { "
+ + "exports pack21 to first;\n"
+ + "exports pack22 to first;\n"
+ + "}\n";
+ String filePath2 = "/Completion9_2/src/module-info.java";
+ createFile(filePath2, fileContent2);
+ addClasspathEntry(project2, JavaCore.newContainerEntry(new Path("org.eclipse.jdt.MODULE_PATH")));
+ addClasspathEntry(project1, JavaCore.newContainerEntry(project2.getPath()));
+
+ project1.close(); // sync
+ project2.close();
+ project2.open(null);
+ project1.open(null);
+
+ int cursorLocation = fileContent1.lastIndexOf(completeBehind) + completeBehind.length();
+ CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2();
+
+ ICompilationUnit unit = getCompilationUnit(filePath1);
+ unit.codeComplete(cursorLocation, requestor);
+
+ String expected =
+ "Y12[TYPE_REF]{pack12.Y12, pack12, Lpack12.Y12;, null, 39}\n" +
+ "Z12[TYPE_REF]{pack11.packinternal.Z12, pack11.packinternal, Lpack11.packinternal.Z12;, null, 39}\n" +
+ "pack11[PACKAGE_REF]{pack11, pack11, null, null, 39}\n" +
+ "pack11.packinternal[PACKAGE_REF]{pack11.packinternal, pack11.packinternal, null, null, 39}\n" +
+ "pack12[PACKAGE_REF]{pack12, pack12, null, null, 39}\n" +
+ "X[TYPE_REF]{X, , LX;, null, 42}"
+ ;
+ assertResults(expected, requestor.getResults());
+ } finally {
+ deleteProject(project1);
+ deleteProject(project2);
+ }
+}
}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
index ac1ace9..b738fe7 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
@@ -712,7 +712,7 @@
private INameEnvironment noCacheNameEnvironment;
char[] source;
ModuleDeclaration moduleDeclaration;
- boolean isPackageVisibilityCompletion = false;
+ boolean skipDefaultPackage = false;
char[] completionToken;
char[] qualifiedCompletionToken;
@@ -1332,7 +1332,7 @@
if (!isValidPackageName(packageName)) return;
- if (this.isPackageVisibilityCompletion &&
+ if (this.skipDefaultPackage &&
CharOperation.equals(packageName, CharOperation.NO_CHAR))
return;
@@ -2111,6 +2111,7 @@
TypeReference implementation = implementations[j];
if (implementation instanceof CompletionOnProvidesImplementationsSingleTypeReference ||
implementation instanceof CompletionOnProvidesImplementationsQualifiedTypeReference) {
+ this.skipDefaultPackage = true;
contextAccepted = checkForCNF(implementation, parsedUnit, false);
return;
} else if (implementation instanceof CompletionOnKeyword) {
@@ -2142,6 +2143,8 @@
e.scope,
e.insideTypeAnnotation);
}
+ } finally {
+ this.skipDefaultPackage = false;
}
}
// scan the package & import statements first
@@ -2343,7 +2346,7 @@
private boolean completeOnPackageVisibilityStatements(boolean contextAccepted,
CompilationUnitDeclaration parsedUnit, PackageVisibilityStatement[] pvsStmts) {
try {
- this.isPackageVisibilityCompletion = true;
+ this.skipDefaultPackage = true;
for (int i = 0, l = pvsStmts.length; i < l; ++i) {
PackageVisibilityStatement pvs = pvsStmts[i];
if (pvs instanceof CompletionOnKeywordModuleInfo) { // dummy pvs statement
@@ -2384,7 +2387,7 @@
}
}
} finally {
- this.isPackageVisibilityCompletion = false;
+ this.skipDefaultPackage = false;
}
return contextAccepted;
}