package com.redhat.ceylon.eclipse.code.correct;
import java.util.Collection;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.ltk.core.refactoring.TextChange;
import org.eclipse.ltk.core.refactoring.TextFileChange;
import org.eclipse.text.edits.InsertEdit;
import com.redhat.ceylon.model.typechecker.model.Interface;
import com.redhat.ceylon.model.typechecker.model.FunctionOrValue;
import com.redhat.ceylon.model.typechecker.model.Type;
import com.redhat.ceylon.model.typechecker.model.TypedDeclaration;
import com.redhat.ceylon.compiler.typechecker.tree.Node;
import com.redhat.ceylon.compiler.typechecker.tree.Tree;
import com.redhat.ceylon.compiler.typechecker.tree.Tree.CompilationUnit;
public class AddSpreadToVariadicParameterProposal extends CorrectionProposal {
@Deprecated
public static void addSpreadToSequenceParameterProposal(CompilationUnit cu,
Node node, Collection<ICompletionProposal> proposals, IFile file) {
if( !(node instanceof Tree.Term) ) {
return;
}
Tree.Term term = (Tree.Term) node;
Type type = term.getTypeModel();
Interface id = type.getDeclaration().getUnit().getIterableDeclaration();
if( type.getSupertype(id) == null ) {
return;
}
FindInvocationVisitor fiv = new FindInvocationVisitor(term);
fiv.visit(cu);
if (fiv.parameter == null ||
!(fiv.parameter.isParameter()) ||
!((FunctionOrValue) fiv.parameter).getInitializerParameter().isSequenced()) {
return;
}
TextFileChange change =
new TextFileChange("Spread iterable argument of variadic parameter", file);
change.setEdit(new InsertEdit(term.getStartIndex(), "*"));
AddSpreadToVariadicParameterProposal p =
new AddSpreadToVariadicParameterProposal(fiv.parameter,
term.getEndIndex() + 3, change);
if ( !proposals.contains(p)) {
proposals.add(p);
}
}
private final TypedDeclaration parameter;
@Deprecated
private AddSpreadToVariadicParameterProposal(TypedDeclaration parameter,
int offset, TextFileChange change) {
super("Spread iterable argument of variadic parameter", change,
new Region(offset, 0));
this.parameter = parameter;
}
AddSpreadToVariadicParameterProposal(TypedDeclaration parameter,
String desc, int offset, TextChange change) {
super(desc, change, new Region(offset, 0));
this.parameter = parameter;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof AddSpreadToVariadicParameterProposal) {
AddSpreadToVariadicParameterProposal that =
(AddSpreadToVariadicParameterProposal) obj;
return that.parameter.equals(parameter);
}
return false;
}
@Override
public int hashCode() {
return parameter.hashCode();
}
}