diff --git a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlTagNameSynchronizer.java b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlTagNameSynchronizer.java index 1ca2bcf64986..753dac8d3971 100644 --- a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlTagNameSynchronizer.java +++ b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlTagNameSynchronizer.java @@ -152,6 +152,8 @@ public class XmlTagNameSynchronizer extends CommandAdapter implements Applicatio if (myState == State.APPLYING) return; final Document document = event.getDocument(); + final int offset = event.getOffset(); + final int oldLength = event.getOldLength(); if (myState == State.INITIAL) { final PsiFile file = myDocumentManager.getPsiFile(document); if (file == null) return; @@ -186,14 +188,17 @@ public class XmlTagNameSynchronizer extends CommandAdapter implements Applicatio myMarkers.add(Couple.of(leader, support)); } + if (!fitsInMarker(offset, oldLength)) { + clearMarkers(); + return; + } + myState = State.TRACKING; } if (myMarkers.isEmpty()) return; final CharSequence fragment = event.getNewFragment(); - final int offset = event.getOffset(); final int newLength = event.getNewLength(); - final int oldLength = event.getOldLength(); if (document.getUserData(XmlTagInsertHandler.ENFORCING_TAG) == Boolean.TRUE) { // xml completion inserts extra space after tag name to ensure correct parsing @@ -208,6 +213,14 @@ public class XmlTagNameSynchronizer extends CommandAdapter implements Applicatio } } + boolean fitsInMarker = fitsInMarker(offset, oldLength); + if (!fitsInMarker) { + clearMarkers(); + beforeDocumentChange(event); + } + } + + public boolean fitsInMarker(int offset, int oldLength) { boolean fitsInMarker = false; for (Couple leaderAndSupport : myMarkers) { final RangeMarker leader = leaderAndSupport.first; @@ -217,10 +230,7 @@ public class XmlTagNameSynchronizer extends CommandAdapter implements Applicatio } fitsInMarker |= offset >= leader.getStartOffset() && offset + oldLength <= leader.getEndOffset(); } - if (!fitsInMarker) { - clearMarkers(); - beforeDocumentChange(event); - } + return fitsInMarker; } public void clearMarkers() { diff --git a/xml/tests/src/com/intellij/codeInsight/completion/XmlSyncTagTest.java b/xml/tests/src/com/intellij/codeInsight/completion/XmlSyncTagTest.java index 88a36fc08631..ef3e9a34f7fc 100644 --- a/xml/tests/src/com/intellij/codeInsight/completion/XmlSyncTagTest.java +++ b/xml/tests/src/com/intellij/codeInsight/completion/XmlSyncTagTest.java @@ -21,6 +21,7 @@ import com.intellij.lang.injection.InjectedLanguageManager; import com.intellij.lang.injection.MultiHostInjector; import com.intellij.lang.injection.MultiHostRegistrar; import com.intellij.lang.xml.XMLLanguage; +import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.actionSystem.DocCommandGroupId; @@ -99,6 +100,12 @@ public class XmlSyncTagTest extends LightPlatformCodeInsightFixtureTestCase { ""); } + public void testUndo() { + doTest(">", "v", ""); + myFixture.performEditorAction(IdeActions.ACTION_UNDO); + myFixture.checkResult("
"); + } + public void testInjection() { final MultiHostInjector injector = new MultiHostInjector() { @Override