blob: 353884d2d753b5d4d556cc2cbf6f6176c1a76450 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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.text.correction;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.Name;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility;
import org.eclipse.jdt.internal.corext.dom.ASTNodeFactory;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
/**
*
*/
public class NewDefiningMethodProposal extends AbstractMethodCompletionProposal {
private static final String KEY_NAME= "name"; //$NON-NLS-1$
private static final String KEY_TYPE= "type"; //$NON-NLS-1$
private final IMethodBinding fMethod;
private final String[] fParamNames;
public NewDefiningMethodProposal(String label, ICompilationUnit targetCU, ASTNode invocationNode, ITypeBinding binding, IMethodBinding method, String[] paramNames, int relevance) {
super(label,targetCU,invocationNode,binding,relevance,null);
fMethod= method;
fParamNames= paramNames;
ImageDescriptor desc= JavaElementImageProvider.getMethodImageDescriptor(binding.isInterface() || binding.isAnnotation(), method.getModifiers());
setImage(JavaPlugin.getImageDescriptorRegistry().get(desc));
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.text.correction.AbstractMethodCompletionProposal#isConstructor()
*/
protected boolean isConstructor() {
return fMethod.isConstructor();
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.text.correction.AbstractMethodCompletionProposal#addNewParameters(org.eclipse.jdt.core.dom.rewrite.ASTRewrite, java.util.List, java.util.List)
*/
protected void addNewParameters(ASTRewrite rewrite, List takenNames, List params) throws CoreException {
AST ast= rewrite.getAST();
ImportRewrite importRewrite= getImportRewrite();
ITypeBinding[] bindings= fMethod.getParameterTypes();
IJavaProject project= getCompilationUnit().getJavaProject();
String[] paramNames= StubUtility.suggestArgumentNames(project, fParamNames);
for (int i= 0; i < bindings.length; i++) {
ITypeBinding curr= bindings[i];
SingleVariableDeclaration newParam= ast.newSingleVariableDeclaration();
newParam.setType(importRewrite.addImport(curr, ast));
newParam.setName(ast.newSimpleName(paramNames[i]));
params.add(newParam);
addLinkedPosition(rewrite.track(newParam.getType()), false, "arg_type_" + i); //$NON-NLS-1$
addLinkedPosition(rewrite.track(newParam.getName()), false, "arg_name_" + i); //$NON-NLS-1$
}
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.text.correction.AbstractMethodCompletionProposal#getNewName()
*/
protected SimpleName getNewName(ASTRewrite rewrite) {
AST ast= rewrite.getAST();
SimpleName nameNode= ast.newSimpleName(fMethod.getName());
addLinkedPosition(rewrite.track(nameNode), false, KEY_NAME);
return nameNode;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.text.correction.AbstractMethodCompletionProposal#evaluateModifiers(org.eclipse.jdt.core.dom.ASTNode)
*/
protected int evaluateModifiers(ASTNode targetTypeDecl) {
if (getSenderBinding().isInterface()) {
return 0;
} else {
int modifiers= fMethod.getModifiers();
if (Modifier.isPrivate(modifiers)) {
modifiers |= Modifier.PROTECTED;
}
return modifiers & (Modifier.PUBLIC | Modifier.PROTECTED | Modifier.ABSTRACT | Modifier.STRICTFP);
}
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.text.correction.AbstractMethodCompletionProposal#getNewMethodType(org.eclipse.jdt.core.dom.rewrite.ASTRewrite)
*/
protected Type getNewMethodType(ASTRewrite rewrite) throws CoreException {
Type newTypeNode= getImportRewrite().addImport(fMethod.getReturnType(), rewrite.getAST());
addLinkedPosition(rewrite.track(newTypeNode), false, KEY_TYPE);
return newTypeNode;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.text.correction.AbstractMethodCompletionProposal#addNewExceptions(org.eclipse.jdt.core.dom.AST, java.util.List)
*/
protected void addNewExceptions(ASTRewrite rewrite, List exceptions) throws CoreException {
AST ast= rewrite.getAST();
ImportRewrite importRewrite= getImportRewrite();
ITypeBinding[] bindings= fMethod.getExceptionTypes();
for (int i= 0; i < bindings.length; i++) {
String typeName= importRewrite.addImport(bindings[i]);
Name newNode= ASTNodeFactory.newName(ast, typeName);
exceptions.add(newNode);
addLinkedPosition(rewrite.track(newNode), false, "exc_type_" + i); //$NON-NLS-1$
}
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.text.correction.AbstractMethodCompletionProposal#addNewTypeParameters(org.eclipse.jdt.core.dom.rewrite.ASTRewrite, java.util.List, java.util.List)
*/
protected void addNewTypeParameters(ASTRewrite rewrite, List takenNames, List params) throws CoreException {
}
}