From f26af18f7033837dcb3ca098b2d61c6877b0d158 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Thu, 30 Nov 2017 18:56:55 +0300 Subject: [PATCH] PY-27178 Parenthesised expression parsing doesn't hang at the end of file Normally, it shouldn't happen, since Python lexer is supposed to put the special STATEMENT_BREAK token right at the end of file, but apparently it may not be the case during editing of an injected fragment. --- .../src/com/jetbrains/python/parsing/ExpressionParsing.java | 3 ++- .../testData/editing/incompleteFunctionTypeComment.after.py | 2 ++ python/testData/editing/incompleteFunctionTypeComment.py | 2 ++ python/testSrc/com/jetbrains/python/PyEditingTest.java | 5 +++++ 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 python/testData/editing/incompleteFunctionTypeComment.after.py create mode 100644 python/testData/editing/incompleteFunctionTypeComment.py diff --git a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java index 82295f3a2ec0..840ee50100ef 100644 --- a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java +++ b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java @@ -305,7 +305,8 @@ public class ExpressionParsing extends Parsing { else { final PsiBuilder.Marker err = myBuilder.mark(); boolean empty = true; - while (myBuilder.getTokenType() != PyTokenTypes.RPAR && + while (!myBuilder.eof() && + myBuilder.getTokenType() != PyTokenTypes.RPAR && myBuilder.getTokenType() != PyTokenTypes.LINE_BREAK && myBuilder.getTokenType() != PyTokenTypes.STATEMENT_BREAK) { myBuilder.advanceLexer(); diff --git a/python/testData/editing/incompleteFunctionTypeComment.after.py b/python/testData/editing/incompleteFunctionTypeComment.after.py new file mode 100644 index 000000000000..9a8b67f50f3b --- /dev/null +++ b/python/testData/editing/incompleteFunctionTypeComment.after.py @@ -0,0 +1,2 @@ +def foo(bar): + # type: (foo. \ No newline at end of file diff --git a/python/testData/editing/incompleteFunctionTypeComment.py b/python/testData/editing/incompleteFunctionTypeComment.py new file mode 100644 index 000000000000..61e719eda496 --- /dev/null +++ b/python/testData/editing/incompleteFunctionTypeComment.py @@ -0,0 +1,2 @@ +def foo(bar): + # type: (foo \ 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 979e634efe2b..d7efb2165734 100644 --- a/python/testSrc/com/jetbrains/python/PyEditingTest.java +++ b/python/testSrc/com/jetbrains/python/PyEditingTest.java @@ -591,4 +591,9 @@ public class PyEditingTest extends PyTestCase { " return bar, 'so' \\\n" + " 'me'"); } + + // PY-27178 + public void testIncompleteFunctionTypeComment() { + doTypingTest('.'); + } }