From 6eb3a2205916939703ca32955a2e2404429281f2 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Sun, 9 Jan 2011 00:18:21 +0300 Subject: [PATCH] Distinguish between tuple and parenthesized expression --- idea/src/org/jetbrains/jet/JetNodeTypes.java | 1 + .../lang/parsing/JetExpressionParsing.java | 13 ++++++++--- .../lang/psi/JetParenthesizedExpression.java | 22 +++++++++++++++++++ .../jetbrains/jet/lang/psi/JetVisitor.java | 4 ++++ idea/testData/psi/ByCaluses.txt | 4 ++-- idea/testData/psi/FunctionCalls.txt | 8 +++---- idea/testData/psi/NewlinesInParentheses.txt | 6 ++--- idea/testData/psi/Precedence.txt | 18 +++++++-------- idea/testData/psi/SimpleExpressions.txt | 4 ++-- idea/testData/psi/examples/BitArith.txt | 4 ++-- .../psi/examples/collections/HashMap.txt | 4 ++-- .../examples/priorityqueues/BinaryHeap.txt | 6 ++--- .../testData/psi/examples/util/Comparison.txt | 2 +- 13 files changed, 65 insertions(+), 31 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetParenthesizedExpression.java diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java index 1fc119248d8..132df67e06a 100644 --- a/idea/src/org/jetbrains/jet/JetNodeTypes.java +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -72,6 +72,7 @@ public interface JetNodeTypes { JetNodeType LONG_CONSTANT = new JetNodeType("LONG_CONSTANT", JetConstantExpression.class); JetNodeType TUPLE = new JetNodeType("TUPLE", JetTupleExpression.class); + JetNodeType PARENTHESIZED = new JetNodeType("PARENTHESIZED", JetParenthesizedExpression.class); JetNodeType TYPEOF = new JetNodeType("TYPEOF", JetTypeofExpression.class); JetNodeType NEW = new JetNodeType("NEW", JetNewExpression.class); JetNodeType RETURN = new JetNodeType("RETURN", JetReturnExpression.class); diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index 1344126093b..6b27590edac 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -1032,13 +1032,20 @@ public class JetExpressionParsing extends AbstractJetParsing { myBuilder.disableNewlines(); advance(); // LPAR - + int commaPassed = 0; if (!at(RPAR)) { while (true) { - while (at(COMMA)) errorAndAdvance("Expecting a tuple entry (expression)"); + while (at(COMMA)) { + commaPassed++; + errorAndAdvance("Expecting a tuple entry (expression)"); + } + parseExpression(); + if (!at(COMMA)) break; advance(); // COMMA + commaPassed++; + if (at(RPAR)) { error("Expecting a tuple entry (expression)"); break; @@ -1049,7 +1056,7 @@ public class JetExpressionParsing extends AbstractJetParsing { expect(RPAR, "Expecting ')'"); myBuilder.restoreNewlinesState(); - mark.done(TUPLE); + mark.done(commaPassed > 0 ? TUPLE : PARENTHESIZED); } /* diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetParenthesizedExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetParenthesizedExpression.java new file mode 100644 index 00000000000..4a1703c3ae9 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetParenthesizedExpression.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * @author max + */ +public class JetParenthesizedExpression extends JetExpression { + public JetParenthesizedExpression(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(JetVisitor visitor) { + visitor.visitParenthesizedExpression(this); + } + + public JetExpression getExpression() { + return findChildByClass(JetExpression.class); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java index 72715ccd0d3..3cf2a5ae96d 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java @@ -261,4 +261,8 @@ public class JetVisitor extends PsiElementVisitor { public void visitThisExpression(JetThisExpression expression) { visitExpression(expression); } + + public void visitParenthesizedExpression(JetParenthesizedExpression expression) { + visitExpression(expression); + } } diff --git a/idea/testData/psi/ByCaluses.txt b/idea/testData/psi/ByCaluses.txt index 9d3455e75b3..e9adbb677f5 100644 --- a/idea/testData/psi/ByCaluses.txt +++ b/idea/testData/psi/ByCaluses.txt @@ -103,7 +103,7 @@ JetFile: ByCaluses.jet PsiWhiteSpace(' ') PsiElement(by)('by') PsiWhiteSpace(' ') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('a') @@ -141,7 +141,7 @@ JetFile: ByCaluses.jet PsiWhiteSpace(' ') PsiElement(by)('by') PsiWhiteSpace(' ') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') CALL_EXPRESSION REFERENCE_EXPRESSION diff --git a/idea/testData/psi/FunctionCalls.txt b/idea/testData/psi/FunctionCalls.txt index e589fa148f0..b1f82086d6e 100644 --- a/idea/testData/psi/FunctionCalls.txt +++ b/idea/testData/psi/FunctionCalls.txt @@ -49,7 +49,7 @@ JetFile: FunctionCalls.jet PsiElement(IDENTIFIER)('foo') PsiElement(GT)('>') PsiWhiteSpace('\n ') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('a') @@ -251,7 +251,7 @@ JetFile: FunctionCalls.jet REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('b') PsiElement(GT)('>') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('a') @@ -273,7 +273,7 @@ JetFile: FunctionCalls.jet PsiElement(COMMA)(',') PsiWhiteSpace(' ') VALUE_ARGUMENT - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION INTEGER_CONSTANT @@ -291,7 +291,7 @@ JetFile: FunctionCalls.jet REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('b') PsiElement(GT)('>') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('a') diff --git a/idea/testData/psi/NewlinesInParentheses.txt b/idea/testData/psi/NewlinesInParentheses.txt index 706eb3a1b87..80124ca7028 100644 --- a/idea/testData/psi/NewlinesInParentheses.txt +++ b/idea/testData/psi/NewlinesInParentheses.txt @@ -68,7 +68,7 @@ JetFile: NewlinesInParentheses.jet PsiWhiteSpace(' ') PsiElement(EQ)('=') PsiWhiteSpace(' ') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION REFERENCE_EXPRESSION @@ -87,7 +87,7 @@ JetFile: NewlinesInParentheses.jet PsiWhiteSpace(' ') PsiElement(EQ)('=') PsiWhiteSpace(' ') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') FUNCTION_LITERAL PsiElement(LBRACE)('{') @@ -110,7 +110,7 @@ JetFile: NewlinesInParentheses.jet PsiWhiteSpace(' ') PsiElement(EQ)('=') PsiWhiteSpace(' ') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION FUNCTION_LITERAL diff --git a/idea/testData/psi/Precedence.txt b/idea/testData/psi/Precedence.txt index 22e2861baea..176aa5a26bb 100644 --- a/idea/testData/psi/Precedence.txt +++ b/idea/testData/psi/Precedence.txt @@ -104,7 +104,7 @@ JetFile: Precedence.jet REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('b') PsiElement(GT)('>') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('x') @@ -126,7 +126,7 @@ JetFile: Precedence.jet PsiElement(COMMA)(',') PsiWhiteSpace(' ') VALUE_ARGUMENT - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION REFERENCE_EXPRESSION @@ -144,7 +144,7 @@ JetFile: Precedence.jet REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('b') PsiElement(GT)('>') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('x') @@ -166,13 +166,13 @@ JetFile: Precedence.jet PsiElement(COMMA)(',') PsiWhiteSpace(' ') VALUE_ARGUMENT - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('b') PsiElement(GT)('>') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('x') @@ -214,7 +214,7 @@ JetFile: Precedence.jet VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') VALUE_ARGUMENT - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION REFERENCE_EXPRESSION @@ -230,7 +230,7 @@ JetFile: Precedence.jet REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('b') PsiElement(GT)('>') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('x') @@ -286,7 +286,7 @@ JetFile: Precedence.jet PsiWhiteSpace(' ') PsiElement(PLUS)('+') PsiWhiteSpace(' ') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION REFERENCE_EXPRESSION @@ -299,7 +299,7 @@ JetFile: Precedence.jet PsiElement(RPAR)(')') PsiWhiteSpace('\n ') BINARY_EXPRESSION - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION REFERENCE_EXPRESSION diff --git a/idea/testData/psi/SimpleExpressions.txt b/idea/testData/psi/SimpleExpressions.txt index c95987fa2a1..748df7d3d75 100644 --- a/idea/testData/psi/SimpleExpressions.txt +++ b/idea/testData/psi/SimpleExpressions.txt @@ -20,7 +20,7 @@ JetFile: SimpleExpressions.jet PsiWhiteSpace(' ') PsiElement(EQ)('=') PsiWhiteSpace(' ') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') PsiElement(RPAR)(')') PsiElement(COMMA)(',') @@ -266,7 +266,7 @@ JetFile: SimpleExpressions.jet PsiWhiteSpace(' ') PsiElement(EQ)('=') PsiWhiteSpace(' ') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') INTEGER_CONSTANT PsiElement(INTEGER_LITERAL)('10') diff --git a/idea/testData/psi/examples/BitArith.txt b/idea/testData/psi/examples/BitArith.txt index 9dabc3708fa..658ff528aba 100644 --- a/idea/testData/psi/examples/BitArith.txt +++ b/idea/testData/psi/examples/BitArith.txt @@ -212,7 +212,7 @@ JetFile: BitArith.jet PsiWhiteSpace(' ') BINARY_EXPRESSION BINARY_EXPRESSION - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION REFERENCE_EXPRESSION @@ -343,7 +343,7 @@ JetFile: BitArith.jet PsiElement(EQ)('=') PsiWhiteSpace(' ') BINARY_EXPRESSION - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION BINARY_EXPRESSION diff --git a/idea/testData/psi/examples/collections/HashMap.txt b/idea/testData/psi/examples/collections/HashMap.txt index 5c51b3d6694..064932dfb90 100644 --- a/idea/testData/psi/examples/collections/HashMap.txt +++ b/idea/testData/psi/examples/collections/HashMap.txt @@ -41,7 +41,7 @@ JetFile: HashMap.jet PsiWhiteSpace(' ') CALL_EXPRESSION DOT_QIALIFIED_EXPRESSION - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION THIS_EXPRESSION @@ -127,7 +127,7 @@ JetFile: HashMap.jet PsiWhiteSpace(' ') CALL_EXPRESSION DOT_QIALIFIED_EXPRESSION - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION THIS_EXPRESSION diff --git a/idea/testData/psi/examples/priorityqueues/BinaryHeap.txt b/idea/testData/psi/examples/priorityqueues/BinaryHeap.txt index 6e5615f2361..696cb42cd28 100644 --- a/idea/testData/psi/examples/priorityqueues/BinaryHeap.txt +++ b/idea/testData/psi/examples/priorityqueues/BinaryHeap.txt @@ -895,7 +895,7 @@ JetFile: BinaryHeap.jet PsiElement(EQ)('=') PsiWhiteSpace(' ') BINARY_EXPRESSION - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION THIS_EXPRESSION @@ -1058,7 +1058,7 @@ JetFile: BinaryHeap.jet PsiElement(EQ)('=') PsiWhiteSpace(' ') BINARY_EXPRESSION - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION THIS_EXPRESSION @@ -1076,7 +1076,7 @@ JetFile: BinaryHeap.jet PsiWhiteSpace(' ') PsiElement(ANDAND)('&&') PsiWhiteSpace(' ') - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION THIS_EXPRESSION diff --git a/idea/testData/psi/examples/util/Comparison.txt b/idea/testData/psi/examples/util/Comparison.txt index 25de18f2548..2d3eeb59d1b 100644 --- a/idea/testData/psi/examples/util/Comparison.txt +++ b/idea/testData/psi/examples/util/Comparison.txt @@ -143,7 +143,7 @@ JetFile: Comparison.jet PsiWhiteSpace(' ') CALL_EXPRESSION DOT_QIALIFIED_EXPRESSION - TUPLE + PARENTHESIZED PsiElement(LPAR)('(') BINARY_EXPRESSION REFERENCE_EXPRESSION