package com.redhat.ceylon.eclipse.code.correct;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.resources.IFile;
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.InsertEdit;
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;
import com.redhat.ceylon.model.typechecker.model.Function;
import com.redhat.ceylon.model.typechecker.model.Value;
@Deprecated
class ConvertToBlockProposal extends CorrectionProposal {
private ConvertToBlockProposal(String desc, int offset,
TextChange change) {
super(desc, change, new Region(offset, 0));
}
static void addConvertToBlockProposal(IDocument doc,
Collection<ICompletionProposal> proposals,
IFile file, Node decNode) {
TextChange change =
new TextFileChange("Convert to Block",
file);
change.setEdit(new MultiTextEdit());
int offset;
int length;
String semi;
boolean isVoid;
String addedKeyword = null;
String desc = "Convert => to block";
if (decNode instanceof Tree.MethodDeclaration) {
Tree.MethodDeclaration md =
(Tree.MethodDeclaration) decNode;
Function dm = md.getDeclarationModel();
if (dm==null || dm.isParameter()) {
return;
}
isVoid = dm.isDeclaredVoid();
List<Tree.ParameterList> pls =
md.getParameterLists();
if (pls.isEmpty()) return;
offset = pls.get(pls.size()-1).getEndIndex();
Tree.TypeConstraintList tcl =
md.getTypeConstraintList();
if (tcl!=null) {
offset = tcl.getEndIndex();
}
length =
md.getSpecifierExpression()
.getExpression()
.getStartIndex()
- offset;
semi = "";
}
else if (decNode instanceof Tree.AttributeDeclaration) {
Tree.AttributeDeclaration ad =
(Tree.AttributeDeclaration) decNode;
Value dm = ad.getDeclarationModel();
if (dm==null || dm.isParameter()) {
return;
}
isVoid = false;
offset = ad.getIdentifier().getEndIndex();
length =
ad.getSpecifierOrInitializerExpression()
.getExpression()
.getStartIndex()
- offset;
semi = "";
}
else if (decNode instanceof Tree.AttributeSetterDefinition) {
Tree.AttributeSetterDefinition asd =
(Tree.AttributeSetterDefinition) decNode;
isVoid = true;
offset = asd.getIdentifier().getEndIndex();
length =
asd.getSpecifierExpression()
.getExpression()
.getStartIndex()
- offset;
semi = "";
}
else if (decNode instanceof Tree.MethodArgument) {
Tree.MethodArgument ma =
(Tree.MethodArgument) decNode;
Function dm = ma.getDeclarationModel();
if (dm==null) {
return;
}
isVoid = dm.isDeclaredVoid();
if (ma.getType().getToken()==null) {
addedKeyword = "function ";
}
List<Tree.ParameterList> pls =
ma.getParameterLists();
if (pls.isEmpty()) {
return;
}
offset = pls.get(pls.size()-1).getEndIndex();
length =
ma.getSpecifierExpression()
.getExpression()
.getStartIndex()
- offset;
semi = "";
}
else if (decNode instanceof Tree.AttributeArgument) {
Tree.AttributeArgument aa =
(Tree.AttributeArgument) decNode;
isVoid = false;
if (aa.getType().getToken()==null) {
addedKeyword = "value ";
}
offset = aa.getIdentifier().getEndIndex();
length =
aa.getSpecifierExpression()
.getExpression()
.getStartIndex()
- offset;
semi = "";
}
else if (decNode instanceof Tree.FunctionArgument) {
Tree.FunctionArgument fun =
(Tree.FunctionArgument) decNode;
Function dm = fun.getDeclarationModel();
if (dm==null) {
return;
}
isVoid = dm.isDeclaredVoid();
List<Tree.ParameterList> pls =
fun.getParameterLists();
if (pls.isEmpty()) {
return;
}
offset = pls.get(pls.size()-1).getEndIndex();
Tree.TypeConstraintList tcl =
fun.getTypeConstraintList();
if (tcl!=null) {
offset = tcl.getEndIndex();
}
length =
fun.getExpression()
.getStartIndex()
- offset;
semi = ";";
desc = "Convert anonymous function => to block";
}
else {
return;
}
if (addedKeyword!=null) {
int loc = decNode.getStartIndex();
change.addEdit(new InsertEdit(loc, addedKeyword));
}
String text = " {" + (isVoid?"":" return") + " ";
change.addEdit(new ReplaceEdit(offset, length, text));
change.addEdit(new InsertEdit(decNode.getEndIndex(), semi + " }"));
proposals.add(new ConvertToBlockProposal(desc, offset + 3, change));
}
}