| /******************************************************************************* |
| * Copyright (c) 2005, 2011 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.codeassist; |
| |
| import org.eclipse.jdt.core.CompletionContext; |
| import org.eclipse.jdt.core.IJavaElement; |
| import org.eclipse.jdt.core.ITypeRoot; |
| 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; |
| import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; |
| import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding; |
| import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment; |
| import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; |
| import org.eclipse.jdt.internal.compiler.lookup.Scope; |
| import org.eclipse.jdt.internal.compiler.util.ObjectVector; |
| |
| |
| /** |
| * Internal completion context |
| * @since 3.1 |
| */ |
| public class InternalCompletionContext extends CompletionContext { |
| protected char[][] expectedTypesSignatures; |
| protected char[][] expectedTypesKeys; |
| protected int javadoc; |
| |
| protected int offset = -1; |
| protected int tokenStart = -1; |
| protected int tokenEnd = -1; |
| protected char[] token = null; |
| protected int tokenKind; |
| protected int tokenLocation; |
| |
| protected boolean isExtended; |
| protected InternalExtendedCompletionContext extendedContext; |
| |
| protected void setExpectedTypesKeys(char[][] expectedTypesKeys) { |
| this.expectedTypesKeys = expectedTypesKeys; |
| } |
| |
| protected void setExpectedTypesSignatures(char[][] expectedTypesSignatures) { |
| this.expectedTypesSignatures = expectedTypesSignatures; |
| } |
| |
| protected void setExtended() { |
| this.isExtended = true; |
| } |
| |
| protected void setExtendedData( |
| ITypeRoot typeRoot, |
| CompilationUnitDeclaration compilationUnitDeclaration, |
| LookupEnvironment lookupEnvironment, |
| Scope scope, |
| ASTNode astNode, |
| ASTNode astNodeParent, |
| WorkingCopyOwner owner, |
| CompletionParser parser) { |
| this.isExtended = true; |
| this.extendedContext = |
| new InternalExtendedCompletionContext( |
| this, |
| typeRoot, |
| compilationUnitDeclaration, |
| lookupEnvironment, |
| scope, |
| astNode, |
| astNodeParent, |
| owner, |
| parser); |
| } |
| |
| protected void setJavadoc(int javadoc) { |
| this.javadoc = javadoc; |
| } |
| |
| protected void setOffset(int offset) { |
| this.offset = offset; |
| } |
| |
| protected void setToken(char[] token) { |
| this.token = token; |
| } |
| |
| protected void setTokenKind(int tokenKind) { |
| this.tokenKind = tokenKind; |
| } |
| |
| protected void setTokenLocation(int tokenLocation) { |
| this.tokenLocation = tokenLocation; |
| } |
| |
| protected void setTokenRange(int start, int end) { |
| this.setTokenRange(start, end, -1); |
| } |
| |
| protected void setTokenRange(int start, int end, int endOfEmptyToken) { |
| this.tokenStart = start; |
| this.tokenEnd = endOfEmptyToken > end ? endOfEmptyToken : end; |
| |
| // Work around for bug 132558 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=132558). |
| // completionLocation can be -1 if the completion occur at the start of a file or |
| // the start of a code snippet but this API isn't design to support negative position. |
| if(this.tokenEnd == -1) { |
| this.tokenEnd = 0; |
| } |
| } |
| |
| @Override |
| 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(); |
| } |
| |
| @Override |
| public char[][] getExpectedTypesKeys() { |
| return this.expectedTypesKeys; |
| } |
| |
| @Override |
| public char[][] getExpectedTypesSignatures() { |
| return this.expectedTypesSignatures; |
| } |
| |
| @Override |
| public int getOffset() { |
| return this.offset; |
| } |
| |
| @Override |
| public char[] getToken() { |
| return this.token; |
| } |
| |
| // TODO (david) https://bugs.eclipse.org/bugs/show_bug.cgi?id=132558 |
| @Override |
| public int getTokenEnd() { |
| return this.tokenEnd; |
| } |
| |
| @Override |
| public int getTokenKind() { |
| return this.tokenKind; |
| } |
| |
| @Override |
| public int getTokenLocation() { |
| return this.tokenLocation; |
| } |
| |
| @Override |
| public int getTokenStart() { |
| return this.tokenStart; |
| } |
| |
| @Override |
| 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); |
| } |
| |
| @Override |
| public boolean isExtended() { |
| return this.isExtended; |
| } |
| |
| @Override |
| public boolean isInJavadoc() { |
| return this.javadoc != 0; |
| } |
| |
| @Override |
| public boolean isInJavadocFormalReference() { |
| return (this.javadoc & CompletionOnJavadoc.FORMAL_REFERENCE) != 0; |
| } |
| |
| @Override |
| public boolean isInJavadocText() { |
| return (this.javadoc & CompletionOnJavadoc.TEXT) != 0; |
| } |
| |
| /** |
| * Return the completion node associated with the current completion. |
| * |
| * @return completion AST node, or null if the extendedContext is null. |
| * @exception UnsupportedOperationException if the context is not an extended context |
| * |
| * @see #isExtended() |
| */ |
| public ASTNode getCompletionNode() { |
| if (!this.isExtended) throw new UnsupportedOperationException("Operation only supported in extended context"); //$NON-NLS-1$ |
| |
| if (this.extendedContext == null) return null; |
| |
| return this.extendedContext.getCompletionNode(); |
| } |
| |
| /** |
| * Return the parent AST node of the completion node associated with the current completion. |
| * |
| * @return completion parent AST node, or null if the extendedContext is null. |
| * @exception UnsupportedOperationException if the context is not an extended context |
| * |
| * @see #isExtended() |
| */ |
| public ASTNode getCompletionNodeParent() { |
| if (!this.isExtended) throw new UnsupportedOperationException("Operation only supported in extended context"); //$NON-NLS-1$ |
| |
| if (this.extendedContext == null) return null; |
| |
| return this.extendedContext.getCompletionNodeParent(); |
| } |
| |
| /** |
| * Return the bindings of all visible local variables in the current completion context. |
| * |
| * @return bindings of all visible local variables, or null if the extendedContext is null. Returned bindings are instances of |
| * {@link LocalVariableBinding} |
| * @exception UnsupportedOperationException if the context is not an extended context |
| * |
| * @see #isExtended() |
| */ |
| public ObjectVector getVisibleLocalVariables() { |
| if (!this.isExtended) throw new UnsupportedOperationException("Operation only supported in extended context"); //$NON-NLS-1$ |
| |
| if (this.extendedContext == null) return null; |
| |
| return this.extendedContext.getVisibleLocalVariables(); |
| } |
| |
| /** |
| * Return the bindings of all visible fields in the current completion context. |
| * |
| * @return bindings of all visible fields, or null if the extendedContext is null. Returned bindings are instances of |
| * {@link FieldBinding} |
| * @exception UnsupportedOperationException if the context is not an extended context |
| * |
| * @see #isExtended() |
| */ |
| public ObjectVector getVisibleFields() { |
| if (!this.isExtended) throw new UnsupportedOperationException("Operation only supported in extended context"); //$NON-NLS-1$ |
| |
| if (this.extendedContext == null) return null; |
| |
| return this.extendedContext.getVisibleFields(); |
| } |
| |
| /** |
| * Return the bindings of all visible methods in the current completion context. |
| * |
| * @return bindings of all visible methods, or null if the extendedContext is null. Returned bindings are instances of |
| * {@link MethodBinding} |
| * @exception UnsupportedOperationException if the context is not an extended context |
| * |
| * @see #isExtended() |
| */ |
| public ObjectVector getVisibleMethods() { |
| if (!this.isExtended) throw new UnsupportedOperationException("Operation only supported in extended context"); //$NON-NLS-1$ |
| |
| if (this.extendedContext == null) return null; |
| |
| return this.extendedContext.getVisibleMethods(); |
| } |
| } |