Fix for bug 397070 - On completion in implements/extends clause,
supertype/interface-signature(s) can not be retrieved from enclosing
type
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests2.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests2.java
index 2f8c3af..c2b7869 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests2.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests2.java
@@ -30,19 +30,25 @@
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.CompletionContext;
+import org.eclipse.jdt.core.CompletionProposal;
+import org.eclipse.jdt.core.CompletionRequestor;
import org.eclipse.jdt.core.IAccessRule;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.tests.util.Util;
+import org.eclipse.jdt.internal.codeassist.InternalCompletionContext;
import org.eclipse.jdt.internal.codeassist.RelevanceConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.core.JavaModelManager;
+import org.eclipse.jdt.internal.core.SourceType;
import org.eclipse.jdt.internal.core.search.indexing.IndexManager;
public class CompletionTests2 extends ModifyingResourceTests implements RelevanceConstants {
@@ -5981,4 +5987,64 @@
deleteProject("P");
}
}
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=397070
+public void testBug397070() throws JavaModelException {
+ this.workingCopies = new ICompilationUnit[1];
+ this.workingCopies[0] = getWorkingCopy(
+ "/Completion/src/test/Completion.java",
+ "package test;\n" +
+ "public class Completion implements {}\n" +
+ "public interface Completion2 extends {}\n" +
+ "public class Completion3 extends {}\n" +
+ "}\n");
+
+ class CompletionRequestor2 extends CompletionRequestor {
+ SourceType type = null;
+ public void acceptContext(CompletionContext con) {
+ this.type = null;
+ if (con instanceof InternalCompletionContext) {
+ InternalCompletionContext context = (InternalCompletionContext) con;
+ IJavaElement element = context.getEnclosingElement();
+ if (element instanceof org.eclipse.jdt.internal.core.SourceType) {
+ this.type = (SourceType) element;
+ }
+ }
+ }
+ public boolean isExtendedContextRequired() {
+ return true;
+ }
+ public SourceType getType() {
+ return this.type;
+ }
+ public void accept(CompletionProposal proposal) {
+ // Do nothing
+ }
+ }
+
+ CompletionRequestor2 requestor = new CompletionRequestor2();
+ String str = this.workingCopies[0].getSource();
+ String completeBehind = "Completion implements ";
+ int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+ try {
+ this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+ SourceType type = requestor.getType();
+ String[] names = type.getSuperInterfaceTypeSignatures();
+ assertEquals("Incorrect syper interface signature", 0, names.length);
+
+ completeBehind = "Completion2 extends ";
+ cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+ this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+ type = requestor.getType();
+ names = type.getSuperInterfaceTypeSignatures();
+ assertEquals("Incorrect syper interface signature", 0, names.length);
+
+ completeBehind = "Completion3 extends ";
+ cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+ this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+ type = requestor.getType();
+ assertNull("Incorrect syper class signature", type.getSuperclassTypeSignature());
+ } catch (IllegalArgumentException iae) {
+ fail("Invalid completion context");
+ }
+}
}
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.java
index 387755d..42ff67e 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionUnitStructureRequestor.java
@@ -183,7 +183,9 @@
protected static boolean hasEmptyName(TypeReference reference, ASTNode assistNode) {
if (reference == null) return false;
- if (reference.sourceStart <= assistNode.sourceStart && assistNode.sourceEnd <= reference.sourceEnd) return false;
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=397070
+ if (reference != assistNode &&
+ reference.sourceStart <= assistNode.sourceStart && assistNode.sourceEnd <= reference.sourceEnd) return false;
if (reference instanceof CompletionOnSingleTypeReference ||
reference instanceof CompletionOnQualifiedTypeReference ||