@Override public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart editor = getCurrentEditor(); if (editor instanceof CeylonEditor) { CeylonEditor ce = (CeylonEditor) editor; Tree.CompilationUnit rootNode = ce.getParseController().getRootNode(); if (rootNode != null) { IRegion selection = ce.getSelection(); int start = selection.getOffset(); int end = start + selection.getLength(); Node node = findNode(rootNode, start, end); List<ICompletionProposal> list = new ArrayList<ICompletionProposal>(); addPrintProposal(rootNode, list, node, start); if (!list.isEmpty()) { IDocument doc = ce.getCeylonSourceViewer().getDocument(); ICompletionProposal proposal = list.get(0); proposal.apply(doc); Point point = proposal.getSelection(doc); ce.getSelectionProvider().setSelection(new TextSelection(point.x, point.y)); } } } return null; }
public static void refineFormalMembers(CeylonEditor editor) throws ExecutionException { Tree.CompilationUnit cu = editor.getParseController().getRootNode(); if (cu == null) return; Node node = getSelectedNode(editor); IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput()); final TextChange change = new DocumentChange("Refine Formal Members", document); change.setEdit(new MultiTextEdit()); // TODO: copy/pasted from CeylonQuickFixAssistant Tree.Body body; int offset; if (node instanceof Tree.ClassDefinition) { body = ((Tree.ClassDefinition) node).getClassBody(); offset = -1; } else if (node instanceof Tree.InterfaceDefinition) { body = ((Tree.InterfaceDefinition) node).getInterfaceBody(); offset = -1; } else if (node instanceof Tree.ObjectDefinition) { body = ((Tree.ObjectDefinition) node).getClassBody(); offset = -1; } else if (node instanceof Tree.ClassBody || node instanceof Tree.InterfaceBody) { body = (Tree.Body) node; offset = editor.getSelection().getOffset(); } else { // TODO run a visitor to find the containing body! return; // TODO popup error dialog } boolean isInterface = body instanceof Tree.InterfaceBody; // TODO: copy/pasted from ImplementFormalMembersProposal List<Statement> statements = body.getStatements(); String indent; String bodyIndent = getIndent(body, document); if (statements.isEmpty()) { indent = "\n" + bodyIndent + getDefaultIndent(); if (offset < 0) offset = body.getStartIndex() + 1; } else { Statement statement = statements.get(statements.size() - 1); indent = "\n" + getIndent(statement, document); if (offset < 0) offset = statement.getStopIndex() + 1; } StringBuilder result = new StringBuilder(); Set<Declaration> already = new HashSet<Declaration>(); for (DeclarationWithProximity dwp : getProposals(node, cu).values()) { Declaration d = dwp.getDeclaration(); if (d.isFormal() && ((ClassOrInterface) node.getScope()).isInheritedFromSupertype(d)) { ProducedReference pr = getRefinedProducedReference(node, d); result .append(indent) .append(getRefinementTextFor(d, pr, isInterface, indent)) .append(indent); importSignatureTypes(d, cu, already); } } try { if (document.getChar(offset) == '}' && result.length() > 0) { result.append("\n").append(bodyIndent); } } catch (BadLocationException e) { e.printStackTrace(); } applyImports(change, already, cu); change.addEdit(new InsertEdit(offset, result.toString())); change.initializeValidationData(null); try { getWorkspace().run(new PerformChangeOperation(change), new NullProgressMonitor()); } catch (CoreException ce) { throw new ExecutionException("Error cleaning imports", ce); } }
@Deprecated // replaced by RefineFormalMembersQuickFix.ceylon private void refineFormalMembers(IDocument document) throws ExecutionException { if (rootNode == null) return; TextChange change = new DocumentChange("Refine Members", document); change.setEdit(new MultiTextEdit()); // TODO: copy/pasted from CeylonQuickFixAssistant Tree.Body body; int offset; if (node instanceof Tree.ClassDefinition) { ClassDefinition classDefinition = (Tree.ClassDefinition) node; body = classDefinition.getClassBody(); offset = -1; } else if (node instanceof Tree.InterfaceDefinition) { Tree.InterfaceDefinition interfaceDefinition = (Tree.InterfaceDefinition) node; body = interfaceDefinition.getInterfaceBody(); offset = -1; } else if (node instanceof Tree.ObjectDefinition) { Tree.ObjectDefinition objectDefinition = (Tree.ObjectDefinition) node; body = objectDefinition.getClassBody(); offset = -1; } else if (node instanceof Tree.ObjectExpression) { Tree.ObjectExpression objectExpression = (Tree.ObjectExpression) node; body = objectExpression.getClassBody(); offset = -1; } else if (node instanceof Tree.ClassBody || node instanceof Tree.InterfaceBody) { body = (Tree.Body) node; IEditorPart editor = getCurrentEditor(); if (editor instanceof CeylonEditor) { CeylonEditor ce = (CeylonEditor) editor; offset = ce.getSelection().getOffset(); } else { offset = -1; } } else { return; } if (body == null) { return; } boolean isInterface = body instanceof Tree.InterfaceBody; List<Tree.Statement> statements = body.getStatements(); String indent; // String bodyIndent = getIndent(body, document); String bodyIndent = utilJ2C().indents().getIndent(node, document); String delim = utilJ2C().indents().getDefaultLineDelimiter(document); if (statements.isEmpty()) { indent = delim + bodyIndent + utilJ2C().indents().getDefaultIndent(); if (offset < 0) { offset = body.getStartIndex() + 1; } } else { Tree.Statement statement = statements.get(statements.size() - 1); indent = delim + utilJ2C().indents().getIndent(statement, document); if (offset < 0) { offset = statement.getEndIndex(); } } StringBuilder result = new StringBuilder(); Set<Declaration> already = new HashSet<Declaration>(); ClassOrInterface ci = (ClassOrInterface) node.getScope(); Unit unit = node.getUnit(); Set<String> ambiguousNames = new HashSet<String>(); // TODO: does not return unrefined overloaded // versions of a method with one overlaad // already refined Collection<DeclarationWithProximity> proposals = ci.getMatchingMemberDeclarations(unit, ci, "", 0).values(); for (DeclarationWithProximity dwp : proposals) { Declaration dec = dwp.getDeclaration(); for (Declaration d : overloads(dec)) { try { if (d.isFormal() && ci.isInheritedFromSupertype(d)) { appendRefinementText(isInterface, indent, result, ci, unit, d); importProposals().importSignatureTypes(d, rootNode, already); ambiguousNames.add(d.getName()); } } catch (Exception e) { e.printStackTrace(); } } } for (TypeDeclaration superType : ci.getSupertypeDeclarations()) { for (Declaration m : superType.getMembers()) { try { if (m.getName() != null && m.isShared()) { Declaration r = ci.getMember(m.getName(), null, false); if ((r == null || !r.refines(m) && !r.getContainer().equals(ci)) && ambiguousNames.add(m.getName())) { appendRefinementText(isInterface, indent, result, ci, unit, m); importProposals().importSignatureTypes(m, rootNode, already); } } } catch (Exception e) { e.printStackTrace(); } } } try { if (document.getChar(offset) == '}' && result.length() > 0) { result.append(delim).append(bodyIndent); } } catch (BadLocationException e) { e.printStackTrace(); } importProposals().applyImports(change, already, rootNode, document); change.addEdit(new InsertEdit(offset, result.toString())); change.initializeValidationData(null); try { getWorkspace().run(new PerformChangeOperation(change), new NullProgressMonitor()); } catch (CoreException ce) { ce.printStackTrace(); } }