### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: codeassist/org/eclipse/jdt/internal/codeassist/InternalCompletionContext.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/InternalCompletionContext.java,v retrieving revision 1.12 diff -u -r1.12 InternalCompletionContext.java --- codeassist/org/eclipse/jdt/internal/codeassist/InternalCompletionContext.java 27 Jun 2008 16:04:03 -0000 1.12 +++ codeassist/org/eclipse/jdt/internal/codeassist/InternalCompletionContext.java 1 Sep 2008 09:12:54 -0000 @@ -10,8 +10,17 @@ *******************************************************************************/ package org.eclipse.jdt.internal.codeassist; +import org.eclipse.jdt.core.CompletionContext; +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IField; +import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.ILocalVariable; +import org.eclipse.jdt.core.IMember; +import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.ITypeRoot; +import org.eclipse.jdt.core.Signature; import org.eclipse.jdt.core.WorkingCopyOwner; +import org.eclipse.jdt.internal.codeassist.complete.CompletionOnJavadoc; import org.eclipse.jdt.internal.codeassist.complete.CompletionParser; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; @@ -23,7 +32,7 @@ * Internal completion context * @since 3.1 */ -public class InternalCompletionContext { +public class InternalCompletionContext extends CompletionContext { protected char[][] expectedTypesSignatures; protected char[][] expectedTypesKeys; protected int javadoc; @@ -106,4 +115,257 @@ this.tokenEnd = 0; } } + + /** + * Returns the innermost enclosing Java element which contains the completion location or null if this element cannot be computed. + * The returned Java element and all Java elements in the same compilation unit which can be navigated to from the returned Java element are special Java elements: + * + * + * Reasons for returning null include: + * + * + * @return the innermost enclosing Java element which contains the completion location or null if this element cannot be computed. + * + * @exception UnsupportedOperationException if the context is not an extended context + * + * @since 3.4 + */ + public IJavaElement getEnclosingElement() { + if (!this.isExtended) throw new UnsupportedOperationException("Operation only supported in extended context"); //$NON-NLS-1$ + + if (this.extendedContext == null) return null; + + return this.extendedContext.getEnclosingElement(); + } + + /** + * Return keys of expected types of a potential completion proposal at the completion position. + * + * It's not mandatory to a completion proposal to respect this expectation. + * + * @return keys of expected types of a potential completion proposal at the completion position or + * null if there is no expected types. + * + * @see org.eclipse.jdt.core.dom.ASTParser#createASTs(ICompilationUnit[], String[], org.eclipse.jdt.core.dom.ASTRequestor, org.eclipse.core.runtime.IProgressMonitor) + */ + public char[][] getExpectedTypesKeys() { + return this.expectedTypesKeys; + } + + /** + * Return signatures of expected types of a potential completion proposal at the completion position. + * + * It's not mandatory to a completion proposal to respect this expectation. + * + * @return signatures expected types of a potential completion proposal at the completion position or + * null if there is no expected types. + * + * @see Signature + */ + public char[][] getExpectedTypesSignatures() { + return this.expectedTypesSignatures; + } + + /** + * Returns the offset position in the source file buffer + * after which code assist is requested. + * + * @return offset position in the source file buffer + * @since 3.2 + */ + public int getOffset() { + return this.offset; + } + + /** + * Returns the completed token. + * This token is either the identifier or Java language keyword + * or the string literal under, immediately preceding, + * the original request offset. If the original request offset + * is not within or immediately after an identifier or keyword or + * a string literal then the returned value is null. + * + * @return completed token or null + * @since 3.2 + */ + public char[] getToken() { + return this.token; + } + + /** + * Returns the character index of the end (exclusive) of the subrange + * in the source file buffer containing the + * relevant token. When there is no relevant token, the + * range is empty + * (getTokenEnd() == getTokenStart() - 1). + * + * @return character index of token end position (exclusive) + * @since 3.2 + */ + // TODO (david) https://bugs.eclipse.org/bugs/show_bug.cgi?id=132558 + public int getTokenEnd() { + return this.tokenEnd; + } + + /** + * Returns the kind of completion token being proposed. + *

+ * The set of different kinds of completion token is + * expected to change over time. It is strongly recommended + * that clients do not assume that the kind is one of the + * ones they know about, and code defensively for the + * possibility of unexpected future growth. + *

+ * + * @return the kind; one of the kind constants declared on + * this class whose name starts with TOKEN_KIND, + * or possibly a kind unknown to the caller + * @since 3.2 + */ + public int getTokenKind() { + return this.tokenKind; + } + + /** + * Returns the location of completion token being proposed. + * The returned location is a bit mask which can contain some values + * of the constants declared on this class whose name starts with TL, + * or possibly values unknown to the caller. + * + *

+ * The set of different location values is expected to change over time. + * It is strongly recommended that clients do not assume that + * the location contains only known value, and code defensively for + * the possibility of unexpected future growth. + *

+ * + * @return the location + * + * @since 3.4 + */ + public int getTokenLocation() { + return this.tokenLocation; + } + + /** + * Returns the character index of the start of the + * subrange in the source file buffer containing the + * relevant token being completed. This + * token is either the identifier or Java language keyword + * under, or immediately preceding, the original request + * offset. If the original request offset is not within + * or immediately after an identifier or keyword, then the + * position returned is original request offset and the + * token range is empty. + * + * @return character index of token start position (inclusive) + * @since 3.2 + */ + public int getTokenStart() { + return this.tokenStart; + } + + /** + * Return the elements which are visible from the completion location and which can be assigned to the given type. + * An element is assignable if its type can be assigned to a variable + * of the given type, as specified in section 5.2 of The Java Language + * Specification, Third Edition (JLS3). + * A visible element is either: + * + * + * Returned elements defined in the completed compilation unit are special Java elements: + * + * + * Note the array can be empty if: + * + * + * @param typeSignature elements which can be assigned to this type are returned. + * If null there is no constraint on the type of the returned elements. + * + * @return elements which are visible from the completion location and which can be assigned to the given type. + * + * @exception UnsupportedOperationException if the context is not an extended context + * + * @see #isExtended() + * + * @since 3.4 + */ + public IJavaElement[] getVisibleElements(String typeSignature) { + if (!this.isExtended) throw new UnsupportedOperationException("Operation only supported in extended context"); //$NON-NLS-1$ + + if (this.extendedContext == null) return new IJavaElement[0]; + + return this.extendedContext.getVisibleElements(typeSignature); + } + + /** + * Returns whether this completion context is an extended context. + * Some methods of this context can be used only if this context is an extended context but an extended context consumes more memory. + * + * @return true if this completion context is an extended context. + * + * @since 3.4 + */ + public boolean isExtended() { + return this.isExtended; + } + + /** + * Tell user whether completion takes place in a javadoc comment or not. + * + * @return boolean true if completion takes place in a javadoc comment, false otherwise. + * @since 3.2 + */ + public boolean isInJavadoc() { + return this.javadoc != 0; + } + + /** + * Tell user whether completion takes place in a formal reference of a javadoc tag or not. + * Tags with formal reference are: + * + * + * @return boolean true if completion takes place in formal reference of a javadoc tag, false otherwise. + * @since 3.2 + */ + public boolean isInJavadocFormalReference() { + return (this.javadoc & CompletionOnJavadoc.FORMAL_REFERENCE) != 0; + } + + /** + * Tell user whether completion takes place in text area of a javadoc comment or not. + * + * @return boolean true if completion takes place in a text area of a javadoc comment, false otherwise. + * @since 3.2 + */ + public boolean isInJavadocText() { + return (this.javadoc & CompletionOnJavadoc.TEXT) != 0; + } } Index: codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java,v retrieving revision 1.371 diff -u -r1.371 CompletionEngine.java --- codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java 8 Jul 2008 13:29:04 -0000 1.371 +++ codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java 1 Sep 2008 09:12:54 -0000 @@ -868,7 +868,7 @@ CompilationUnitDeclaration compilationUnitDeclaration, Binding qualifiedBinding, Scope scope) { - CompletionContext context = new CompletionContext(); + InternalCompletionContext context = new InternalCompletionContext(); if (this.requestor.isExtendedContextRequired()) { context.setExtendedData( this.typeRoot, @@ -938,7 +938,7 @@ this.requestor.acceptContext(context); } - private void buildTokenLocationContext(CompletionContext context, Scope scope, ASTNode astNode, ASTNode astNodeParent) { + private void buildTokenLocationContext(InternalCompletionContext context, Scope scope, ASTNode astNode, ASTNode astNodeParent) { if (scope == null || context.isInJavadoc()) return; if (astNode instanceof CompletionOnFieldType) { @@ -2311,7 +2311,7 @@ if(this.noProposal && this.problem != null) { if(!contextAccepted) { contextAccepted = true; - CompletionContext context = new CompletionContext(); + InternalCompletionContext context = new InternalCompletionContext(); if (this.requestor.isExtendedContextRequired()) context.setExtended(); this.requestor.acceptContext(context); } @@ -2346,7 +2346,7 @@ } if(!contextAccepted) { contextAccepted = true; - CompletionContext context = new CompletionContext(); + InternalCompletionContext context = new InternalCompletionContext(); if (this.requestor.isExtendedContextRequired()) context.setExtended(); this.requestor.acceptContext(context); } @@ -2567,7 +2567,7 @@ if(this.noProposal && this.problem != null) { if(!contextAccepted) { contextAccepted = true; - CompletionContext context = new CompletionContext(); + InternalCompletionContext context = new InternalCompletionContext(); context.setOffset(completionPosition - this.offset); context.setTokenKind(CompletionContext.TOKEN_KIND_UNKNOWN); if (this.requestor.isExtendedContextRequired()) context.setExtended(); @@ -2613,7 +2613,7 @@ reset(); if(!contextAccepted) { contextAccepted = true; - CompletionContext context = new CompletionContext(); + InternalCompletionContext context = new InternalCompletionContext(); context.setTokenKind(CompletionContext.TOKEN_KIND_UNKNOWN); context.setOffset(completionPosition - this.offset); if (this.requestor.isExtendedContextRequired()) context.setExtended(); Index: model/org/eclipse/jdt/core/CompletionContext.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/core/CompletionContext.java,v retrieving revision 1.16 diff -u -r1.16 CompletionContext.java --- model/org/eclipse/jdt/core/CompletionContext.java 27 Jun 2008 16:04:01 -0000 1.16 +++ model/org/eclipse/jdt/core/CompletionContext.java 1 Sep 2008 09:12:54 -0000 @@ -10,9 +10,6 @@ *******************************************************************************/ package org.eclipse.jdt.core; -import org.eclipse.jdt.internal.codeassist.InternalCompletionContext; -import org.eclipse.jdt.internal.codeassist.complete.CompletionOnJavadoc; - /** * Completion context. * @@ -22,7 +19,7 @@ * @since 3.1 * @noinstantiate This class is not intended to be instantiated by clients. */ -public final class CompletionContext extends InternalCompletionContext { +public class CompletionContext { /** * The completed token is the first token of a member declaration.
@@ -82,7 +79,7 @@ * @since 3.2 */ public boolean isInJavadoc() { - return this.javadoc != 0; + return false; // default overridden by concrete implementation } /** @@ -91,8 +88,8 @@ * @return boolean true if completion takes place in a text area of a javadoc comment, false otherwise. * @since 3.2 */ - public boolean isInJavadocText() { - return (this.javadoc & CompletionOnJavadoc.TEXT) != 0; + public boolean isInJavadocText() { + return false; // default overridden by concrete implementation } /** @@ -111,7 +108,7 @@ * @since 3.2 */ public boolean isInJavadocFormalReference() { - return (this.javadoc & CompletionOnJavadoc.FORMAL_REFERENCE) != 0; + return false; // default overridden by concrete implementation } /** @@ -123,7 +120,7 @@ * @since 3.4 */ public boolean isExtended() { - return this.isExtended; + return false; // default overridden by concrete implementation } /** @@ -137,8 +134,9 @@ * @see Signature */ public char[][] getExpectedTypesSignatures() { - return this.expectedTypesSignatures; + return null; // default overridden by concrete implementation } + /** * Return keys of expected types of a potential completion proposal at the completion position. * @@ -150,7 +148,7 @@ * @see org.eclipse.jdt.core.dom.ASTParser#createASTs(ICompilationUnit[], String[], org.eclipse.jdt.core.dom.ASTRequestor, org.eclipse.core.runtime.IProgressMonitor) */ public char[][] getExpectedTypesKeys() { - return this.expectedTypesKeys; + return null; // default overridden by concrete implementation } /** @@ -165,7 +163,7 @@ * @since 3.2 */ public char[] getToken() { - return this.token; + return null; // default overridden by concrete implementation } /** @@ -184,7 +182,7 @@ * @since 3.2 */ public int getTokenKind() { - return this.tokenKind; + return -1; // default overridden by concrete implementation } /** @@ -205,7 +203,7 @@ * @since 3.4 */ public int getTokenLocation() { - return this.tokenLocation; + return -1; // default overridden by concrete implementation } /** @@ -223,7 +221,7 @@ * @since 3.2 */ public int getTokenStart() { - return this.tokenStart; + return -1; // default overridden by concrete implementation } /** @@ -238,7 +236,7 @@ */ // TODO (david) https://bugs.eclipse.org/bugs/show_bug.cgi?id=132558 public int getTokenEnd() { - return this.tokenEnd; + return -1; // default overridden by concrete implementation } /** @@ -249,7 +247,7 @@ * @since 3.2 */ public int getOffset() { - return this.offset; + return -1; // default overridden by concrete implementation } /** @@ -275,11 +273,7 @@ * @since 3.4 */ public IJavaElement getEnclosingElement() { - if (!this.isExtended) throw new UnsupportedOperationException("Operation only supported in extended context"); //$NON-NLS-1$ - - if (this.extendedContext == null) return null; - - return this.extendedContext.getEnclosingElement(); + return null; // default overridden by concrete implementation } /** @@ -320,84 +314,7 @@ * @since 3.4 */ public IJavaElement[] getVisibleElements(String typeSignature) { - if (!this.isExtended) throw new UnsupportedOperationException("Operation only supported in extended context"); //$NON-NLS-1$ - - if (this.extendedContext == null) return new IJavaElement[0]; - - return this.extendedContext.getVisibleElements(typeSignature); + return null; // default overridden by concrete implementation } - public String toString() { - StringBuffer buffer = new StringBuffer(); - - buffer.append("completion offset="); //$NON-NLS-1$ - buffer.append(this.offset); - buffer.append('\n'); - - buffer.append("completion range=["); //$NON-NLS-1$ - buffer.append(this.tokenStart); - buffer.append(", "); //$NON-NLS-1$ - buffer.append(this.tokenEnd); - buffer.append("]\n"); //$NON-NLS-1$ - - buffer.append("completion token="); //$NON-NLS-1$ - String string = "null"; //$NON-NLS-1$ - if(this.token == null) { - buffer.append(string); - } else { - buffer.append('\"'); - buffer.append(this.token); - buffer.append('\"'); - } - buffer.append('\n'); - - buffer.append("expectedTypesSignatures="); //$NON-NLS-1$ - if(this.expectedTypesSignatures == null) { - buffer.append(string); - } else { - buffer.append('{'); - for (int i = 0; i < this.expectedTypesSignatures.length; i++) { - if(i > 0) buffer.append(','); - buffer.append(this.expectedTypesSignatures[i]); - - } - buffer.append('}'); - } - buffer.append('\n'); - - buffer.append("expectedTypesKeys="); //$NON-NLS-1$ - if(this.expectedTypesSignatures == null) { - buffer.append(string); - } else { - buffer.append('{'); - for (int i = 0; i < this.expectedTypesKeys.length; i++) { - if(i > 0) buffer.append(','); - buffer.append(this.expectedTypesKeys[i]); - - } - buffer.append('}'); - } - buffer.append('\n'); - - if (this.tokenLocation == 0) { - buffer.append("tokenLocation=UNKNOWN"); //$NON-NLS-1$ - } else { - buffer.append("tokenLocation={"); //$NON-NLS-1$ - boolean first = true; - if ((this.tokenLocation & CompletionContext.TL_MEMBER_START) != 0) { - if (!first) buffer.append(','); - buffer.append("MEMBER_START"); //$NON-NLS-1$ - first = false; - } - if ((this.tokenLocation & CompletionContext.TL_STATEMENT_START) != 0) { - if (!first) buffer.append(','); - buffer.append("STATEMENT_START"); //$NON-NLS-1$ - first = false; - } - buffer.append('}'); - } - buffer.append('\n'); - - return buffer.toString(); - } }