package com.redhat.ceylon.eclipse.code.correct;
import static com.redhat.ceylon.eclipse.java2ceylon.Java2CeylonProxies.utilJ2C;
import java.util.Collection;
import org.antlr.runtime.CommonToken;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.text.link.LinkedPosition;
import org.eclipse.jface.text.link.LinkedPositionGroup;
import org.eclipse.ltk.core.refactoring.DocumentChange;
import org.eclipse.ltk.core.refactoring.TextChange;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
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.Tree;
import com.redhat.ceylon.compiler.typechecker.tree.Tree.ObjectDefinition;
import com.redhat.ceylon.eclipse.code.editor.CeylonEditor;
import com.redhat.ceylon.eclipse.code.refactor.AbstractLinkedMode;
import com.redhat.ceylon.eclipse.ui.CeylonResources;
import com.redhat.ceylon.eclipse.util.EditorUtil;
import com.redhat.ceylon.ide.common.util.escaping_;
import com.redhat.ceylon.model.typechecker.model.Value;
@Deprecated
class ConvertToClassProposal extends AbstractLinkedMode implements ICompletionProposal {
private final Tree.ObjectDefinition node;
public ConvertToClassProposal(Tree.ObjectDefinition node,
CeylonEditor editor) {
super(editor);
this.node = node;
}
@Override
public Point getSelection(IDocument doc) {
return null;
}
@Override
public Image getImage() {
return node.getDeclarationModel().isShared() ?
CeylonResources.CLASS :
CeylonResources.LOCAL_CLASS;
}
@Override
public String getDisplayString() {
return "Convert " + node.getDeclarationModel().getName() + " to class";
}
@Override
public IContextInformation getContextInformation() {
return null;
}
@Override
public String getAdditionalProposalInfo() {
return null;
}
@Override
public void apply(IDocument doc) {
Value declaration = node.getDeclarationModel();
String name = declaration.getName();
String initialName = escaping_.get_().toInitialUppercase(name);
TextChange change = new DocumentChange("Convert to Class", doc);
change.setEdit(new MultiTextEdit());
Tree.ObjectDefinition od = (Tree.ObjectDefinition) node;
int dstart = ((CommonToken) od.getMainToken()).getStartIndex();
change.addEdit(new ReplaceEdit(dstart, 6, "class"));
int start = od.getIdentifier().getStartIndex();
int length = od.getIdentifier().getDistance();
change.addEdit(new ReplaceEdit(start, length, initialName + "()"));
int offset = od.getEndIndex();
//TODO: handle actual object declarations
String mods = declaration.isShared() ? "shared " : "";
String ws = utilJ2C().indents().getDefaultLineDelimiter(doc) + utilJ2C().indents().getIndent(od, doc);
String impl = " = " + initialName + "();";
String dec = ws + mods + initialName + " " + name;
change.addEdit(new InsertEdit(offset, dec + impl));
try {
EditorUtil.performChange(change);
LinkedPositionGroup group = new LinkedPositionGroup();
group.addPosition(new LinkedPosition(doc, start-1, length, 0));
group.addPosition(new LinkedPosition(doc, offset+ws.length()+mods.length()+1, length, 1));
group.addPosition(new LinkedPosition(doc, offset+dec.length()+4, length, 2));
linkedModeModel.addGroup(group);
enterLinkedMode(doc, -1, start-1);
openPopup();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void addConvertToClassProposal(Collection<ICompletionProposal> proposals,
Tree.Declaration declaration, CeylonEditor editor) {
if (declaration instanceof Tree.ObjectDefinition) {
ConvertToClassProposal prop =
new ConvertToClassProposal((ObjectDefinition) declaration, editor);
proposals.add(prop);
}
}
@Override
protected String getHintTemplate() {
return "Enter name for new class {0}";
}
}