package com.redhat.ceylon.eclipse.code.correct;
import java.util.Collection;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
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.MultiTextEdit;
import org.eclipse.text.edits.ReplaceEdit;
import com.redhat.ceylon.compiler.typechecker.tree.Node;
import com.redhat.ceylon.compiler.typechecker.tree.Tree;
@Deprecated
class ConvertToSpecifierProposal extends CorrectionProposal {
ConvertToSpecifierProposal(String desc, int offset,
TextChange change) {
super(desc, change, new Region(offset, 0));
}
static void addConvertToSpecifierProposal(IDocument doc,
Collection<ICompletionProposal> proposals,
IFile file, Tree.Block block) {
addConvertToSpecifierProposal(doc, proposals, file,
block, false);
}
static void addConvertToSpecifierProposal(IDocument doc,
Collection<ICompletionProposal> proposals,
IFile file, Tree.Block block,
boolean anonymousFunction) {
if (block.getStatements().size()==1) {
Tree.Statement s = block.getStatements().get(0);
Node end = null;
Node start = null;
if (s instanceof Tree.Return) {
Tree.Return ret = (Tree.Return) s;
start = ret.getExpression();
end = start;
}
else if (s instanceof Tree.ExpressionStatement) {
Tree.ExpressionStatement es =
(Tree.ExpressionStatement) s;
start = es.getExpression();
end = start;
}
else if (s instanceof Tree.SpecifierStatement) {
Tree.SpecifierStatement ss =
(Tree.SpecifierStatement) s;
start = ss.getBaseMemberExpression();
end = ss.getSpecifierExpression();
}
if (end!=null) {
TextChange change =
new TextFileChange(
"Convert to Specifier",
file);
change.setEdit(new MultiTextEdit());
Integer offset = block.getStartIndex();
String es;
try {
es = doc.get(start.getStartIndex(),
end.getEndIndex()-start.getStartIndex());
}
catch (BadLocationException ex) {
ex.printStackTrace();
return;
}
change.addEdit(new ReplaceEdit(offset,
block.getEndIndex()-offset,
"=> " + es + (anonymousFunction?"":";")));
String desc =
anonymousFunction ?
"Convert anonymous function body to =>" :
"Convert block to =>";
proposals.add(new ConvertToSpecifierProposal(
desc, offset+2 , change));
}
}
}
}