From ea847f4a4d68bbfba10c461105aa21da85218a26 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 30 Dec 2010 15:31:03 +0300 Subject: [PATCH] Precedence of basic operations tested --- grammar/src/expressions.grm | 9 +- .../lang/parsing/JetExpressionParsing.java | 2 +- idea/testData/psi/Precedence.jet | 23 ++ idea/testData/psi/Precedence.txt | 282 ++++++++++++++++++ .../jetbrains/jet/parsing/JetParsingTest.java | 1 + 5 files changed, 313 insertions(+), 4 deletions(-) create mode 100644 idea/testData/psi/Precedence.jet create mode 100644 idea/testData/psi/Precedence.txt diff --git a/grammar/src/expressions.grm b/grammar/src/expressions.grm index 16eaacf272d..aa51044370b 100644 --- a/grammar/src/expressions.grm +++ b/grammar/src/expressions.grm @@ -27,6 +27,7 @@ arrowTupleExpression : match ("->" match)* ; +// ATTENTION match : conjunction ("match" "{" matchEntry+ "}")* ; @@ -55,8 +56,9 @@ elvisOperation : infixFunctionCall ("?:" infixFunctionCall)* ; +// ATTENTION infixFunctionCall - : rangeExpression (SimpleName rangeExpression)* + : rangeExpression (SimpleName (typeParameters | rangeExpression))* ; rangeExpression @@ -165,7 +167,8 @@ prefixUnaryOperation postfixUnaryOperation : "++" : "--" - : valueArguments + : typeArguments? valueArguments + : typeArguments : arrayAccess ; @@ -187,7 +190,7 @@ valueArguments ; infixFunctionCall - : expression SimpleName typeArguments expression? + : expression SimpleName typeArguments : expression 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 e72e86402cd..4cd5a1cc3d8 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -57,8 +57,8 @@ public class JetExpressionParsing extends AbstractJetParsing { DISJUNCTION(OROR), MATCH(MATCH_KEYWORD), // TODO: don't build a binary tree, build a tuple - ASSIGNMENT(EQ, PLUSEQ, MINUSEQ, MULTEQ, DIVEQ, PERCEQ), ARROW(JetTokens.ARROW), + ASSIGNMENT(EQ, PLUSEQ, MINUSEQ, MULTEQ, DIVEQ, PERCEQ), ; static { diff --git a/idea/testData/psi/Precedence.jet b/idea/testData/psi/Precedence.jet new file mode 100644 index 00000000000..50d46e09699 --- /dev/null +++ b/idea/testData/psi/Precedence.jet @@ -0,0 +1,23 @@ +fun foo() { + a + b + a + b * c + a + (b * c) + a + b > c * c + a + b in c * d + a.b + a + b.c + a.b + c + a.b++ + --a.b++ + --a * b + a+b..b-1 + 1..2 foo 2..3 + 1 foo 2 ?: 1 bar 3 + a ?: b in b?: c + a : b < b : c + a < b == b > c + a != b && c + a || b && c + a = b -> c + a = b || c +} \ No newline at end of file diff --git a/idea/testData/psi/Precedence.txt b/idea/testData/psi/Precedence.txt new file mode 100644 index 00000000000..80463a43b7f --- /dev/null +++ b/idea/testData/psi/Precedence.txt @@ -0,0 +1,282 @@ +JetFile: Precedence.jet + NAMESPACE + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + TYPE_PARAMETER_LIST + + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(MUL)('*') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + TUPLE + PsiElement(LPAR)('(') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(MUL)('*') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('c') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(GT)('>') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace(' ') + PsiElement(MUL)('*') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(in)('in') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace(' ') + PsiElement(MUL)('*') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('d') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('b') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace('\n ') + POSTFIX_EXPRESSION + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('b') + PsiElement(PLUSPLUS)('++') + PsiWhiteSpace('\n ') + PREFIX_EXPRESSION + PsiElement(MINUSMINUS)('--') + POSTFIX_EXPRESSION + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiElement(DOT)('.') + PsiElement(IDENTIFIER)('b') + PsiElement(PLUSPLUS)('++') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + PREFIX_EXPRESSION + PsiElement(MINUSMINUS)('--') + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(MUL)('*') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiElement(PLUS)('+') + PsiElement(IDENTIFIER)('b') + PsiElement(RANGE)('..') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('b') + PsiElement(MINUS)('-') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + BINARY_EXPRESSION + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiElement(RANGE)('..') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('2') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('2') + PsiElement(RANGE)('..') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('3') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + BINARY_EXPRESSION + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('2') + PsiWhiteSpace(' ') + PsiElement(ELVIS)('?:') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('bar') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('3') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(ELVIS)('?:') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(in)('in') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('b') + PsiElement(ELVIS)('?:') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(LT)('<') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(LT)('<') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(EQEQ)('==') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(GT)('>') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(EXCLEQ)('!=') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(ANDAND)('&&') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(OROR)('||') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(ANDAND)('&&') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(ARROW)('->') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + PsiElement(IDENTIFIER)('b') + PsiWhiteSpace(' ') + PsiElement(OROR)('||') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('c') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/parsing/JetParsingTest.java b/idea/tests/org/jetbrains/jet/parsing/JetParsingTest.java index 1055f6da5ee..e9cd617bc8c 100644 --- a/idea/tests/org/jetbrains/jet/parsing/JetParsingTest.java +++ b/idea/tests/org/jetbrains/jet/parsing/JetParsingTest.java @@ -55,6 +55,7 @@ public class JetParsingTest extends ParsingTestCase { public void testNamespaceBlock_ERR() throws Exception {doTest(true);} public void testNamespaceBlock() throws Exception {doTest(true);} public void testNewlinesInParentheses() throws Exception {doTest(true);} + public void testPrecedence() throws Exception {doTest(true);} public void testProperties() throws Exception {doTest(true);} public void testProperties_ERR() throws Exception {doTest(true);} public void testSimpleClassMembers() throws Exception {doTest(true);}