Search in sources :

Example 16 with InsertEdit

use of org.eclipse.text.edits.InsertEdit in project titan.EclipsePlug-ins by eclipse.

the class ChangeCreator method createTextEdit.

private TextEdit[] createTextEdit(final IFile toVisit, final String fileContent, final Edit e, final Map<Edit, InsertEdit> editsDone) {
    // check for multi-declaration statement
    if (e.declSt.isMultiDeclaration()) {
        final Location cutLoc = calculateMultiDeclarationCutLoc(fileContent, e.declSt);
        final String moveContent = calculateMultiDeclarationMoveContent(fileContent, e.declSt);
        // remove stmt from multi-declaration
        e.declSt.removeFromMultiDeclaration();
        // create remove edit
        final int cutLen = cutLoc.getEndOffset() - cutLoc.getOffset();
        final TextEdit cut = new DeleteEdit(cutLoc.getOffset(), cutLen);
        // create insert edit
        InsertEdit insert = null;
        if (!e.isRemoveEdit()) {
            // update insert location if the insertionPoint stmt was moved
            int insertOffset = ((ILocateableNode) e.insertionPoint.getAstNode()).getLocation().getOffset();
            for (Map.Entry<Edit, InsertEdit> ed : editsDone.entrySet()) {
                if (ed.getKey().declSt.equals(e.insertionPoint)) {
                    insertOffset = ed.getValue().getOffset();
                    break;
                }
            }
            // 
            insertOffset = findLineBeginningOffset(fileContent, insertOffset);
            insert = new InsertEdit(insertOffset, moveContent);
            editsDone.put(e, insert);
        }
        if (insert != null) {
            return new TextEdit[] { insert, cut };
        }
        return new TextEdit[] { cut };
    } else {
        // 
        final Location cutLoc = findStatementLocation(fileContent, ((ILocateableNode) e.declSt.getAstNode()).getLocation(), true);
        InsertEdit insert = null;
        if (!e.isRemoveEdit()) {
            final Location copyLoc = findStatementLocation(fileContent, ((ILocateableNode) e.declSt.getAstNode()).getLocation(), false);
            // update insert location if the insertionPoint stmt was moved
            final Location insPLoc = ((ILocateableNode) e.insertionPoint.getAstNode()).getLocation();
            int insertOffset = insPLoc.getOffset();
            for (Map.Entry<Edit, InsertEdit> ed : editsDone.entrySet()) {
                if (ed.getKey().declSt.equals(e.insertionPoint)) {
                    insertOffset = ed.getValue().getOffset();
                    break;
                }
            }
            // 
            final int prefixStartOffset = findLineBeginningOffset(fileContent, insertOffset);
            final String insertText = fileContent.substring(copyLoc.getOffset(), copyLoc.getEndOffset()) + "\n";
            String insertPrefix = fileContent.substring(prefixStartOffset, insertOffset);
            // if prefix is not whitespace only, do not use the prefix
            if (!insertPrefix.trim().equals("")) {
                insertPrefix = "";
            }
            insert = new InsertEdit(prefixStartOffset, insertPrefix + insertText);
            editsDone.put(e, insert);
        }
        final int cutLen = cutLoc.getEndOffset() - cutLoc.getOffset();
        final TextEdit cut = new DeleteEdit(cutLoc.getOffset(), cutLen);
        // System.err.println("DeleteEdit: " + fileContent.substring(cutLoc.getOffset(), cutLoc.getEndOffset()));
        if (insert != null) {
            return new TextEdit[] { insert, cut };
        }
        return new TextEdit[] { cut };
    }
}
Also used : InsertEdit(org.eclipse.text.edits.InsertEdit) MultiTextEdit(org.eclipse.text.edits.MultiTextEdit) TextEdit(org.eclipse.text.edits.TextEdit) ILocateableNode(org.eclipse.titan.designer.AST.ILocateableNode) Edit(org.eclipse.titanium.refactoring.scope.nodes.Edit) InsertEdit(org.eclipse.text.edits.InsertEdit) MultiTextEdit(org.eclipse.text.edits.MultiTextEdit) TextEdit(org.eclipse.text.edits.TextEdit) DeleteEdit(org.eclipse.text.edits.DeleteEdit) DeleteEdit(org.eclipse.text.edits.DeleteEdit) Map(java.util.Map) HashMap(java.util.HashMap) Location(org.eclipse.titan.designer.AST.Location)

Example 17 with InsertEdit

use of org.eclipse.text.edits.InsertEdit in project titan.EclipsePlug-ins by eclipse.

the class ChangeCreator method createFileChange.

/**
 * Creates the {@link #change} object, which contains all the inserted and edited texts
 * in the selected resources.
 */
private Change createFileChange(final IFile toVisit) {
    if (toVisit == null) {
        return null;
    }
    final ProjectSourceParser sourceParser = GlobalParser.getProjectSourceParser(toVisit.getProject());
    final Module module = sourceParser.containedModule(toVisit);
    if (module == null) {
        return null;
    }
    // 
    // collect functions
    Set<Definition> funcs;
    final FunctionCollector vis = new FunctionCollector();
    if (defSelection == null) {
        module.accept(vis);
        funcs = vis.getResult();
    } else {
        if (defSelection instanceof Def_Function || defSelection instanceof Def_Testcase) {
            // TODO any other possibilities for the type of 'defSelection'?
            funcs = new HashSet<Definition>();
            funcs.add(defSelection);
        } else {
            ErrorReporter.logError("Variable scope reduction called for " + defSelection.getIdentifier().getDisplayName() + ", but it is only supported for functions and testcases. ");
            return null;
        }
    }
    // create edits
    final List<Edit> allEdits = new ArrayList<Edit>();
    for (Definition def : funcs) {
        final List<Edit> edits = analyzeFunction(def);
        if (edits == null) {
            continue;
        }
        allEdits.addAll(edits);
    }
    if (allEdits.isEmpty()) {
        return null;
    }
    final String fileContents = loadFileContent(toVisit);
    // create text edits
    // 
    final TextFileChange tfc = new TextFileChange(toVisit.getName(), toVisit);
    final MultiTextEdit rootEdit = new MultiTextEdit();
    tfc.setEdit(rootEdit);
    // TODO this is an O(n^2) algorithm
    // merge overlapping DeleteEdits
    // used, when removing all parts of a multi-declaration statement:
    // the DeleteEdit for removing the last part covers all the DeleteEdits for the other parts
    // WARNING merging edits might make debugging more difficult, since the overlapping edit errors are avoided
    final List<TextEdit> allTes = new LinkedList<TextEdit>();
    // collect processed (insert) edits with their created insert edit
    final Map<Edit, InsertEdit> editsDone = new HashMap<Edit, InsertEdit>();
    for (Edit e : allEdits) {
        final TextEdit[] tes = createTextEdit(toVisit, fileContents, e, editsDone);
        for (TextEdit te : tes) {
            if (!(te instanceof DeleteEdit)) {
                allTes.add(te);
                // System.err.println("$ nonde added: " + te.getOffset() + "-" + te.getExclusiveEnd());
                continue;
            }
            DeleteEdit dte = (DeleteEdit) te;
            final ListIterator<TextEdit> it = allTes.listIterator();
            while (it.hasNext()) {
                final TextEdit currTe = it.next();
                if (!(currTe instanceof DeleteEdit)) {
                    continue;
                }
                final DeleteEdit currDte = (DeleteEdit) currTe;
                // if the new edit (dte) overlaps currDte, merge them
                if (doesDeleteEditsOverlap(dte, currDte)) {
                    // System.err.println("$ de removed: " + currDte.getOffset() + "-" + currDte.getExclusiveEnd());
                    it.remove();
                    dte = mergeDeleteEdits(dte, currDte);
                // System.err.println("$ merged des: " + dte.getOffset() + "-" + dte.getExclusiveEnd());
                }
            }
            // System.err.println("$ de added: " + dte.getOffset() + "-" + dte.getExclusiveEnd());
            allTes.add(dte);
        }
    }
    Collections.reverse(allTes);
    for (TextEdit te : allTes) {
        rootEdit.addChild(te);
    }
    return tfc;
}
Also used : InsertEdit(org.eclipse.text.edits.InsertEdit) Def_Testcase(org.eclipse.titan.designer.AST.TTCN3.definitions.Def_Testcase) HashMap(java.util.HashMap) Definition(org.eclipse.titan.designer.AST.TTCN3.definitions.Definition) ArrayList(java.util.ArrayList) Edit(org.eclipse.titanium.refactoring.scope.nodes.Edit) InsertEdit(org.eclipse.text.edits.InsertEdit) MultiTextEdit(org.eclipse.text.edits.MultiTextEdit) TextEdit(org.eclipse.text.edits.TextEdit) DeleteEdit(org.eclipse.text.edits.DeleteEdit) TextFileChange(org.eclipse.ltk.core.refactoring.TextFileChange) DeleteEdit(org.eclipse.text.edits.DeleteEdit) ProjectSourceParser(org.eclipse.titan.designer.parsers.ProjectSourceParser) Def_Function(org.eclipse.titan.designer.AST.TTCN3.definitions.Def_Function) LinkedList(java.util.LinkedList) MultiTextEdit(org.eclipse.text.edits.MultiTextEdit) TextEdit(org.eclipse.text.edits.TextEdit) Module(org.eclipse.titan.designer.AST.Module) MultiTextEdit(org.eclipse.text.edits.MultiTextEdit)

Example 18 with InsertEdit

use of org.eclipse.text.edits.InsertEdit in project webtools.sourceediting by eclipse.

the class DocumentChangeListenerToTextEdit method documentChanged.

public void documentChanged(DocumentEvent event) {
    int length = event.getLength();
    int offset = event.getOffset();
    String text = event.getText();
    if (length < 0) {
        return;
    }
    if (length == 0) {
        /* inserting text operation */
        InsertEdit edit = new InsertEdit(offset, text);
        textEdit.addChild(edit);
    } else if (text == null || text.equals("")) {
        // $NON-NLS-1$
        /* delete operation */
        DeleteEdit edit = new DeleteEdit(offset, length);
        textEdit.addChild(edit);
    } else if (length > 0) {
        /* replace text operation */
        ReplaceEdit edit = new ReplaceEdit(offset, length, text);
        textEdit.addChild(edit);
    }
}
Also used : InsertEdit(org.eclipse.text.edits.InsertEdit) ReplaceEdit(org.eclipse.text.edits.ReplaceEdit) DeleteEdit(org.eclipse.text.edits.DeleteEdit)

Example 19 with InsertEdit

use of org.eclipse.text.edits.InsertEdit in project webtools.sourceediting by eclipse.

the class AutoImportProposal method addImportDeclaration.

/**
 * adds the import declaration to the document in the viewer in the appropriate position
 * @param viewer
 */
private void addImportDeclaration(ITextViewer viewer) {
    IDocument doc = viewer.getDocument();
    // calculate once and pass along
    boolean isXml = isXmlFormat(doc);
    int insertPosition = getInsertPosition(doc, isXml);
    String insertText = createImportDeclaration(doc, isXml);
    InsertEdit insert = new InsertEdit(insertPosition, insertText);
    try {
        insert.apply(doc);
    } catch (MalformedTreeException e) {
        Logger.logException(e);
    } catch (BadLocationException e) {
        Logger.logException(e);
    }
    // make sure the cursor position after is correct
    setCursorPosition(getCursorPosition() + insertText.length());
}
Also used : InsertEdit(org.eclipse.text.edits.InsertEdit) MalformedTreeException(org.eclipse.text.edits.MalformedTreeException) IDocument(org.eclipse.jface.text.IDocument) BadLocationException(org.eclipse.jface.text.BadLocationException)

Example 20 with InsertEdit

use of org.eclipse.text.edits.InsertEdit in project webtools.sourceediting by eclipse.

the class ThreadedModelReadEditTest method iDocumentInsert.

public void iDocumentInsert(IFile file, String text, int insertionPoint) {
    // get the file's text buffer
    ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager();
    IPath path = file.getFullPath();
    try {
        bufferManager.connect(path, null);
        IDocument doc = null;
        ITextFileBuffer buff = bufferManager.getTextFileBuffer(file.getFullPath());
        doc = buff.getDocument();
        boolean saveWhenDone = !buff.isDirty();
        InsertEdit insertEdit = new InsertEdit(insertionPoint, text);
        insertEdit.apply(doc);
        // if the document was not previously dirty, save it
        if (saveWhenDone)
            buff.commit(null, false);
    } catch (BadLocationException e) {
        e.printStackTrace();
    } catch (CoreException e) {
        e.printStackTrace();
    } finally {
        try {
            bufferManager.disconnect(path, null);
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }
// System.out.println("inserted text, file buffer style");
}
Also used : InsertEdit(org.eclipse.text.edits.InsertEdit) IPath(org.eclipse.core.runtime.IPath) CoreException(org.eclipse.core.runtime.CoreException) ITextFileBufferManager(org.eclipse.core.filebuffers.ITextFileBufferManager) ITextFileBuffer(org.eclipse.core.filebuffers.ITextFileBuffer) IDocument(org.eclipse.jface.text.IDocument) BadLocationException(org.eclipse.jface.text.BadLocationException)

Aggregations

InsertEdit (org.eclipse.text.edits.InsertEdit)73 MultiTextEdit (org.eclipse.text.edits.MultiTextEdit)33 ReplaceEdit (org.eclipse.text.edits.ReplaceEdit)25 TextEdit (org.eclipse.text.edits.TextEdit)24 DeleteEdit (org.eclipse.text.edits.DeleteEdit)22 Test (org.junit.Test)22 BadLocationException (org.eclipse.jface.text.BadLocationException)13 UndoEdit (org.eclipse.text.edits.UndoEdit)13 ArrayList (java.util.ArrayList)12 ICompilationUnit (org.eclipse.jdt.core.ICompilationUnit)10 MalformedTreeException (org.eclipse.text.edits.MalformedTreeException)10 IDocument (org.eclipse.jface.text.IDocument)8 TextFileChange (org.eclipse.ltk.core.refactoring.TextFileChange)8 Location (org.eclipse.titan.designer.AST.Location)8 Module (org.eclipse.titan.designer.AST.Module)7 ProjectSourceParser (org.eclipse.titan.designer.parsers.ProjectSourceParser)7 WorkspaceJob (org.eclipse.core.resources.WorkspaceJob)5 CoreException (org.eclipse.core.runtime.CoreException)5 IFile (org.eclipse.core.resources.IFile)4 IPackageFragment (org.eclipse.jdt.core.IPackageFragment)4