package com.redhat.ceylon.eclipse.code.correct; import static com.redhat.ceylon.eclipse.code.correct.CorrectionUtil.computeSelection; import org.eclipse.jface.text.Region; import org.eclipse.ltk.core.refactoring.TextChange; import org.eclipse.ltk.core.refactoring.TextFileChange; import org.eclipse.swt.graphics.Image; import com.redhat.ceylon.model.typechecker.model.Scope; import com.redhat.ceylon.model.typechecker.model.Type; import com.redhat.ceylon.model.typechecker.model.Unit; class CreateProposal extends InitializerProposal { private CreateProposal(String def, String desc, Scope scope, Unit unit, Type returnType, Image image, int offset, TextFileChange change, int exitPos, boolean isObjectOrClass) { super(desc, change, scope, unit, returnType, isObjectOrClass ? new Region(offset, 0): computeSelection(offset, def), image, exitPos); } CreateProposal(String desc, Scope scope, Unit unit, Type returnType, Image image, TextChange change, int exitPos, Region selection) { super(desc, change, scope, unit, returnType, selection, image, exitPos); } // static void addCreateMemberProposal( // Collection<ICompletionProposal> proposals, // DefinitionGenerator dg, Declaration typeDec, // ModifiablePhasedUnit<IProject,IResource,IFolder,IFile> unit, Tree.Declaration decNode, // Tree.Body body, Tree.Statement statement) { // IFile file = unit.getResourceFile(); // if (file == null) { // return; // } // TextFileChange change = // new TextFileChange("Create Member", file); // change.setEdit(new MultiTextEdit()); // IDocument doc = getDocument(change); // String indentBefore; // String indentAfter; // String indent; // int offset; // List<Tree.Statement> statements = // body.getStatements(); // String delim = utilJ2C().indents().getDefaultLineDelimiter(doc); // if (statements.isEmpty()) { // String bodyIndent = utilJ2C().indents().getIndent(decNode, doc); // indent = bodyIndent + utilJ2C().indents().getDefaultIndent(); // indentBefore = delim + indent; // try { // boolean singleLineBody = // doc.getLineOfOffset(body.getStartIndex()) // == doc.getLineOfOffset(body.getStopIndex()); // if (singleLineBody) { // indentAfter = delim + bodyIndent; // } // else { // indentAfter = ""; // } // } // catch (BadLocationException e) { // e.printStackTrace(); // indentAfter = delim; // } // offset = body.getStartIndex()+1; // } // else { // Tree.Statement st; // if (statement!=null && // statement.getUnit().equals(body.getUnit()) && // statement.getStartIndex()>=body.getStartIndex() && // statement.getEndIndex()<=body.getEndIndex()) { // st = statements.get(0); // for (Tree.Statement s: statements) { // if (statement.getStartIndex()>=s.getStartIndex() && // statement.getEndIndex()<=s.getEndIndex()) { // st = s; // } // } // indent = utilJ2C().indents().getIndent(st, doc); // indentBefore = ""; // indentAfter = delim + indent; // offset = st.getStartIndex(); // } // else { // st = statements.get(statements.size()-1); // indent = utilJ2C().indents().getIndent(st, doc); // indentBefore = delim + indent; // indentAfter = ""; // offset = st.getEndIndex(); // } // } // String generated = // typeDec instanceof Interface ? // dg.generateSharedFormal(indent, delim) : // dg.generateShared(indent, delim); // String def = indentBefore + generated + indentAfter; // int il = // (int) importProposals().applyImports(change, dg.getImports(), // unit.getCompilationUnit(), doc); // change.addEdit(new InsertEdit(offset, def)); // String desc = // "Create " + memberKind(dg) + // " in '" + typeDec.getName() + "'"; // int exitPos = dg.getNode().getEndIndex(); // proposals.add(new CreateProposal(def, desc, // body.getScope(), body.getUnit(), // dg.getReturnType(), dg.getImage(), // offset+il, change, exitPos, // dg instanceof ObjectClassDefinitionGenerator)); // } // // private static String memberKind(DefinitionGenerator dg) { // String desc = dg.getDescription(); // if (desc.startsWith("function")) { // return "method" + desc.substring(8); // } // if (desc.startsWith("value")) { // return "attribute" + desc.substring(5); // } // if (desc.startsWith("class")) { // return "member class" + desc.substring(5); // } // return desc; // } // // private static void addCreateProposal( // Collection<ICompletionProposal> proposals, // boolean local, DefinitionGenerator dg, // ModifiablePhasedUnit<IProject,IResource,IFolder,IFile> unit, // Tree.Statement statement) { // IFile file = unit.getResourceFile(); // if (file == null) { // return; // } // TextFileChange change = // new TextFileChange( // local ? // "Create Local" : // "Create Toplevel", // file); // change.setEdit(new MultiTextEdit()); // IDocument doc = getDocument(change); // String indent = utilJ2C().indents().getIndent(statement, doc); // int offset = statement.getStartIndex(); // String delim = utilJ2C().indents().getDefaultLineDelimiter(doc); // Tree.CompilationUnit rootNode = // unit.getCompilationUnit(); // int il = // (int) importProposals().applyImports(change, dg.getImports(), // rootNode, doc); // String def = // dg.generate(indent, delim) + delim + indent; // if (!local) def += delim; // change.addEdit(new InsertEdit(offset, def)); // String desc = // (local ? // "Create local " : // "Create toplevel ") // + dg.getDescription(); // final Scope scope = // local ? // statement.getScope() : // rootNode.getUnit().getPackage(); // int exitPos = dg.getNode().getEndIndex(); // proposals.add(new CreateProposal(def, desc, // scope, rootNode.getUnit(), // dg.getReturnType(), dg.getImage(), // offset+il, change, exitPos, // dg instanceof ObjectClassDefinitionGenerator)); // } // // static void addCreateMemberProposals( // Collection<ICompletionProposal> proposals, // IProject project, DefinitionGenerator dg, // Tree.QualifiedMemberOrTypeExpression qmte, // Tree.Statement statement) { // Tree.Primary p = qmte.getPrimary(); // if (p.getTypeModel()!=null) { // Declaration typeDec = // p.getTypeModel() // .getDeclaration(); // addCreateMemberProposals(proposals, project, dg, // typeDec, statement); // } // } // // static void addCreateMemberProposals( // Collection<ICompletionProposal> proposals, // IProject project, DefinitionGenerator dg, // Declaration typeDec, Tree.Statement statement) { // if (typeDec!=null && (typeDec instanceof Class // || (typeDec instanceof Interface // && dg.isFormalSupported()))) { // Unit u = typeDec.getUnit(); // if (u instanceof ModifiableSourceFile) { // ModifiableSourceFile msf = // (ModifiableSourceFile) u; // ModifiablePhasedUnit<IProject,IResource,IFolder,IFile> phasedUnit = // msf.getPhasedUnit(); // //TODO: "object" declarations? // FindDeclarationNodeVisitor fdv = // new FindDeclarationNodeVisitor(typeDec); // phasedUnit.getCompilationUnit().visit(fdv); // Tree.Declaration decNode = // (Tree.Declaration) // fdv.getDeclarationNode(); // Tree.Body body = // getClassOrInterfaceBody(decNode); // IFile file = phasedUnit.getResourceFile(); // if (body!=null // && file != null) { // addCreateMemberProposal(proposals, dg, // typeDec, phasedUnit, decNode, body, // statement); // } // } // } // } // // static void addCreateLocalProposals( // Collection<ICompletionProposal> proposals, // IProject project, DefinitionGenerator dg) { // Tree.Statement statement = // findStatement(dg.getRootNode(), // dg.getNode()); // if (statement!=null) { // Unit u = dg.getRootNode().getUnit(); // if (u instanceof ModifiableSourceFile) { // ModifiableSourceFile cu = // (ModifiableSourceFile) u; // addCreateProposal(proposals, true, dg, // cu.getPhasedUnit(), statement); // } // } // } // // static void addCreateToplevelProposals( // Collection<ICompletionProposal> proposals, // IProject project, DefinitionGenerator dg) { // Tree.Statement statement = // findToplevelStatement(dg.getRootNode(), // dg.getNode()); // if (statement!=null) { // Unit u = dg.getRootNode().getUnit(); // if (u instanceof ModifiableSourceFile) { // ModifiableSourceFile cu = // (ModifiableSourceFile) u; // addCreateProposal(proposals, false, dg, // cu.getPhasedUnit(), statement); // } // } // } // // static void addCreateProposals( // Tree.CompilationUnit rootNode, Node node, // Collection<ICompletionProposal> proposals, // IProject project, IFile file) { // Tree.MemberOrTypeExpression smte = // (Tree.MemberOrTypeExpression) node; // String brokenName = // getIdentifyingNode(node) // .getText(); // if (!brokenName.isEmpty()) { // ValueFunctionDefinitionGenerator vfdg = // ValueFunctionDefinitionGenerator.create( // brokenName, smte, rootNode); // if (vfdg!=null) { // if (smte instanceof Tree.BaseMemberExpression) { // Tree.BaseMemberExpression bme = // (Tree.BaseMemberExpression) smte; // Tree.Identifier id = bme.getIdentifier(); // int tt = id.getToken().getType(); // if (tt!=CeylonLexer.AIDENTIFIER) { // addCreateParameterProposal(proposals, // project, vfdg); // } // } // addCreateProposals(rootNode, proposals, // project, file, smte, vfdg); // } // ObjectClassDefinitionGenerator ocdg = // ObjectClassDefinitionGenerator.create( // brokenName, smte, rootNode); // if (ocdg!=null) { // addCreateProposals(rootNode, proposals, // project, file, smte, ocdg); // } // } // } // // private static void addCreateProposals( // Tree.CompilationUnit rootNode, // Collection<ICompletionProposal> proposals, // IProject project, IFile file, // Tree.MemberOrTypeExpression smte, // DefinitionGenerator dg) { // if (smte instanceof Tree.QualifiedMemberOrTypeExpression) { // Tree.QualifiedMemberOrTypeExpression qmte = // (Tree.QualifiedMemberOrTypeExpression) smte; // addCreateMemberProposals(proposals, project, dg, // qmte, findStatement(rootNode, smte)); // } // else { // Node node = dg.getNode(); // if (!(node 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 // findStatement(rootNode, smte)); // Scope cc = container.getContainer(); // if (cc instanceof Declaration) { // Declaration outerContainer = // (Declaration) // cc; // container = // findClassContainer( // outerContainer); // } // else { // break; // } // } // while (container!=null); // } // } // addCreateToplevelProposals(proposals, project, dg); // addCreateInNewUnitProposal(proposals, dg, file, rootNode); // } // } // // // private static ClassOrInterface findClassContainer( // Tree.CompilationUnit rootNode, Node node){ // FindContainerVisitor fcv = // new FindContainerVisitor(node); // fcv.visit(rootNode); // Tree.Declaration declaration = fcv.getDeclaration(); // if (declaration == null || declaration == node) { // return null; // } // Declaration model = declaration.getDeclarationModel(); // if (declaration instanceof Tree.ClassOrInterface) { // return (ClassOrInterface) model; // } // else if (declaration instanceof Tree.MethodDefinition) { // return findClassContainer(model); // } // else if (declaration instanceof Tree.ObjectDefinition) { // return findClassContainer(model); // } // else { // return null; // } // } // // private static ClassOrInterface findClassContainer( // Declaration declarationModel) { // do { // if (declarationModel == null) { // return null; // } // if (declarationModel instanceof ClassOrInterface) { // return (ClassOrInterface) declarationModel; // } // Scope container = declarationModel.getContainer(); // if (container instanceof Declaration) { // declarationModel = (Declaration) container; // } // else { // return null; // } // } // while(true); // } // }