private static void addCreateProposals( Tree.CompilationUnit rootNode, Collection<ICompletionProposal> proposals, IProject project, IFile file, Tree.MemberOrTypeExpression smte, DefinitionGenerator dg) { if (smte instanceof Tree.QualifiedMemberOrTypeExpression) { addCreateMemberProposals( proposals, project, dg, (Tree.QualifiedMemberOrTypeExpression) smte, Nodes.findStatement(rootNode, smte)); } else { if (!(dg.getNode() instanceof Tree.ExtendedTypeExpression)) { addCreateLocalProposals(proposals, project, dg); ClassOrInterface container = findClassContainer(rootNode, smte); if (container != null && container != smte .getScope()) { // if the statement appears directly in an initializer, propose a // local, not a member do { addCreateMemberProposals( proposals, project, dg, container, // TODO: this is a little lame because // it doesn't handle some cases // of nesting Nodes.findStatement(rootNode, smte)); if (container.getContainer() instanceof Declaration) { Declaration outerContainer = (Declaration) container.getContainer(); container = findClassContainer(outerContainer); } else { break; } } while (container != null); } } addCreateToplevelProposals(proposals, project, dg); addCreateInNewUnitProposal(proposals, dg, file, rootNode); } }
@Deprecated static void addRefineFormalMembersProposal( Collection<ICompletionProposal> proposals, Node n, Tree.CompilationUnit rootNode, boolean ambiguousError) { for (ICompletionProposal p : proposals) { if (p instanceof RefineFormalMembersProposal) { return; } } Node node; if (n instanceof Tree.ClassBody || n instanceof Tree.InterfaceBody || n instanceof Tree.ClassDefinition || n instanceof Tree.InterfaceDefinition || n instanceof Tree.ObjectDefinition || n instanceof Tree.ObjectExpression) { node = n; } else { FindBodyContainerVisitor v = new FindBodyContainerVisitor(n); v.visit(rootNode); node = v.getDeclaration(); } if (node != null) { Scope scope = node.getScope(); if (scope instanceof ClassOrInterface) { ClassOrInterface ci = (ClassOrInterface) scope; String name = ci.getName(); if (name == null) { return; } else if (name.startsWith("anonymous#")) { name = "anonymous class"; } else { name = "'" + name + "'"; } String desc = ambiguousError ? "Refine inherited ambiguous and formal members of " + name : "Refine inherited formal members of " + name; proposals.add(new RefineFormalMembersProposal(node, rootNode, desc)); } } }
@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(); } }