diff --git a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlTagNameSynchronizer.java b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlTagNameSynchronizer.java index 8d1e3638dc40..1ca2bcf64986 100644 --- a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlTagNameSynchronizer.java +++ b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlTagNameSynchronizer.java @@ -43,6 +43,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.util.SmartList; import com.intellij.xml.util.XmlUtil; import org.jetbrains.annotations.NotNull; @@ -279,11 +280,12 @@ public class XmlTagNameSynchronizer extends CommandAdapter implements Applicatio } private static RangeMarker findSupport(RangeMarker leader, PsiFile file, Document document) { - final PsiElement element = file.findElementAt(leader.getStartOffset()); + final PsiElement element = InjectedLanguageUtil.findElementAtNoCommit(file, leader.getStartOffset()); PsiElement support = RenameTagBeginOrEndIntentionAction.findOtherSide(element, false); support = support == null || element == support ? RenameTagBeginOrEndIntentionAction.findOtherSide(element, true) : support; + int diff = leader.getStartOffset() - element.getTextRange().getStartOffset(); final TextRange range = support != null ? support.getTextRange() : null; - return range != null ? document.createRangeMarker(range.getStartOffset(), range.getEndOffset(), true) : null; + return range != null ? document.createRangeMarker(range.getStartOffset() + diff, range.getEndOffset() + diff, true) : null; } } } diff --git a/xml/tests/src/com/intellij/codeInsight/completion/XmlSyncTagTest.java b/xml/tests/src/com/intellij/codeInsight/completion/XmlSyncTagTest.java index 5c12e528b5a3..88a36fc08631 100644 --- a/xml/tests/src/com/intellij/codeInsight/completion/XmlSyncTagTest.java +++ b/xml/tests/src/com/intellij/codeInsight/completion/XmlSyncTagTest.java @@ -17,10 +17,22 @@ package com.intellij.codeInsight.completion; import com.intellij.application.options.editor.WebEditorOptions; import com.intellij.ide.highlighter.XmlFileType; +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.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.actionSystem.DocCommandGroupId; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiLanguageInjectionHost; +import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; /** * @author Dennis.Ushakov @@ -87,10 +99,36 @@ public class XmlSyncTagTest extends LightPlatformCodeInsightFixtureTestCase { ""); } + public void testInjection() { + final MultiHostInjector injector = new MultiHostInjector() { + @Override + public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) { + if (context instanceof XmlAttributeValue) { + registrar.startInjecting(XMLLanguage.INSTANCE) + .addPlace(null, null, (PsiLanguageInjectionHost)context, new TextRange(1, context.getTextLength() - 1)) + .doneInjecting(); + } + } + + @NotNull + @Override + public List> elementsToInjectIn() { + return Collections.singletonList(XmlAttributeValue.class); + } + }; + InjectedLanguageManager.getInstance(getProject()).registerMultiHostInjector(injector); + try { + doTest("
", "v", "
"); + } finally { + InjectedLanguageManager.getInstance(getProject()).unregisterMultiHostInjector(injector); + } + } + @Override protected void setUp() throws Exception { super.setUp(); WebEditorOptions.getInstance().setSyncTagEditing(true); + myFixture.setCaresAboutInjection(false); } @Override