From d881375cffe6251d22746c0141f159380478ab2f Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Thu, 7 Mar 2019 17:25:05 +0300 Subject: [PATCH] IDEA-207657 Quick fix to escaping "&" breaks inside injected languages inside XML --- xml/tests/intellij.xml.tests.iml | 3 ++ .../daemon/quickFix/XmlQuickFixTest.java | 28 +++++++++++++++++++ .../analysis/XmlErrorQuickFixProvider.java | 8 +++++- 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 xml/tests/src/com/intellij/codeInsight/daemon/quickFix/XmlQuickFixTest.java diff --git a/xml/tests/intellij.xml.tests.iml b/xml/tests/intellij.xml.tests.iml index 5ae47baac647..a5a0aba550a7 100644 --- a/xml/tests/intellij.xml.tests.iml +++ b/xml/tests/intellij.xml.tests.iml @@ -21,6 +21,9 @@ + + + diff --git a/xml/tests/src/com/intellij/codeInsight/daemon/quickFix/XmlQuickFixTest.java b/xml/tests/src/com/intellij/codeInsight/daemon/quickFix/XmlQuickFixTest.java new file mode 100644 index 000000000000..91838e2ee9ba --- /dev/null +++ b/xml/tests/src/com/intellij/codeInsight/daemon/quickFix/XmlQuickFixTest.java @@ -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, "\"/>"); + 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(""); + } +} diff --git a/xml/xml-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlErrorQuickFixProvider.java b/xml/xml-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlErrorQuickFixProvider.java index db924dc80cb4..55fce859f367 100644 --- a/xml/xml-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlErrorQuickFixProvider.java +++ b/xml/xml-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlErrorQuickFixProvider.java @@ -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