Index: codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java,v retrieving revision 1.240 diff -u -r1.240 CompletionEngine.java --- codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java 26 May 2005 09:06:55 -0000 1.240 +++ codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java 31 May 2005 08:13:40 -0000 @@ -733,7 +733,7 @@ findTypesAndPackages(this.completionToken, scope); if(!this.requestor.isIgnored(CompletionProposal.KEYWORD)) { if(this.completionToken != null && this.completionToken.length != 0) { - findKeywords(this.completionToken, singleNameReference.possibleKeywords); + findKeywords(this.completionToken, singleNameReference.possibleKeywords, false); } else { findTrueOrFalseKeywords(singleNameReference.possibleKeywords); } @@ -830,7 +830,7 @@ ((scope instanceof MethodScope && !((MethodScope)scope).isStatic) || ((methodScope = scope.enclosingMethodScope()) != null && !methodScope.isStatic))) { if(this.completionToken.length > 0) { - findKeywords(this.completionToken, new char[][]{Keywords.THIS}); + findKeywords(this.completionToken, new char[][]{Keywords.THIS}, false); } else { int relevance = computeBaseRelevance(); relevance += computeRelevanceForInterestingProposal(); @@ -942,7 +942,7 @@ this.completionToken = access.token; if(!this.requestor.isIgnored(CompletionProposal.KEYWORD)) { - findKeywords(this.completionToken, new char[][]{Keywords.NEW}); + findKeywords(this.completionToken, new char[][]{Keywords.NEW}, false); } findFieldsAndMethods( @@ -1106,7 +1106,7 @@ if(astNode instanceof CompletionOnKeyword) { if(!this.requestor.isIgnored(CompletionProposal.KEYWORD)) { CompletionOnKeyword keyword = (CompletionOnKeyword)astNode; - findKeywords(keyword.getToken(), keyword.getPossibleKeywords()); + findKeywords(keyword.getToken(), keyword.getPossibleKeywords(), keyword.canCompleteEmptyToken()); } } else if(astNode instanceof CompletionOnParameterizedQualifiedTypeReference) { if(!this.requestor.isIgnored(CompletionProposal.TYPE_REF)) { @@ -1464,7 +1464,7 @@ if(!this.requestor.isIgnored(CompletionProposal.KEYWORD)) { setSourceRange(importReference.sourceStart, importReference.sourceEnd); CompletionOnKeyword keyword = (CompletionOnKeyword)importReference; - findKeywords(keyword.getToken(), keyword.getPossibleKeywords()); + findKeywords(keyword.getToken(), keyword.getPossibleKeywords(), false); } if(this.noProposal && this.problem != null) { this.requestor.completionFailure(this.problem); @@ -2590,11 +2590,11 @@ // what about onDemand types? Ignore them since it does not happen! // import p1.p2.A.*; - private void findKeywords(char[] keyword, char[][] choices) { + private void findKeywords(char[] keyword, char[][] choices, boolean canCompleteEmptyToken) { if(choices == null || choices.length == 0) return; int length = keyword.length; - if (length > 0) + if (canCompleteEmptyToken || length > 0) for (int i = 0; i < choices.length; i++) if (length <= choices[i].length && CharOperation.prefixEquals(keyword, choices[i], false /* ignore case */ @@ -2742,7 +2742,7 @@ } System.arraycopy(keywords, 0, keywords = new char[count][], 0, count); - findKeywords(token, keywords); + findKeywords(token, keywords, false); } // Helper method for findMemberTypes(char[], ReferenceBinding, Scope) @@ -4546,7 +4546,7 @@ } } else { if(!this.requestor.isIgnored(CompletionProposal.KEYWORD)) { - findKeywords(token, baseTypes); + findKeywords(token, baseTypes, false); } if(proposeType) { int l = typesFound.size(); Index: codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.java,v retrieving revision 1.5 diff -u -r1.5 CompletionOnKeyword.java --- codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.java 23 Feb 2005 02:47:28 -0000 1.5 +++ codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword.java 31 May 2005 08:13:40 -0000 @@ -14,4 +14,5 @@ char[] getToken(); char[][] getPossibleKeywords(); + boolean canCompleteEmptyToken(); } Index: codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.java,v retrieving revision 1.6 diff -u -r1.6 CompletionOnKeyword1.java --- codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.java 23 Feb 2005 02:47:28 -0000 1.6 +++ codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword1.java 31 May 2005 08:13:40 -0000 @@ -16,6 +16,8 @@ public class CompletionOnKeyword1 extends SingleTypeReference implements CompletionOnKeyword { private char[][] possibleKeywords; + public boolean canCompleteEmptyToken; + public CompletionOnKeyword1(char[] token, long pos, char[] possibleKeyword) { this(token, pos, new char[][]{possibleKeyword}); } @@ -23,6 +25,9 @@ super(token, pos); this.possibleKeywords = possibleKeywords; } + public boolean canCompleteEmptyToken() { + return this.canCompleteEmptyToken; + } public char[] getToken() { return token; } Index: codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.java,v retrieving revision 1.7 diff -u -r1.7 CompletionOnKeyword2.java --- codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.java 23 Feb 2005 02:47:28 -0000 1.7 +++ codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword2.java 31 May 2005 08:13:40 -0000 @@ -20,6 +20,9 @@ this.token = token; this.possibleKeywords = possibleKeywords; } + public boolean canCompleteEmptyToken() { + return false; + } public char[] getToken() { return token; } Index: codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.java,v retrieving revision 1.6 diff -u -r1.6 CompletionOnKeyword3.java --- codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.java 23 Feb 2005 02:47:28 -0000 1.6 +++ codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnKeyword3.java 31 May 2005 08:13:40 -0000 @@ -24,6 +24,9 @@ this.token = token; this.possibleKeywords = possibleKeywords; } + public boolean canCompleteEmptyToken() { + return false; + } public char[] getToken() { return token; } Index: codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java,v retrieving revision 1.133 diff -u -r1.133 CompletionParser.java --- codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java 26 May 2005 14:22:47 -0000 1.133 +++ codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java 31 May 2005 08:13:42 -0000 @@ -2833,11 +2833,13 @@ return; } Wildcard wildcard = (Wildcard) this.genericsStack[this.genericsPtr]; - wildcard.kind = Wildcard.EXTENDS; - wildcard.bound = new CompletionOnKeyword1( + CompletionOnKeyword1 keyword = new CompletionOnKeyword1( identifierStack[this.identifierPtr], identifierPositionStack[this.identifierPtr], new char[][]{Keywords.EXTENDS, Keywords.SUPER} ); + keyword.canCompleteEmptyToken = true; + wildcard.kind = Wildcard.EXTENDS; + wildcard.bound = keyword; this.identifierPtr--; this.identifierLengthPtr--;