package com.redhat.ceylon.eclipse.code.correct; import static com.redhat.ceylon.eclipse.java2ceylon.Java2CeylonProxies.utilJ2C; 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.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.parser.CeylonLexer; import com.redhat.ceylon.compiler.typechecker.tree.Tree; class SplitIfStatementProposal { static void addSplitIfStatementProposal( Collection<ICompletionProposal> proposals, IDocument doc, IFile file, Tree.Statement statement) { if (statement instanceof Tree.IfStatement) { Tree.IfStatement is = (Tree.IfStatement) statement; Tree.ElseClause elseClause = is.getElseClause(); if (elseClause==null) { Tree.ConditionList cl = is.getIfClause().getConditionList(); if (cl!=null) { List<Tree.Condition> conditions = cl.getConditions(); int size = conditions.size(); if (size>=2) { Tree.Condition c1 = conditions.get(size-2); Tree.Condition c2 = conditions.get(size-1); if (c1!=null && c2!=null) { TextChange change = new TextFileChange( "Split If Statement", file); change.setEdit(new MultiTextEdit()); String ws; String indent; int startLine = is.getToken().getLine(); int endLine = is.getEndToken().getLine(); if (startLine==endLine) { ws = " "; indent = ""; } else { ws = utilJ2C().indents().getDefaultLineDelimiter(doc) + utilJ2C().indents().getIndent(is, doc); indent = utilJ2C().indents().getDefaultIndent(); } int start = c1.getEndIndex(); int stop = c2.getStartIndex(); change.addEdit(new ReplaceEdit(start, stop-start, ") {" + ws + indent + "if (")); int end = is.getEndIndex(); change.addEdit(new InsertEdit(end, ws + "}")); incrementIndent(doc, is, cl, change, indent); proposals.add(new CorrectionProposal( "Split 'if' statement at condition", change, null)); } } } } else { Tree.Block block = elseClause.getBlock(); if (block!=null && block.getToken().getType() == CeylonLexer.IF_CLAUSE) { List<Tree.Statement> statements = block.getStatements(); if (statements.size()==1) { Tree.Statement st = statements.get(0); if (st instanceof Tree.IfStatement) { Tree.IfStatement inner = (Tree.IfStatement) st; Tree.ConditionList icl = inner.getIfClause() .getConditionList(); TextChange change = new TextFileChange( "Split If Statement", file); change.setEdit(new MultiTextEdit()); String ws = utilJ2C().indents().getDefaultLineDelimiter(doc) + utilJ2C().indents().getIndent(is, doc); String indent = utilJ2C().indents().getDefaultIndent(); int start = block.getStartIndex(); change.addEdit(new InsertEdit(start, "{" + ws + indent)); int end = is.getEndIndex(); change.addEdit(new InsertEdit(end, ws + "}")); incrementIndent(doc, is, icl, change, indent); proposals.add(new CorrectionProposal( "Split 'if' statement at 'else'", change, null)); } } } } } } private static void incrementIndent(IDocument doc, Tree.IfStatement is, Tree.ConditionList cl, TextChange change, String indent) { if (!indent.isEmpty()) { try { for (int line = doc.getLineOfOffset(cl.getStopIndex())+1; line <= doc.getLineOfOffset(is.getStopIndex()); line++) { change.addEdit(new InsertEdit(doc.getLineOffset(line), indent)); } } catch (Exception e) { e.printStackTrace(); } } } }