use of org.eclipse.text.edits.TextEdit in project che by eclipse.
the class DeleteChangeCreator method addTextEditFromRewrite.
private static TextChange addTextEditFromRewrite(TextChangeManager manager, ICompilationUnit cu, ASTRewrite rewrite) throws CoreException {
try {
ITextFileBuffer buffer = RefactoringFileBuffers.acquire(cu);
TextEdit resultingEdits = rewrite.rewriteAST(buffer.getDocument(), cu.getJavaProject().getOptions(true));
TextChange textChange = manager.get(cu);
if (textChange instanceof TextFileChange) {
TextFileChange tfc = (TextFileChange) textChange;
tfc.setSaveMode(TextFileChange.KEEP_SAVE_STATE);
}
String message = RefactoringCoreMessages.DeleteChangeCreator_1;
TextChangeCompatibility.addTextEdit(textChange, message, resultingEdits);
return textChange;
} finally {
RefactoringFileBuffers.release(cu);
}
}
use of org.eclipse.text.edits.TextEdit in project che by eclipse.
the class MoveCuUpdateCreator method addReferenceUpdates.
private void addReferenceUpdates(TextChangeManager changeManager, ICompilationUnit movedUnit, IProgressMonitor pm, RefactoringStatus status) throws JavaModelException, CoreException {
List<ICompilationUnit> cuList = Arrays.asList(fCus);
SearchResultGroup[] references = getReferences(movedUnit, pm, status);
for (int i = 0; i < references.length; i++) {
SearchResultGroup searchResultGroup = references[i];
ICompilationUnit referencingCu = searchResultGroup.getCompilationUnit();
if (referencingCu == null)
continue;
boolean simpleReferencesNeedNewImport = simpleReferencesNeedNewImport(movedUnit, referencingCu, cuList);
SearchMatch[] results = searchResultGroup.getSearchResults();
for (int j = 0; j < results.length; j++) {
// TODO: should update type references with results from addImport
TypeReference reference = (TypeReference) results[j];
if (reference.isImportDeclaration()) {
ImportRewrite rewrite = getImportRewrite(referencingCu);
IImportDeclaration importDecl = (IImportDeclaration) SearchUtils.getEnclosingJavaElement(results[j]);
if (Flags.isStatic(importDecl.getFlags())) {
rewrite.removeStaticImport(importDecl.getElementName());
addStaticImport(movedUnit, importDecl, rewrite);
} else {
rewrite.removeImport(importDecl.getElementName());
rewrite.addImport(createStringForNewImport(movedUnit, importDecl));
}
} else if (reference.isQualified()) {
TextChange textChange = changeManager.get(referencingCu);
String changeName = RefactoringCoreMessages.MoveCuUpdateCreator_update_references;
TextEdit replaceEdit = new ReplaceEdit(reference.getOffset(), reference.getSimpleNameStart() - reference.getOffset(), fNewPackage);
TextChangeCompatibility.addTextEdit(textChange, changeName, replaceEdit);
} else if (simpleReferencesNeedNewImport) {
ImportRewrite importEdit = getImportRewrite(referencingCu);
String typeName = reference.getSimpleName();
importEdit.addImport(getQualifiedType(fDestination.getElementName(), typeName));
}
}
}
}
use of org.eclipse.text.edits.TextEdit in project che by eclipse.
the class MultiStateTextFileChange method createTextEditProcessor.
// Copied from TextChange
private TextEditProcessor createTextEditProcessor(ComposableBufferChange change, IDocument document, int flags, boolean preview) {
List excludes = new ArrayList(0);
for (final Iterator iterator = change.getGroups().iterator(); iterator.hasNext(); ) {
TextEditBasedChangeGroup group = (TextEditBasedChangeGroup) iterator.next();
if (!group.isEnabled())
excludes.addAll(Arrays.asList(group.getTextEdits()));
}
if (preview) {
fCopier = new TextEditCopier(change.getEdit());
TextEdit copiedEdit = fCopier.perform();
boolean keep = getKeepPreviewEdits();
if (keep)
flags = flags | TextEdit.UPDATE_REGIONS;
LocalTextEditProcessor result = new LocalTextEditProcessor(document, copiedEdit, flags);
result.setExcludes(mapEdits((TextEdit[]) excludes.toArray(new TextEdit[excludes.size()]), fCopier));
if (!keep)
fCopier = null;
return result;
} else {
LocalTextEditProcessor result = new LocalTextEditProcessor(document, change.getEdit(), flags | TextEdit.UPDATE_REGIONS);
result.setExcludes((TextEdit[]) excludes.toArray(new TextEdit[excludes.size()]));
return result;
}
}
use of org.eclipse.text.edits.TextEdit in project che by eclipse.
the class MultiStateTextFileChange method getPreviewContent.
/*
* @see org.eclipse.ltk.core.refactoring.TextEditBasedChange#getPreviewContent(org.eclipse.ltk.core.refactoring.TextEditBasedChangeGroup[],org.eclipse.jface.text.IRegion,boolean,int,org.eclipse.core.runtime.IProgressMonitor)
*/
public final String getPreviewContent(final TextEditBasedChangeGroup[] groups, final IRegion region, final boolean expand, final int surround, final IProgressMonitor monitor) throws CoreException {
final Set cachedGroups = new HashSet(Arrays.asList(groups));
final IDocument document = new Document(getCurrentDocument(monitor).get());
// Marks the region in the document to be previewed
final Position range = new Position(region.getOffset(), region.getLength());
try {
ComposableBufferChange change = null;
final TextEditBasedChangeGroup[] changedGroups = getChangeGroups();
LinkedList compositeUndo = new LinkedList();
for (int index = 0; index < fChanges.size(); index++) {
change = (ComposableBufferChange) fChanges.get(index);
TextEdit copy = null;
try {
// Have to use a copy
fCopier = new TextEditCopier(change.getEdit());
copy = fCopier.perform();
// Create a mapping from the copied edits to its originals
final Map originalMap = new HashMap();
for (final Iterator outer = change.getGroups().iterator(); outer.hasNext(); ) {
final ComposableBufferChangeGroup group = (ComposableBufferChangeGroup) outer.next();
for (final Iterator inner = group.getCachedEdits().iterator(); inner.hasNext(); ) {
final TextEdit originalEdit = (TextEdit) inner.next();
final TextEdit copiedEdit = fCopier.getCopy(originalEdit);
if (copiedEdit != null)
originalMap.put(copiedEdit, originalEdit);
else
//$NON-NLS-1$
RefactoringCorePlugin.logErrorMessage("Could not find a copy for the indexed text edit " + originalEdit.toString());
}
}
final ComposableBufferChangeGroup[] currentGroup = { null };
final TextEdit[] currentEdit = { null };
// Text edit processor which sets the change group and
// current edit when processing
final TextEditProcessor processor = new TextEditProcessor(document, copy, TextEdit.NONE) {
protected final boolean considerEdit(final TextEdit edit) {
final TextEdit originalEdit = (TextEdit) originalMap.get(edit);
if (originalEdit != null) {
currentEdit[0] = originalEdit;
boolean found = false;
for (int offset = 0; offset < changedGroups.length && !found; offset++) {
final ComposableBufferChangeGroup group = (ComposableBufferChangeGroup) changedGroups[offset];
if (group.containsEdit(originalEdit)) {
currentGroup[0] = group;
found = true;
}
}
if (!found)
currentGroup[0] = null;
} else if (!(edit instanceof MultiTextEdit)) {
//$NON-NLS-1$
RefactoringCorePlugin.logErrorMessage("Could not find the original of the copied text edit " + edit.toString());
}
return true;
}
};
final LinkedList eventUndos = new LinkedList();
// Listener to record the undos on the document (offsets
// relative to the document event)
final IDocumentListener listener = new IDocumentListener() {
public final void documentAboutToBeChanged(final DocumentEvent event) {
final ComposableUndoEdit edit = new ComposableUndoEdit();
edit.setGroup(currentGroup[0]);
edit.setOriginal(currentEdit[0]);
edit.setUndo(createUndoEdit(document, event.getOffset(), event.getLength(), event.getText()));
eventUndos.addFirst(edit);
}
public final void documentChanged(final DocumentEvent event) {
// Do nothing
}
};
try {
// Record undos in LIFO order
document.addDocumentListener(listener);
processor.performEdits();
} finally {
document.removeDocumentListener(listener);
}
compositeUndo.addFirst(eventUndos);
} finally {
fCopier = null;
}
}
final IPositionUpdater positionUpdater = new IPositionUpdater() {
public final void update(final DocumentEvent event) {
final int eventOffset = event.getOffset();
final int eventLength = event.getLength();
final int eventOldEndOffset = eventOffset + eventLength;
final String eventText = event.getText();
final int eventNewLength = eventText == null ? 0 : eventText.length();
final int eventNewEndOffset = eventOffset + eventNewLength;
final int deltaLength = eventNewLength - eventLength;
try {
final Position[] positions = event.getDocument().getPositions(COMPOSABLE_POSITION_CATEGORY);
for (int index = 0; index < positions.length; index++) {
final Position position = positions[index];
if (position.isDeleted())
continue;
final int offset = position.getOffset();
final int length = position.getLength();
final int end = offset + length;
if (offset > eventOldEndOffset) {
// position comes way after change - shift
position.setOffset(offset + deltaLength);
} else if (end < eventOffset) {
// position comes way before change - leave
// alone
} else if (offset == eventOffset) {
// leave alone, since the edits are overlapping
} else if (offset <= eventOffset && end >= eventOldEndOffset) {
// event completely internal to the position
// -
// adjust length
position.setLength(length + deltaLength);
} else if (offset < eventOffset) {
// event extends over end of position - include
// the
// replacement text into the position
position.setLength(eventNewEndOffset - offset);
} else if (end > eventOldEndOffset) {
// event extends from before position into it -
// adjust
// offset and length, including the replacement
// text into
// the position
position.setOffset(eventOffset);
int deleted = eventOldEndOffset - offset;
position.setLength(length - deleted + eventNewLength);
} else {
// event comprises the position - keep it at the
// same
// position, but always inside the replacement
// text
int newOffset = Math.min(offset, eventNewEndOffset);
int newEndOffset = Math.min(end, eventNewEndOffset);
position.setOffset(newOffset);
position.setLength(newEndOffset - newOffset);
}
}
} catch (BadPositionCategoryException exception) {
// ignore and return
}
}
};
try {
document.addPositionCategory(COMPOSABLE_POSITION_CATEGORY);
document.addPositionUpdater(positionUpdater);
// Apply undos in LIFO order to get to the original document
// Track the undos of edits which are in change groups to be
// previewed and insert
// Undo edits for them (corresponding to the linearized net
// effect on the original document)
final LinkedList undoQueue = new LinkedList();
for (final Iterator outer = compositeUndo.iterator(); outer.hasNext(); ) {
for (final Iterator inner = ((List) outer.next()).iterator(); inner.hasNext(); ) {
final ComposableUndoEdit edit = (ComposableUndoEdit) inner.next();
final ReplaceEdit undo = edit.getUndo();
final int offset = undo.getOffset();
final int length = undo.getLength();
final String text = undo.getText();
ComposableEditPosition position = new ComposableEditPosition();
if (cachedGroups.contains(edit.getGroup())) {
if (text == null || text.equals("")) {
//$NON-NLS-1$
position.offset = offset;
if (length != 0) {
// Undo is a delete, create final insert
// edit
position.length = 0;
position.setText(edit.getOriginalText());
} else
//$NON-NLS-1$
RefactoringCorePlugin.logErrorMessage("Dubious undo edit found: " + undo.toString());
} else if (length == 0) {
position.offset = offset;
// Undo is an insert, create final delete
// edit
//$NON-NLS-1$
position.setText("");
position.length = text.length();
} else {
// Undo is a replace, create final replace edit
position.offset = offset;
position.length = length;
position.setText(edit.getOriginalText());
}
document.addPosition(COMPOSABLE_POSITION_CATEGORY, position);
}
position = new ComposableEditPosition();
position.offset = undo.getOffset();
position.length = undo.getLength();
position.setText(undo.getText());
undoQueue.add(position);
}
for (final Iterator iterator = undoQueue.iterator(); iterator.hasNext(); ) {
final ComposableEditPosition position = (ComposableEditPosition) iterator.next();
document.replace(position.offset, position.length, position.getText());
iterator.remove();
}
}
// Use a simple non deleting position updater for the range
final IPositionUpdater markerUpdater = new NonDeletingPositionUpdater(MARKER_POSITION_CATEGORY);
try {
final Position[] positions = document.getPositions(COMPOSABLE_POSITION_CATEGORY);
document.addPositionCategory(MARKER_POSITION_CATEGORY);
document.addPositionUpdater(markerUpdater);
document.addPosition(MARKER_POSITION_CATEGORY, range);
for (int index = 0; index < positions.length; index++) {
final ComposableEditPosition position = (ComposableEditPosition) positions[index];
//$NON-NLS-1$
document.replace(position.offset, position.length, position.getText() != null ? position.getText() : "");
}
} catch (BadPositionCategoryException exception) {
RefactoringCorePlugin.log(exception);
} finally {
document.removePositionUpdater(markerUpdater);
try {
document.removePosition(MARKER_POSITION_CATEGORY, range);
document.removePositionCategory(MARKER_POSITION_CATEGORY);
} catch (BadPositionCategoryException exception) {
// Cannot happen
}
}
} catch (BadPositionCategoryException exception) {
RefactoringCorePlugin.log(exception);
} finally {
document.removePositionUpdater(positionUpdater);
try {
document.removePositionCategory(COMPOSABLE_POSITION_CATEGORY);
} catch (BadPositionCategoryException exception) {
RefactoringCorePlugin.log(exception);
}
}
return getContent(document, new Region(range.offset, range.length), expand, surround);
} catch (MalformedTreeException exception) {
RefactoringCorePlugin.log(exception);
} catch (BadLocationException exception) {
RefactoringCorePlugin.log(exception);
}
return getPreviewDocument(monitor).get();
}
use of org.eclipse.text.edits.TextEdit in project che by eclipse.
the class CUCorrectionProposal method createTextChange.
/**
* Creates the text change for this proposal.
* This method is only called once and only when no text change has been passed in
* {@link #CUCorrectionProposal(String, ICompilationUnit, TextChange, int, Image)}.
*
* @return the created text change
* @throws CoreException if the creation of the text change failed
*/
protected TextChange createTextChange() throws CoreException {
ICompilationUnit cu = getCompilationUnit();
String name = getName();
TextChange change;
if (!cu.getResource().exists()) {
String source;
try {
source = cu.getSource();
} catch (JavaModelException e) {
JavaPlugin.log(e);
// empty
source = new String();
}
Document document = new Document(source);
document.setInitialLineDelimiter(StubUtility.getLineDelimiterUsed(cu));
change = new DocumentChange(name, document);
} else {
CompilationUnitChange cuChange = new CompilationUnitChange(name, cu);
cuChange.setSaveMode(TextFileChange.LEAVE_DIRTY);
change = cuChange;
}
TextEdit rootEdit = new MultiTextEdit();
change.setEdit(rootEdit);
// initialize text change
IDocument document = change.getCurrentDocument(new NullProgressMonitor());
addEdits(document, rootEdit);
return change;
}
Aggregations