From 3e87e62625e22582ff217f68e4ed0be2dc484487 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Thu, 24 Mar 2016 13:07:09 +0300 Subject: [PATCH] PY-18881 Recognize flag "X" in functions of re module to inject verbose regex fragments --- .../regexp/PythonRegexpInjector.java | 3 ++- .../com/jetbrains/python/PyRegexpTest.java | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/python/src/com/jetbrains/python/codeInsight/regexp/PythonRegexpInjector.java b/python/src/com/jetbrains/python/codeInsight/regexp/PythonRegexpInjector.java index 8fc918a79a07..10147bc798ac 100644 --- a/python/src/com/jetbrains/python/codeInsight/regexp/PythonRegexpInjector.java +++ b/python/src/com/jetbrains/python/codeInsight/regexp/PythonRegexpInjector.java @@ -134,7 +134,8 @@ public class PythonRegexpInjector implements MultiHostInjector { return isVerbose(keywordArgument.getValueExpression()); } if (expr instanceof PyReferenceExpression) { - return "VERBOSE".equals(((PyReferenceExpression)expr).getReferencedName()); + final String flagName = ((PyReferenceExpression)expr).getReferencedName(); + return "VERBOSE".equals(flagName) || "X".equals(flagName); } if (expr instanceof PyBinaryExpression) { return isVerbose(((PyBinaryExpression)expr).getLeftExpression()) || isVerbose(((PyBinaryExpression)expr).getRightExpression()); diff --git a/python/testSrc/com/jetbrains/python/PyRegexpTest.java b/python/testSrc/com/jetbrains/python/PyRegexpTest.java index 0ca3d795bcb5..8c8167987225 100644 --- a/python/testSrc/com/jetbrains/python/PyRegexpTest.java +++ b/python/testSrc/com/jetbrains/python/PyRegexpTest.java @@ -26,6 +26,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLanguageInjectionHost; import com.jetbrains.python.codeInsight.regexp.PythonRegexpParserDefinition; +import com.jetbrains.python.codeInsight.regexp.PythonVerboseRegexpLanguage; import com.jetbrains.python.codeInsight.regexp.PythonVerboseRegexpParserDefinition; import com.jetbrains.python.fixtures.PyLexerTestCase; import com.jetbrains.python.fixtures.PyTestCase; @@ -158,7 +159,20 @@ public class PyRegexpTest extends PyTestCase { "(foomissing_valuebaz$)"); } - private void doTestInjectedText(@NotNull String text, @NotNull String expected) { + // PY-18881 + public void testVerboseSyntaxWithShortFlag() { + final PsiElement element = + doTestInjectedText("import re\n" + + "\n" + + "re.search(\"\"\"\n" + + ".* # comment\n" + + "\"\"\", re.I | re.M | re.X)", + "\n.* # comment\n"); + assertEquals(element.getLanguage(), PythonVerboseRegexpLanguage.INSTANCE); + } + + @NotNull + private PsiElement doTestInjectedText(@NotNull String text, @NotNull String expected) { myFixture.configureByText(PythonFileType.INSTANCE, text); final InjectedLanguageManager languageManager = InjectedLanguageManager.getInstance(myFixture.getProject()); final PsiLanguageInjectionHost host = languageManager.getInjectionHost(getElementAtCaret()); @@ -168,6 +182,7 @@ public class PyRegexpTest extends PyTestCase { assertFalse(files.isEmpty()); final PsiElement injected = files.get(0).getFirst(); assertEquals(expected, injected.getText()); + return injected; } @NotNull