package com.redhat.ceylon.eclipse.code.complete; import static com.redhat.ceylon.eclipse.code.complete.CodeCompletions.getDescriptionFor; import static com.redhat.ceylon.eclipse.code.complete.CodeCompletions.getTextFor; import static com.redhat.ceylon.eclipse.code.hover.DocumentationHover.getDocumentationFor; import static com.redhat.ceylon.eclipse.java2ceylon.Java2CeylonProxies.utilJ2C; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.swt.graphics.Point; import com.redhat.ceylon.compiler.typechecker.tree.Node; import com.redhat.ceylon.eclipse.code.parse.CeylonParseController; import com.redhat.ceylon.eclipse.ui.CeylonResources; import com.redhat.ceylon.model.typechecker.model.Declaration; import com.redhat.ceylon.model.typechecker.model.DeclarationWithProximity; import com.redhat.ceylon.model.typechecker.model.Type; import com.redhat.ceylon.model.typechecker.model.TypeDeclaration; import com.redhat.ceylon.model.typechecker.model.TypedDeclaration; import com.redhat.ceylon.model.typechecker.model.Unit; import com.redhat.ceylon.model.typechecker.model.Value; class ControlStructureCompletionProposal extends CompletionProposal { @Deprecated static void addForProposal(int offset, String prefix, CeylonParseController cpc, List<ICompletionProposal> result, DeclarationWithProximity dwp, Declaration d) { if (d instanceof Value) { TypedDeclaration td = (TypedDeclaration) d; if (td.getType()!=null && d.getUnit().isIterableType(td.getType())) { String elemName; String name = d.getName(); if (name.length()==1) { elemName = "element"; } else if (name.endsWith("s")) { elemName = name.substring(0, name.length()-1); } else { elemName = name.substring(0, 1); } Unit unit = cpc.getLastCompilationUnit().getUnit(); result.add(new ControlStructureCompletionProposal(offset, prefix, "for (" + elemName + " in " + getDescriptionFor(d, unit) + ")", "for (" + elemName + " in " + getTextFor(d, unit) + ") {}", d, cpc)); } } } @Deprecated static void addIfExistsProposal(int offset, String prefix, CeylonParseController cpc, List<ICompletionProposal> result, DeclarationWithProximity dwp, Declaration d) { if (!dwp.isUnimported()) { if (d instanceof Value) { TypedDeclaration v = (TypedDeclaration) d; if (v.getType()!=null && d.getUnit().isOptionalType(v.getType()) && !v.isVariable()) { Unit unit = cpc.getLastCompilationUnit().getUnit(); result.add(new ControlStructureCompletionProposal(offset, prefix, "if (exists " + getDescriptionFor(d, unit) + ")", "if (exists " + getTextFor(d, unit) + ") {}", d, cpc)); } } } } @Deprecated static void addAssertExistsProposal(int offset, String prefix, CeylonParseController cpc, List<ICompletionProposal> result, DeclarationWithProximity dwp, Declaration d) { if (!dwp.isUnimported()) { if (d instanceof Value) { TypedDeclaration v = (TypedDeclaration) d; if (v.getType()!=null && d.getUnit().isOptionalType(v.getType()) && !v.isVariable()) { Unit unit = cpc.getLastCompilationUnit().getUnit(); result.add(new ControlStructureCompletionProposal(offset, prefix, "assert (exists " + getDescriptionFor(d, unit) + ")", "assert (exists " + getTextFor(d, unit) + ");", d, cpc)); } } } } @Deprecated static void addIfNonemptyProposal(int offset, String prefix, CeylonParseController cpc, List<ICompletionProposal> result, DeclarationWithProximity dwp, Declaration d) { if (!dwp.isUnimported()) { if (d instanceof Value) { TypedDeclaration v = (TypedDeclaration) d; if (v.getType()!=null && d.getUnit().isPossiblyEmptyType(v.getType()) && !v.isVariable()) { Unit unit = cpc.getLastCompilationUnit().getUnit(); result.add(new ControlStructureCompletionProposal(offset, prefix, "if (nonempty " + getDescriptionFor(d, unit) + ")", "if (nonempty " + getTextFor(d, unit) + ") {}", d, cpc)); } } } } @Deprecated static void addAssertNonemptyProposal(int offset, String prefix, CeylonParseController cpc, List<ICompletionProposal> result, DeclarationWithProximity dwp, Declaration d) { if (!dwp.isUnimported()) { if (d instanceof Value) { TypedDeclaration v = (TypedDeclaration) d; if (v.getType()!=null && d.getUnit().isPossiblyEmptyType(v.getType()) && !v.isVariable()) { Unit unit = cpc.getLastCompilationUnit().getUnit(); result.add(new ControlStructureCompletionProposal(offset, prefix, "assert (nonempty " + getDescriptionFor(d, unit) + ")", "assert (nonempty " + getTextFor(d, unit) + ");", d, cpc)); } } } } @Deprecated static void addTryProposal(int offset, String prefix, CeylonParseController cpc, List<ICompletionProposal> result, DeclarationWithProximity dwp, Declaration d) { if (!dwp.isUnimported()) { if (d instanceof Value) { TypedDeclaration v = (TypedDeclaration) d; if (v.getType()!=null && v.getType().getDeclaration() .inherits(d.getUnit().getObtainableDeclaration()) && !v.isVariable()) { Unit unit = cpc.getLastCompilationUnit().getUnit(); result.add(new ControlStructureCompletionProposal(offset, prefix, "try (" + getDescriptionFor(d, unit) + ")", "try (" + getTextFor(d, unit) + ") {}", d, cpc)); } } } } @Deprecated static void addSwitchProposal(int offset, String prefix, CeylonParseController cpc, List<ICompletionProposal> result, DeclarationWithProximity dwp, Declaration d, Node node, IDocument doc) { if (!dwp.isUnimported()) { if (d instanceof Value) { TypedDeclaration v = (TypedDeclaration) d; Type type = v.getType(); if (type!=null && type.getCaseTypes()!=null && !v.isVariable()) { StringBuilder body = new StringBuilder(); String indent = utilJ2C().indents().getIndent(node, doc); Unit unit = node.getUnit(); for (Type pt: type.getCaseTypes()) { body.append(indent).append("case ("); TypeDeclaration ctd = pt.getDeclaration(); if (ctd.isAnonymous()) { if (!ctd.isToplevel()) { TypeDeclaration td = type.getDeclaration(); body.append(td.getName(unit)).append('.'); } body.append(ctd.getName(unit)); } else { body.append("is ") .append(pt.asSourceCodeString(unit)); } body.append(") {}") .append(utilJ2C().indents().getDefaultLineDelimiter(doc)); } body.append(indent); Unit u = cpc.getLastCompilationUnit().getUnit(); result.add(new ControlStructureCompletionProposal(offset, prefix, "switch (" + getDescriptionFor(d, u) + ")", "switch (" + getTextFor(d, u) + ")" + utilJ2C().indents().getDefaultLineDelimiter(doc) + body, d, cpc)); } } } } private final CeylonParseController cpc; private final Declaration declaration; ControlStructureCompletionProposal(int offset, String prefix, String desc, String text, Declaration dec, CeylonParseController cpc) { super(offset, prefix, CeylonResources.MINOR_CHANGE, desc, text); this.cpc = cpc; this.declaration = dec; } public String getAdditionalProposalInfo() { return getAdditionalProposalInfo(null); } public String getAdditionalProposalInfo(IProgressMonitor monitor) { return getDocumentationFor(cpc, declaration, monitor); } @Override public Point getSelection(IDocument document) { int loc = text.indexOf('}'); if (loc<0) { loc = text.indexOf(';')+1; } return new Point(offset + loc - prefix.length(), 0); } }