From 6809e814401e525a4c13cc8a44650cb0b063d086 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Mon, 28 Mar 2016 20:48:23 +0300 Subject: [PATCH] PY-18486 Don't auto close quotes that start docstring, so PythonEnterHandler could complete it --- .../python/editor/BaseQuoteHandler.java | 3 ++- ...leQuotesThenEnterInsertsDocstring.after.py | 7 +++++++ .../tripleQuotesThenEnterInsertsDocstring.py | 3 +++ .../com/jetbrains/python/PyEditingTest.java | 19 ++++++++++++------- 4 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 python/testData/editing/tripleQuotesThenEnterInsertsDocstring.after.py create mode 100644 python/testData/editing/tripleQuotesThenEnterInsertsDocstring.py diff --git a/python/src/com/jetbrains/python/editor/BaseQuoteHandler.java b/python/src/com/jetbrains/python/editor/BaseQuoteHandler.java index c5d14dfa8b53..79ededc37f70 100644 --- a/python/src/com/jetbrains/python/editor/BaseQuoteHandler.java +++ b/python/src/com/jetbrains/python/editor/BaseQuoteHandler.java @@ -22,6 +22,7 @@ import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; +import com.jetbrains.python.PyTokenTypes; import org.jetbrains.annotations.Nullable; import java.util.Arrays; @@ -34,7 +35,7 @@ public class BaseQuoteHandler extends SimpleTokenSetQuoteHandler implements Mult private final char[] ourAutoClosingChars; // we add auto-close quotes before these public BaseQuoteHandler(TokenSet tokenSet, char[] autoClosingChars) { - super(tokenSet); + super(TokenSet.andNot(tokenSet, TokenSet.create(PyTokenTypes.DOCSTRING))); ourAutoClosingChars = autoClosingChars; Arrays.sort(ourAutoClosingChars); } diff --git a/python/testData/editing/tripleQuotesThenEnterInsertsDocstring.after.py b/python/testData/editing/tripleQuotesThenEnterInsertsDocstring.after.py new file mode 100644 index 000000000000..be4b0ef75822 --- /dev/null +++ b/python/testData/editing/tripleQuotesThenEnterInsertsDocstring.after.py @@ -0,0 +1,7 @@ +def f(x): + """ + + :param x: + :return: + """ + return 42 \ No newline at end of file diff --git a/python/testData/editing/tripleQuotesThenEnterInsertsDocstring.py b/python/testData/editing/tripleQuotesThenEnterInsertsDocstring.py new file mode 100644 index 000000000000..1fbde342b8b5 --- /dev/null +++ b/python/testData/editing/tripleQuotesThenEnterInsertsDocstring.py @@ -0,0 +1,3 @@ +def f(x): + + return 42 \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyEditingTest.java b/python/testSrc/com/jetbrains/python/PyEditingTest.java index 22dc95ee7cbd..2c80434e11be 100644 --- a/python/testSrc/com/jetbrains/python/PyEditingTest.java +++ b/python/testSrc/com/jetbrains/python/PyEditingTest.java @@ -44,7 +44,7 @@ public class PyEditingTest extends PyTestCase { } public void testPairedQuotesInRawString() { // PY-263 - assertEquals("r''", doTestTyping("r", 1, '\'')); + assertEquals("x = r''", doTestTyping("x = r", 5, '\'')); } public void testQuotesInString() { // PY-5041 @@ -60,23 +60,23 @@ public class PyEditingTest extends PyTestCase { } public void testAutoClosingQuoteAtRBracket() { - assertEquals("'']", doTestTyping("]", 0, '\'')); + assertEquals("x = '']", doTestTyping("x = ]", 4, '\'')); } public void testAutoClosingQuoteAtRParen() { - assertEquals("'')", doTestTyping(")", 0, '\'')); + assertEquals("x = '')", doTestTyping("x = )", 4, '\'')); } public void testAutoClosingQuoteAtComma() { - assertEquals("'',", doTestTyping(",", 0, '\'')); + assertEquals("x = '',", doTestTyping("x = ,", 4, '\'')); } public void testAutoClosingQuoteAtSpace() { - assertEquals("'' ", doTestTyping(" ", 0, '\'')); + assertEquals("x = '' ", doTestTyping("x = ", 4, '\'')); } public void testAutoCloseTriple() { - assertEquals("''''''", doTestTyping("''", 2, '\'')); + assertEquals("x = ''''''", doTestTyping("x = ''", 6, '\'')); } public void testAutoRemoveTriple() { @@ -84,7 +84,7 @@ public class PyEditingTest extends PyTestCase { } public void testOvertypeFromInside() { - assertEquals("''", doTestTyping("''", 1, '\'')); + assertEquals("x = ''", doTestTyping("x = ''", 5, '\'')); } public void testGreedyBackspace() { // PY-254 @@ -213,6 +213,11 @@ public class PyEditingTest extends PyTestCase { }); } + // PY-18486 + public void testTripleQuotesThenEnterInsertsDocstring() { + doDocStringTypingTest("\"\"\"\n", DocStringFormat.REST); + } + public void testEnterDocStringStubInClass() { doDocStringTypingTest("\n", DocStringFormat.REST); }