blob: f5b8e8928caa3ca4d297b0e21716f8997548c455 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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.ui.refactoring.contentassist;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jdt.core.CompletionProposal;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
import org.eclipse.jdt.internal.corext.util.TypeFilter;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
public class JavaTypeCompletionProcessor extends CUPositionCompletionProcessor {
public static final String DUMMY_CLASS_NAME= "$$__$$"; //$NON-NLS-1$
/**
* The CU name to be used if no parent ICompilationUnit is available.
* The main type of this class will be filtered out from the proposals list.
*/
public static final String DUMMY_CU_NAME= DUMMY_CLASS_NAME + JavaModelUtil.DEFAULT_CU_SUFFIX;
/**
* Creates a <code>JavaTypeCompletionProcessor</code>.
* The completion context must be set via {@link #setPackageFragment(IPackageFragment)}.
*
* @param enableBaseTypes complete java base types iff <code>true</code>
* @param enableVoid complete <code>void</code> base type iff <code>true</code>
*/
public JavaTypeCompletionProcessor(boolean enableBaseTypes, boolean enableVoid) {
this(enableBaseTypes, enableVoid, false);
}
/**
* Creates a <code>JavaTypeCompletionProcessor</code>.
* The completion context must be set via {@link #setPackageFragment(IPackageFragment)}.
*
* @param enableBaseTypes complete java base types iff <code>true</code>
* @param enableVoid complete <code>void</code> base type iff <code>true</code>
* @param fullyQualify always complete to fully qualifies type iff <code>true</code>
*/
public JavaTypeCompletionProcessor(boolean enableBaseTypes, boolean enableVoid, boolean fullyQualify) {
super(new TypeCompletionRequestor(enableBaseTypes, enableVoid, fullyQualify));
}
public char[] getCompletionProposalAutoActivationCharacters() {
// disable auto activation in dialog fields, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=89476
return null;
}
/**
* @param packageFragment the new completion context
*/
public void setPackageFragment(IPackageFragment packageFragment) {
//TODO: Some callers have a better completion context and should include imports
// and nested classes of their declaring CU in WC's source.
if (packageFragment == null) {
setCompletionContext(null, null, null);
} else {
String before= "public class " + DUMMY_CLASS_NAME + " { "; //$NON-NLS-1$//$NON-NLS-2$
String after= " }"; //$NON-NLS-1$
setCompletionContext(packageFragment.getCompilationUnit(DUMMY_CU_NAME), before, after);
}
}
public void setExtendsCompletionContext(IJavaElement javaElement) {
if (javaElement instanceof IPackageFragment) {
IPackageFragment packageFragment= (IPackageFragment) javaElement;
ICompilationUnit cu= packageFragment.getCompilationUnit(DUMMY_CU_NAME);
setCompletionContext(cu, "public class " + DUMMY_CLASS_NAME + " extends ", " {}"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
} else if (javaElement instanceof IType) {
// pattern: public class OuterType { public class Type extends /*caret*/ {} }
IType type= (IType) javaElement;
String before= "public class " + type.getElementName() + " extends "; //$NON-NLS-1$ //$NON-NLS-2$
String after= " {}"; //$NON-NLS-1$
IJavaElement parent= type.getParent();
while (parent instanceof IType) {
type= (IType) parent;
before+= "public class " + type.getElementName() + " {"; //$NON-NLS-1$ //$NON-NLS-2$
after+= "}"; //$NON-NLS-1$
parent= type.getParent();
}
ICompilationUnit cu= type.getCompilationUnit();
setCompletionContext(cu, before, after);
} else {
setCompletionContext(null, null, null);
}
}
// public void setImplementsCompletionContext(IPackageFragment packageFragment) {
// ICompilationUnit cu= packageFragment.getCompilationUnit(DUMMY_CU_NAME);
// setCompletionContext(cu, "public class " + DUMMY_CLASS_NAME + " implements ", " {}"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
// }
protected static class TypeCompletionRequestor extends CUPositionCompletionRequestor {
private static final String VOID= "void"; //$NON-NLS-1$
private static final List BASE_TYPES= Arrays.asList(
new String[] {"boolean", "byte", "char", "double", "float", "int", "long", "short"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
private boolean fEnableBaseTypes;
private boolean fEnableVoid;
private final boolean fFullyQualify;
public TypeCompletionRequestor(boolean enableBaseTypes, boolean enableVoid, boolean fullyQualify) {
fFullyQualify= fullyQualify;
fEnableBaseTypes= enableBaseTypes;
fEnableVoid= enableVoid;
setIgnored(CompletionProposal.ANONYMOUS_CLASS_DECLARATION, true);
setIgnored(CompletionProposal.FIELD_REF, true);
setIgnored(CompletionProposal.LABEL_REF, true);
setIgnored(CompletionProposal.LOCAL_VARIABLE_REF, true);
setIgnored(CompletionProposal.METHOD_DECLARATION, true);
setIgnored(CompletionProposal.METHOD_REF, true);
setIgnored(CompletionProposal.VARIABLE_DECLARATION, true);
setIgnored(CompletionProposal.POTENTIAL_METHOD_DECLARATION, true);
setIgnored(CompletionProposal.METHOD_NAME_REFERENCE, true);
}
public void accept(CompletionProposal proposal) {
switch (proposal.getKind()) {
case CompletionProposal.PACKAGE_REF :
char[] packageName= proposal.getDeclarationSignature();
if (TypeFilter.isFiltered(packageName))
return;
addAdjustedCompletion(
new String(packageName),
new String(proposal.getCompletion()),
proposal.getReplaceStart(),
proposal.getReplaceEnd(),
proposal.getRelevance(),
JavaPluginImages.DESC_OBJS_PACKAGE);
return;
case CompletionProposal.TYPE_REF :
char[] fullName= Signature.toCharArray(proposal.getSignature());
if (TypeFilter.isFiltered(fullName))
return;
StringBuffer buf= new StringBuffer();
buf.append(Signature.getSimpleName(fullName));
if (buf.length() == 0)
return; // this is the dummy class, whose $ have been converted to dots
char[] typeQualifier= Signature.getQualifier(fullName);
if (typeQualifier.length > 0) {
buf.append(" - "); //$NON-NLS-1$
buf.append(typeQualifier);
}
String name= buf.toString();
addAdjustedTypeCompletion(
name,
new String(proposal.getCompletion()),
proposal.getReplaceStart(),
proposal.getReplaceEnd(),
proposal.getRelevance(),
JavaElementImageProvider.getTypeImageDescriptor(false, false, proposal.getFlags(), false),
fFullyQualify ? new String(fullName) : null);
return;
case CompletionProposal.KEYWORD:
if (! fEnableBaseTypes)
return;
String keyword= new String(proposal.getName());
if ( (fEnableVoid && VOID.equals(keyword)) || (fEnableBaseTypes && BASE_TYPES.contains(keyword)) )
addAdjustedCompletion(
keyword,
new String(proposal.getCompletion()),
proposal.getReplaceStart(),
proposal.getReplaceEnd(),
proposal.getRelevance(),
null);
return;
default :
return;
}
}
}
}