From 83bc0ffcd412276f3bb5470ff8fd54f010419f5e Mon Sep 17 00:00:00 2001 From: Thomas Schulz Date: Tue, 6 Aug 2019 19:30:23 +0200 Subject: [PATCH 1/2] Overwrite XML injection with plain text for Console output methods --- .../lang/ParameterLanguageInjector.java | 14 ++++++++++++++ src/main/resources/META-INF/plugin.xml | 2 +- .../tests/lang/ParameterLanguageInjectorTest.java | 10 ++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/lang/ParameterLanguageInjector.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/lang/ParameterLanguageInjector.java index 697ff74bd..76459337d 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/lang/ParameterLanguageInjector.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/lang/ParameterLanguageInjector.java @@ -40,17 +40,27 @@ public class ParameterLanguageInjector implements MultiHostInjector { new MethodMatcher.CallToSignature("\\Doctrine\\ORM\\Query", "setDQL"), }; + private static final MethodMatcher.CallToSignature[] RESET_INJECTION_SIGNATURES = { + new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Output\\OutputInterface", "write"), + new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Output\\OutputInterface", "writeln"), + new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Formatter\\OutputFormatter", "escape"), + new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Formatter\\OutputFormatter", "escapeTrailingBackslash"), + new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface", "format"), + }; + private final MethodLanguageInjection[] LANGUAGE_INJECTIONS = { new MethodLanguageInjection(LANGUAGE_ID_CSS, "@media all { ", " }", CSS_SELECTOR_SIGNATURES), new MethodLanguageInjection(LANGUAGE_ID_XPATH, null, null, XPATH_SIGNATURES), new MethodLanguageInjection(LANGUAGE_ID_JSON, null, null, JSON_SIGNATURES), new MethodLanguageInjection(LANGUAGE_ID_DQL, null, null, DQL_SIGNATURES), + new MethodLanguageInjection(LANGUAGE_ID_TEXT, null, null, RESET_INJECTION_SIGNATURES), }; public static final String LANGUAGE_ID_CSS = "CSS"; public static final String LANGUAGE_ID_XPATH = "XPath"; public static final String LANGUAGE_ID_JSON = "JSON"; public static final String LANGUAGE_ID_DQL = "DQL"; + public static final String LANGUAGE_ID_TEXT = "TEXT"; private static final String DQL_VARIABLE_NAME = "dql"; @@ -97,6 +107,10 @@ public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull // JsonResponse::fromJsonString('...') if (parent instanceof MethodReference) { if (PhpElementsUtil.isMethodReferenceInstanceOf((MethodReference) parent, languageInjection.getSignatures())) { + // Only "overwrite" language injection to "TEXT" when XML-like characters in literal + if (LANGUAGE_ID_TEXT.equals(language.getID()) && !expr.getContents().contains("<")) { + return; + } injectLanguage(registrar, expr, language, languageInjection); return; } diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 81bf5d969..49f9f7ae4 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -239,7 +239,7 @@ - + \");", LANGUAGE_ID_DQL); } + public void testTextLanguageInjections() { + String base = "write('foo');", LANGUAGE_ID_TEXT); + + String base2 = "writeln('foo');", LANGUAGE_ID_TEXT); + + assertInjectedLangAtCaret(PhpFileType.INSTANCE, "\\Symfony\\Component\\Console\\Formatter\\OutputFormatter::escape('foo');", LANGUAGE_ID_TEXT); + } + private void assertInjectedLangAtCaret(LanguageFileType fileType, String configureByText, String lang) { myFixture.configureByText(fileType, configureByText); injectionTestFixture.assertInjectedLangAtCaret(lang); From 547eea78c037a9b22e94315be5fe91c048ab20c2 Mon Sep 17 00:00:00 2001 From: Thomas Schulz Date: Thu, 8 Aug 2019 00:02:57 +0200 Subject: [PATCH 2/2] Overwrite XML injection with plain text for Console output methods --- .../idea/symfony2plugin/lang/ParameterLanguageInjector.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/lang/ParameterLanguageInjector.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/lang/ParameterLanguageInjector.java index 76459337d..27a464fba 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/lang/ParameterLanguageInjector.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/lang/ParameterLanguageInjector.java @@ -43,6 +43,8 @@ public class ParameterLanguageInjector implements MultiHostInjector { private static final MethodMatcher.CallToSignature[] RESET_INJECTION_SIGNATURES = { new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Output\\OutputInterface", "write"), new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Output\\OutputInterface", "writeln"), + new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Output\\Output", "write"), + new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Output\\Output", "writeln"), new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Formatter\\OutputFormatter", "escape"), new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Formatter\\OutputFormatter", "escapeTrailingBackslash"), new MethodMatcher.CallToSignature("\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface", "format"),