From 06a70a8a402e1700361c9d976735233c909958ff Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 12 Jan 2011 19:17:27 +0300 Subject: [PATCH] Lables: break and continue accept only string literals --- grammar/src/expressions.grm | 9 +++++++-- .../jet/lang/parsing/JetExpressionParsing.java | 11 ++++++++--- idea/testData/psi/ControlStructures.jet | 13 +++++++------ idea/testData/psi/SimpleExpressions.jet | 12 ++++++------ 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/grammar/src/expressions.grm b/grammar/src/expressions.grm index 032e0d96885..6a71411e007 100644 --- a/grammar/src/expressions.grm +++ b/grammar/src/expressions.grm @@ -191,11 +191,16 @@ infixFunctionCall jump : "throw" expression : "return" expression? - : "continue" SimpleName - : "break" SimpleName + : "continue" stringLiteral? + : "break" stringLiteral? // yield ? ; +stringLiteral + : StringWithTemplates + : NoEscapeString + ; + tupleLiteral // Ambiguity when after a SimpleName (infix call). In this case (e) is treated as an expression in parentheses // to put a tuple, write write ((e)) : "(" ((SimpleName "=")? expression){","} ")" diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index 9cc7853d63c..9e6d92075da 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -957,8 +957,13 @@ public class JetExpressionParsing extends AbstractJetParsing { } /* - * : "continue" SimpleName - * : "break" SimpleName + * : "continue" stringLiteral? + * : "break" stringLiteral? + * + * stringLiteral + * : StringWithTemplates + * : NoEscapeString + * ; */ private void parseJump(JetNodeType type) { assert _at(BREAK_KEYWORD) || _at(CONTINUE_KEYWORD); @@ -967,7 +972,7 @@ public class JetExpressionParsing extends AbstractJetParsing { advance(); // BREAK_KEYWORD or CONTINUE_KEYWORD - if (!eol() && at(IDENTIFIER)) advance(); // IDENTIFIER + if (!eol() && (at(RAW_STRING_LITERAL) || at(STRING_LITERAL))) advance(); // RAW_STRING_LITERAL or STRING_LITERAL marker.done(type); } diff --git a/idea/testData/psi/ControlStructures.jet b/idea/testData/psi/ControlStructures.jet index a9968194fec..093b2c10a6e 100644 --- a/idea/testData/psi/ControlStructures.jet +++ b/idea/testData/psi/ControlStructures.jet @@ -3,9 +3,9 @@ fun a( a : foo = throw new Foo, a : foo = return 10, a : foo = break, - a : foo = break la, + a : foo = break "la", a : foo = continue, - a : foo = continue la, + a : foo = continue "la", a : foo = if (10) foo else bar, a : foo = if (10) foo ) { @@ -13,11 +13,11 @@ fun a( return 10 break - la - break la + "la" + break "la" continue - la - continue la + "la" + continue "la" if (foo) if (foo) bar @@ -75,6 +75,7 @@ fun a( do { } while (false) +} fun foo() { for (a in b) diff --git a/idea/testData/psi/SimpleExpressions.jet b/idea/testData/psi/SimpleExpressions.jet index 79880205cf4..0cd377e6a62 100644 --- a/idea/testData/psi/SimpleExpressions.jet +++ b/idea/testData/psi/SimpleExpressions.jet @@ -27,9 +27,9 @@ fun a( a : foo = throw new Foo, a : foo = return 10, a : foo = break, - a : foo = break la, + a : foo = break "la", a : foo = continue, - a : foo = continue la, + a : foo = continue "la", a : foo = 10, a : foo = 10, a : foo = 10, @@ -39,9 +39,9 @@ fun a( return 10 break - la - break la + "la" + break "la" continue - la - continue la + "la" + continue "la" } \ No newline at end of file