diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java index 0d170e75a9b0..7a8450e2ad35 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java @@ -58,7 +58,8 @@ import org.jetbrains.annotations.TestOnly; import javax.swing.*; import java.awt.*; -import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Set; @@ -74,8 +75,7 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { private final PsiFile myNewFile; private final LightVirtualFile myNewVirtualFile; private final Document myNewDocument; - private final Map> myMarkers = - new LinkedHashMap>(); + private final List> myMarkers = new LinkedList>(); private EditorWindow mySplittedWindow; private boolean myReleased; @@ -220,22 +220,23 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { public void initMarkers(final Place shreds) { final SmartPointerManager smartPointerManager = SmartPointerManager.getInstance(myProject); for (PsiLanguageInjectionHost.Shred shred : shreds) { - final RangeMarker rangeMarker = myNewDocument - .createRangeMarker( - shred.getRange().getStartOffset() + shred.getPrefix().length(), shred.getRange().getEndOffset() - shred.getSuffix().length()); + final RangeMarker rangeMarker = myNewDocument.createRangeMarker( + shred.getRange().getStartOffset() + shred.getPrefix().length(), + shred.getRange().getEndOffset() - shred.getSuffix().length()); final TextRange rangeInsideHost = shred.getRangeInsideHost(); final RangeMarker origMarker = myOrigDocument.createRangeMarker(rangeInsideHost.shiftRight(shred.getHost().getTextRange().getStartOffset())); - myMarkers.put(smartPointerManager.createSmartPsiElementPointer(shred.getHost()), Pair.create(origMarker, rangeMarker)); + SmartPsiElementPointer elementPointer = smartPointerManager.createSmartPsiElementPointer(shred.getHost()); + myMarkers.add(Trinity.create(origMarker, rangeMarker, elementPointer)); } - for (Pair markers : myMarkers.values()) { + for (Trinity markers : myMarkers) { markers.first.setGreedyToLeft(true); markers.second.setGreedyToLeft(true); markers.first.setGreedyToRight(true); markers.second.setGreedyToRight(true); } int curOffset = 0; - for (Pair markerPair : myMarkers.values()) { + for (Trinity markerPair : myMarkers) { final RangeMarker marker = markerPair.second; final int start = marker.getStartOffset(); final int end = marker.getEndOffset(); @@ -275,27 +276,28 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { private void commitToOriginalInner() { final String text = myNewDocument.getText(); - final Map>>> map = ContainerUtil - .classify(myMarkers.entrySet().iterator(), - new Convertor>, PsiLanguageInjectionHost>() { + final Map>> map = ContainerUtil + .classify(myMarkers.iterator(), + new Convertor, PsiLanguageInjectionHost>() { @Override - public PsiLanguageInjectionHost convert(final Map.Entry> o) { - final PsiElement element = o.getKey().getElement(); + public PsiLanguageInjectionHost convert(final Trinity o) { + final PsiElement element = o.third.getElement(); return (PsiLanguageInjectionHost)element; } }); - PsiDocumentManager.getInstance(myProject).commitDocument(myOrigDocument); + PsiDocumentManager documentManager = PsiDocumentManager.getInstance(myProject); + documentManager.commitDocument(myOrigDocument); // commit here and after each manipulator update int localInsideFileCursor = 0; for (PsiLanguageInjectionHost host : map.keySet()) { if (host == null) continue; - final String hostText = host.getText(); + String hostText = host.getText(); ProperTextRange insideHost = null; - final StringBuilder sb = new StringBuilder(); - for (Map.Entry> entry : map.get(host)) { - final RangeMarker origMarker = entry.getValue().first; - final int hostOffset = host.getTextRange().getStartOffset(); + StringBuilder sb = new StringBuilder(); + for (Trinity entry : map.get(host)) { + RangeMarker origMarker = entry.first; + int hostOffset = host.getTextRange().getStartOffset(); ProperTextRange localInsideHost = new ProperTextRange(origMarker.getStartOffset() - hostOffset, origMarker.getEndOffset() - hostOffset); - RangeMarker rangeMarker = entry.getValue().second; + RangeMarker rangeMarker = entry.second; ProperTextRange localInsideFile = new ProperTextRange(Math.max(localInsideFileCursor, rangeMarker.getStartOffset()), rangeMarker.getEndOffset()); if (insideHost != null) { //append unchanged inter-markers fragment @@ -307,6 +309,7 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { } assert insideHost != null; ElementManipulators.getManipulator(host).handleContentChange(host, insideHost, sb.toString()); + documentManager.commitDocument(myOrigDocument); } }