blob: 99427f56272fe0cd32f05e18880c0eb2440ab14d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.codeassist;
import java.util.Map;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnAnnotationOfType;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnArgumentName;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnFieldName;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnFieldType;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnImportReference;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnKeyword;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnKeyword2;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnMethodName;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnMethodReturnType;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnMethodTypeParameter;
import org.eclipse.jdt.internal.codeassist.complete.CompletionOnPackageReference;
import org.eclipse.jdt.internal.compiler.SourceElementNotifier;
import org.eclipse.jdt.internal.compiler.ast.ASTNode;
import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
import org.eclipse.jdt.internal.compiler.ast.Argument;
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
import org.eclipse.jdt.internal.compiler.ast.ImportReference;
import org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression;
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
import org.eclipse.jdt.internal.compiler.ast.TypeParameter;
import org.eclipse.jdt.internal.compiler.ast.TypeReference;
import org.eclipse.jdt.internal.compiler.util.HashtableOfObjectToInt;
public class CompletionElementNotifier extends SourceElementNotifier {
private ASTNode assistNode;
public CompletionElementNotifier(
CompletionUnitStructureRequestor requestor,
boolean reportLocalDeclarations,
ASTNode assistNode) {
super(requestor, reportLocalDeclarations);
this.assistNode = assistNode;
}
protected char[][][] getArguments(Argument[] arguments) {
int argumentLength = arguments.length;
char[][] argumentTypes = new char[argumentLength][];
char[][] argumentNames = new char[argumentLength][];
int argumentCount = 0;
next : for (int i = 0; i < argumentLength; i++) {
Argument argument = arguments[i];
if (argument instanceof CompletionOnArgumentName && argument.name.length == 0) continue next;
argumentTypes[argumentCount] = CharOperation.concatWith(argument.type.getParameterizedTypeName(), '.');
argumentNames[argumentCount++] = argument.name;
}
if (argumentCount < argumentLength) {
System.arraycopy(argumentTypes, 0, argumentTypes = new char[argumentCount][], 0, argumentCount);
System.arraycopy(argumentNames, 0, argumentNames = new char[argumentCount][], 0, argumentCount);
}
return new char[][][] {argumentTypes, argumentNames};
}
protected char[][] getInterfaceNames(TypeDeclaration typeDeclaration) {
char[][] interfaceNames = null;
int superInterfacesLength = 0;
TypeReference[] superInterfaces = typeDeclaration.superInterfaces;
if (superInterfaces != null) {
superInterfacesLength = superInterfaces.length;
interfaceNames = new char[superInterfacesLength][];
} else {
if ((typeDeclaration.bits & ASTNode.IsAnonymousType) != 0) {
// see PR 3442
QualifiedAllocationExpression alloc = typeDeclaration.allocation;
if (alloc != null && alloc.type != null) {
superInterfaces = new TypeReference[] { alloc.type};
superInterfacesLength = 1;
interfaceNames = new char[1][];
}
}
}
if (superInterfaces != null) {
int superInterfaceCount = 0;
next: for (int i = 0; i < superInterfacesLength; i++) {
TypeReference superInterface = superInterfaces[i];
if (superInterface instanceof CompletionOnKeyword) continue next;
if (CompletionUnitStructureRequestor.hasEmptyName(superInterface, this.assistNode)) continue next;
interfaceNames[superInterfaceCount++] = CharOperation.concatWith(superInterface.getParameterizedTypeName(), '.');
}
if (superInterfaceCount == 0) return null;
if (superInterfaceCount < superInterfacesLength) {
System.arraycopy(interfaceNames, 0, interfaceNames = new char[superInterfaceCount][], 0, superInterfaceCount);
}
}
return interfaceNames;
}
protected char[] getSuperclassName(TypeDeclaration typeDeclaration) {
TypeReference superclass = typeDeclaration.superclass;
if (superclass instanceof CompletionOnKeyword) return null;
if (CompletionUnitStructureRequestor.hasEmptyName(superclass, this.assistNode)) return null;
return superclass != null ? CharOperation.concatWith(superclass.getParameterizedTypeName(), '.') : null;
}
protected char[][] getThrownExceptions(AbstractMethodDeclaration methodDeclaration) {
char[][] thrownExceptionTypes = null;
TypeReference[] thrownExceptions = methodDeclaration.thrownExceptions;
if (thrownExceptions != null) {
int thrownExceptionLength = thrownExceptions.length;
int thrownExceptionCount = 0;
thrownExceptionTypes = new char[thrownExceptionLength][];
next : for (int i = 0; i < thrownExceptionLength; i++) {
TypeReference thrownException = thrownExceptions[i];
if (thrownException instanceof CompletionOnKeyword) continue next;
if (CompletionUnitStructureRequestor.hasEmptyName(thrownException, this.assistNode)) continue next;
thrownExceptionTypes[thrownExceptionCount++] =
CharOperation.concatWith(thrownException.getParameterizedTypeName(), '.');
}
if (thrownExceptionCount == 0) return null;
if (thrownExceptionCount < thrownExceptionLength) {
System.arraycopy(thrownExceptionTypes, 0, thrownExceptionTypes = new char[thrownExceptionCount][], 0, thrownExceptionCount);
}
}
return thrownExceptionTypes;
}
protected char[][] getTypeParameterBounds(TypeParameter typeParameter) {
TypeReference firstBound = typeParameter.type;
TypeReference[] otherBounds = typeParameter.bounds;
char[][] typeParameterBounds = null;
if (firstBound != null) {
if (otherBounds != null) {
int otherBoundsLength = otherBounds.length;
char[][] boundNames = new char[otherBoundsLength+1][];
int boundCount = 0;
if (!CompletionUnitStructureRequestor.hasEmptyName(firstBound, this.assistNode)) {
boundNames[boundCount++] = CharOperation.concatWith(firstBound.getParameterizedTypeName(), '.');
}
for (int j = 0; j < otherBoundsLength; j++) {
TypeReference otherBound = otherBounds[j];
if (!CompletionUnitStructureRequestor.hasEmptyName(otherBound, this.assistNode)) {
boundNames[boundCount++] =
CharOperation.concatWith(otherBound.getParameterizedTypeName(), '.');
}
}
if (boundCount == 0) {
boundNames = CharOperation.NO_CHAR_CHAR;
} else if (boundCount < otherBoundsLength + 1){
System.arraycopy(boundNames, 0, boundNames = new char[boundCount][], 0, boundCount);
}
typeParameterBounds = boundNames;
} else {
if (!CompletionUnitStructureRequestor.hasEmptyName(firstBound, this.assistNode)) {
typeParameterBounds = new char[][] { CharOperation.concatWith(firstBound.getParameterizedTypeName(), '.')};
} else {
typeParameterBounds = CharOperation.NO_CHAR_CHAR;
}
}
} else {
typeParameterBounds = CharOperation.NO_CHAR_CHAR;
}
return typeParameterBounds;
}
protected void notifySourceElementRequestor(AbstractMethodDeclaration methodDeclaration, TypeDeclaration declaringType, ImportReference currentPackage) {
if (methodDeclaration instanceof CompletionOnMethodReturnType) return;
if (methodDeclaration instanceof CompletionOnMethodTypeParameter) return;
if (methodDeclaration instanceof CompletionOnMethodName) return;
super.notifySourceElementRequestor(methodDeclaration, declaringType, currentPackage);
}
public void notifySourceElementRequestor(CompilationUnitDeclaration parsedUnit, int sourceStart, int sourceEnd, boolean reportReference, HashtableOfObjectToInt sourceEndsMap, Map nodesToCategoriesMap) {
super.notifySourceElementRequestor(parsedUnit, sourceStart, sourceEnd, reportReference, sourceEndsMap, nodesToCategoriesMap);
}
protected void notifySourceElementRequestor(FieldDeclaration fieldDeclaration, TypeDeclaration declaringType) {
if (fieldDeclaration instanceof CompletionOnFieldType) return;
if (fieldDeclaration instanceof CompletionOnFieldName) return;
super.notifySourceElementRequestor(fieldDeclaration, declaringType);
}
protected void notifySourceElementRequestor(ImportReference importReference, boolean isPackage) {
if (importReference instanceof CompletionOnKeyword2) return;
if (importReference instanceof CompletionOnImportReference ||
importReference instanceof CompletionOnPackageReference) {
if (importReference.tokens[importReference.tokens.length - 1].length == 0) return;
}
super.notifySourceElementRequestor(importReference, isPackage);
}
protected void notifySourceElementRequestor(TypeDeclaration typeDeclaration, boolean notifyTypePresence, TypeDeclaration declaringType, ImportReference currentPackage) {
if (typeDeclaration instanceof CompletionOnAnnotationOfType) return;
super.notifySourceElementRequestor(typeDeclaration, notifyTypePresence, declaringType, currentPackage);
}
}