IDEA-207657 Quick fix to escaping "&" breaks inside injected languages inside XML

This commit is contained in:
Dmitry Avdeev
2019-03-07 17:31:54 +03:00
parent 857e6cbf4c
commit d881375cff
3 changed files with 38 additions and 1 deletions
+3
View File
@@ -21,6 +21,9 @@
<orderEntry type="module" module-name="intellij.platform.tests" scope="TEST" />
<orderEntry type="library" scope="TEST" name="xml-resolver" level="project" />
<orderEntry type="library" name="NanoXML" level="project" />
<orderEntry type="module" module-name="intellij.platform.langInjection" scope="TEST" />
<orderEntry type="module" module-name="intellij.xml.langInjection" scope="RUNTIME" />
<orderEntry type="module" module-name="intellij.java.langInjection" />
</component>
<component name="copyright">
<Base>
@@ -0,0 +1,28 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.codeInsight.daemon.quickFix;
import com.intellij.codeInsight.daemon.XmlErrorMessages;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInsight.intention.impl.ShowIntentionActionsHandler;
import com.intellij.ide.highlighter.XmlFileType;
import com.intellij.openapi.fileTypes.PlainTextLanguage;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLanguageInjectionHost;
import com.intellij.psi.xml.XmlFile;
import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase;
import org.intellij.plugins.intelliLang.inject.LanguageInjectionSupport;
import org.intellij.plugins.intelliLang.inject.TemporaryPlacesRegistry;
public class XmlQuickFixTest extends LightPlatformCodeInsightFixtureTestCase {
public void testEscapeAmpersandInInjected() {
XmlFile file = (XmlFile)myFixture.configureByText(XmlFileType.INSTANCE, "<a b=\" &<caret>\"/>");
PsiElement element = file.getRootTag().getAttribute("b").getValueElement();
LanguageInjectionSupport support = TemporaryPlacesRegistry.getInstance(getProject()).getLanguageInjectionSupport();
assertTrue(support.addInjectionInPlace(PlainTextLanguage.INSTANCE, (PsiLanguageInjectionHost)element));
IntentionAction intention = myFixture.getAvailableIntention(XmlErrorMessages.message("escape.ampersand.quickfix"));
assertNotNull(intention);
ShowIntentionActionsHandler.chooseActionAndInvoke(file, myFixture.getEditor(), intention, "");
myFixture.checkResult("<a b=\" &amp;\"/>");
}
}
@@ -19,8 +19,11 @@ import com.intellij.codeInsight.daemon.XmlErrorMessages;
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiErrorElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
@@ -61,8 +64,11 @@ public class XmlErrorQuickFixProvider implements ErrorQuickFixProvider {
@Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file) {
PsiFile topLevelFile = InjectedLanguageManager.getInstance(project).getTopLevelFile(file);
Document document = PsiDocumentManager.getInstance(project).getDocument(topLevelFile);
assert document != null;
final int textOffset = element.getTextOffset();
editor.getDocument().replaceString(textOffset,textOffset + 1,AMP_ENTITY);
document.replaceString(textOffset, textOffset + 1, AMP_ENTITY);
}
@Override