From 4f9a806b0618eb48829f050c1f1bb62bf68704c6 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 14 Jan 2010 14:42:52 +0300 Subject: [PATCH] more fixes for unclosed string literal highlighting --- .../python/validation/StringConstantAnnotator.java | 13 ++++++++++++- .../malformedStringTripleQuoteUnterminated.py | 3 +++ .../highlighting/stringMixedSeparatorsOK.py | 4 ++++ .../jetbrains/python/PythonHighlightingTest.java | 4 ++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 python/testData/highlighting/malformedStringTripleQuoteUnterminated.py diff --git a/python/src/com/jetbrains/python/validation/StringConstantAnnotator.java b/python/src/com/jetbrains/python/validation/StringConstantAnnotator.java index 989a3fc2f105..1e57f5e407a3 100644 --- a/python/src/com/jetbrains/python/validation/StringConstantAnnotator.java +++ b/python/src/com/jetbrains/python/validation/StringConstantAnnotator.java @@ -1,5 +1,6 @@ package com.jetbrains.python.validation; +import com.intellij.openapi.util.text.StringUtil; import com.jetbrains.python.psi.PyStringLiteralExpression; /** @@ -9,6 +10,8 @@ import com.jetbrains.python.psi.PyStringLiteralExpression; */ public class StringConstantAnnotator extends PyAnnotator { public static final String MISSING_Q = "Missing closing quote"; + private static final String TRIPLE_QUOTES = "\"\"\""; + //public static final String PREMATURE_Q = "Premature closing quote"; public void visitPyStringLiteralExpression(final PyStringLiteralExpression node) { String s = node.getText(); @@ -21,6 +24,14 @@ public class StringConstantAnnotator extends PyAnnotator { if ((first_quote == 'u') || (first_quote == 'U')) index += 1; first_quote = s.charAt(index); if ((first_quote == 'r') || (first_quote == 'R')) index += 1; + + if (StringUtil.startsWith(s.substring(index, s.length()), TRIPLE_QUOTES)) { + if (s.length() < 6 + index || !s.endsWith(TRIPLE_QUOTES)) { + getHolder().createErrorAnnotation(node, "Missing closing triple quotes"); + } + return; + } + first_quote = s.charAt(index); // s can't begin with a non-quote, else parser would not say it's a string index += 1; @@ -38,7 +49,7 @@ public class StringConstantAnnotator extends PyAnnotator { else if (c == '\'' || c == '\"') { if (first_quote == '\0') first_quote = c; - else + else if (c == first_quote) first_quote = '\0'; } diff --git a/python/testData/highlighting/malformedStringTripleQuoteUnterminated.py b/python/testData/highlighting/malformedStringTripleQuoteUnterminated.py new file mode 100644 index 000000000000..7f0a79c0ece0 --- /dev/null +++ b/python/testData/highlighting/malformedStringTripleQuoteUnterminated.py @@ -0,0 +1,3 @@ +a = 1 # to make the text below non-doc +"""Hello World" + diff --git a/python/testData/highlighting/stringMixedSeparatorsOK.py b/python/testData/highlighting/stringMixedSeparatorsOK.py index 2fe542dcc64b..3d473c4fc2e5 100644 --- a/python/testData/highlighting/stringMixedSeparatorsOK.py +++ b/python/testData/highlighting/stringMixedSeparatorsOK.py @@ -1,2 +1,6 @@ print "Hello"\ 'World' + +print 'Hello "World" ' + +"""Foo "bar """ diff --git a/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java b/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java index 045a98d44b50..80c27004b0b0 100644 --- a/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java +++ b/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java @@ -90,6 +90,10 @@ public class PythonHighlightingTest extends PyLightFixtureTestCase { doTest(); } + public void testMalformedStringTripleQuoteUnterminated() throws Exception { + doTest(); + } + public void testYieldInNestedFunction() throws Exception { // highlight func declaration first, lest we get an "Extra fragment highlighted" error. EditorColorsManager manager = EditorColorsManager.getInstance();