package com.redhat.ceylon.eclipse.code.correct; import static com.redhat.ceylon.eclipse.code.correct.LinkedModeCompletionProposal.getNameProposals; import static com.redhat.ceylon.eclipse.code.correct.LinkedModeCompletionProposal.getSupertypeProposals; import java.util.Collection; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.link.ProposalPosition; import org.eclipse.jface.viewers.StyledString; import org.eclipse.ltk.core.refactoring.DocumentChange; import org.eclipse.text.edits.InsertEdit; import org.eclipse.text.edits.MultiTextEdit; import com.redhat.ceylon.compiler.typechecker.tree.Node; import com.redhat.ceylon.compiler.typechecker.tree.Tree; import com.redhat.ceylon.eclipse.code.editor.CeylonEditor; import com.redhat.ceylon.eclipse.util.LinkedMode; import com.redhat.ceylon.model.typechecker.model.Unit; class AssignToLocalProposal extends LocalProposal { protected DocumentChange createChange(IDocument document, Node expanse, int endIndex) { DocumentChange change = new DocumentChange("Assign to Local", document); change.setEdit(new MultiTextEdit()); change.addEdit(new InsertEdit(offset, "value " + initialName + " = ")); String terminal = expanse.getEndToken().getText(); if (!terminal.equals(";")) { change.addEdit(new InsertEdit(endIndex, ";")); exitPos = endIndex+1; } else { exitPos = endIndex; } return change; } public AssignToLocalProposal(CeylonEditor ceylonEditor, Tree.CompilationUnit cu, Node node, int currentOffset) { super(ceylonEditor, cu, node, currentOffset); } protected void addLinkedPositions(IDocument document, Unit unit) throws BadLocationException { LinkedModeImporter importer = new LinkedModeImporter(document, editor); linkedModeModel.addLinkingListener(importer); ProposalPosition typePosition = new ProposalPosition(document, offset, 5, 1, getSupertypeProposals(offset, unit, type, true, "value", importer)); ProposalPosition namePosition = new ProposalPosition(document, offset+6, initialName.length(), 0, getNameProposals(offset, 1, nameProposals)); LinkedMode.addLinkedPosition(linkedModeModel, typePosition); LinkedMode.addLinkedPosition(linkedModeModel, namePosition); } @Override public String getDisplayString() { return "Assign expression to new local"; } // @Override // public Point getSelection(IDocument document) { // return new Point(exitPos, 0); // } @Override public StyledString getStyledDisplayString() { String hint = CorrectionUtil.shortcut( "com.redhat.ceylon.eclipse.ui.action.assignToLocal"); return new StyledString(getDisplayString()) .append(hint, StyledString.QUALIFIER_STYLER); } static void addAssignToLocalProposal(CeylonEditor ceylonEditor, Tree.CompilationUnit cu, Collection<ICompletionProposal> proposals, Node node, int currentOffset) { AssignToLocalProposal prop = new AssignToLocalProposal(ceylonEditor, cu, node, currentOffset); if (prop.isEnabled()) { proposals.add(prop); } } }