From 4c41b1e566f50cdc49429f42ca4f487ea51f0993 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 30 Dec 2010 20:09:45 +0300 Subject: [PATCH] Pre- and Post-fixes fixed --- grammar/src/expressions.grm | 23 +- idea/src/org/jetbrains/jet/JetNodeTypes.java | 3 + .../lang/parsing/JetExpressionParsing.java | 113 +++--- ...SemanticWhitespaceAwarePsiBuilderImpl.java | 27 +- idea/testData/psi/EOLsOnRollback.jet | 3 + idea/testData/psi/Precedence.jet | 3 + idea/testData/psi/Precedence.txt | 370 ------------------ 7 files changed, 105 insertions(+), 437 deletions(-) delete mode 100644 idea/testData/psi/Precedence.txt diff --git a/grammar/src/expressions.grm b/grammar/src/expressions.grm index a9effdbb696..0154a4c3964 100644 --- a/grammar/src/expressions.grm +++ b/grammar/src/expressions.grm @@ -74,15 +74,11 @@ multiplicativeExpression ; prefixUnaryExpression - : prefixUnaryOperation postfixUnaryExpression + : prefixUnaryOperation* postfixUnaryExpression ; postfixUnaryExpression - : memberAccess postfixUnaryOperation - ; - -memberAccess - : atomicExpression memberAccessOperation atomicExpression + : memberAccess postfixUnaryOperation* ; atomicExpression @@ -120,10 +116,6 @@ declaration : typedef ; -memberAccessOperation - : "." : "?." : "#" - ; - multiplicativeOperation : "*" : "/" : "%" ; @@ -149,10 +141,6 @@ assignmentOperator : "+=" : "-=" : "*=" : "/=" : "%="// TODO: |=, %= and <<= make more sense than |, % or << alone, and so for others ; -assignment - : memberAccessExpression assignmentOperator expression // Assignment to functions prohibited by a semantic check - ; - unOpExpression : expression postfixUnaryOperation : prefixUnaryOperation expression @@ -168,8 +156,13 @@ prefixUnaryOperation postfixUnaryOperation : "++" : "--" : typeArguments? valueArguments - // : typeArguments // TODO: + : typeArguments : arrayAccess + : memberAccessOperation atomicExpression + ; + +memberAccessOperation + : "." : "?." : "#" ; functionCall diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java index 9452461955e..079294c2529 100644 --- a/idea/src/org/jetbrains/jet/JetNodeTypes.java +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -98,6 +98,9 @@ public interface JetNodeTypes { JetNodeType CALL_EXPRESSION = new JetNodeType("CALL_EXPRESSION"); JetNodeType ARRAY_ACCESS_EXPRESSION = new JetNodeType("ARRAY_ACCESS_EXPRESSION"); JetNodeType INDICES = new JetNodeType("INDICES"); + JetNodeType DOT_QIALIFIED_EXPRESSION = new JetNodeType("DOT_QIALIFIED_EXPRESSION"); + JetNodeType HASH_QIALIFIED_EXPRESSION = new JetNodeType("HASH_QIALIFIED_EXPRESSION"); + JetNodeType SAFE_ACCESS_EXPRESSION = new JetNodeType("SAFE_ACCESS_EXPRESSION"); IElementType NAMESPACE_NAME = new JetNodeType("NAMESPACE_NAME"); } diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index ddaa005c171..9702d0cead9 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -33,15 +33,14 @@ public class JetExpressionParsing extends AbstractJetParsing { @SuppressWarnings({"UnusedDeclaration"}) private enum Precedence { - MEMBER_ACCESS(DOT, HASH, SAFE_ACCESS) { - @Override - public void parseHigherPrecedence(JetExpressionParsing parsing) { - parsing.parseAtomicExpression(); - } - }, - - // TODO: wrong priority for call: Random.nextInt().isOdd - POSTFIX(PLUSPLUS, MINUSMINUS), // typeArguments? valueArguments : arrayAccess +// MEMBER_ACCESS(DOT, HASH, SAFE_ACCESS) { +// @Override +// public void parseHigherPrecedence(JetExpressionParsing parsing) { +// parsing.parseAtomicExpression(); +// } +// }, +// + POSTFIX(PLUSPLUS, MINUSMINUS), // typeArguments? valueArguments : typeArguments : arrayAccess PREFIX(MINUS, PLUS, MINUSMINUS, PLUSPLUS, EXCL) { // attributes @@ -131,7 +130,8 @@ public class JetExpressionParsing extends AbstractJetParsing { * see the precedence table */ private void parseBinaryExpression(Precedence precedence) { -// System.out.println(precedence.name() + " at " + tt()); +// System.out.println(precedence.name() + " at " + myBuilder.getTokenText()); + PsiBuilder.Marker expression = mark(); precedence.parseHigherPrecedence(this); @@ -147,21 +147,24 @@ public class JetExpressionParsing extends AbstractJetParsing { } /* - * operation? expression + * operation? prefixExpression */ private void parsePrefixExpression() { -// System.out.println("pre at " + tt()); +// System.out.println("pre at " + myBuilder.getTokenText()); if (at(LBRACKET)) { if (!parseLocalDeclaration()) { - PsiBuilder.Marker attributes = mark(); + PsiBuilder.Marker expression = mark(); myJetParsing.parseAttributeList(); - parsePostfixExpression(); - attributes.done(ANNOTATED_EXPRESSION); + parsePrefixExpression(); + expression.done(ANNOTATED_EXPRESSION); + } else { + return; } } else if (atSet(Precedence.PREFIX.getOperations())) { PsiBuilder.Marker expression = mark(); advance(); // operation - parsePostfixExpression(); + + parsePrefixExpression(); expression.done(PREFIX_EXPRESSION); } else { parsePostfixExpression(); @@ -172,41 +175,63 @@ public class JetExpressionParsing extends AbstractJetParsing { * expression operation? */ private void parsePostfixExpression() { -// System.out.println("post at " + tt()); +// System.out.println("post at " + myBuilder.getTokenText()); // TODO: call with a closure outside parentheses PsiBuilder.Marker expression = mark(); - parseBinaryExpression(Precedence.MEMBER_ACCESS); - if (myBuilder.eolInLastWhitespace()) { - expression.drop(); - } else if (at(LBRACKET)) { - parseArrayAccess(); - expression.done(ARRAY_ACCESS_EXPRESSION); - } else if (atSet(Precedence.POSTFIX.getOperations())) { - advance(); // operation - expression.done(POSTFIX_EXPRESSION); - } else if (at(LPAR)) { - parseValueArgumentList(); - expression.done(CALL_EXPRESSION); - } else if (at(LT)) { - // TODO: be more clever: f(foo(c)) is not a function call - int gtPos = matchTokenStreamPredicate(new FirstBefore(new At(GT), new AtSet(TYPE_ARGUMENT_LIST_STOPPERS, false)) { - @Override - public boolean isTopLevel(int openAngleBrackets, int openBrackets, int openBraces, int openParentheses) { - return openAngleBrackets == 1 && openBrackets == 0 && openBraces == 0 && openParentheses == 0; - } - }); - if (gtPos >= 0) { - myJetParsing.parseTypeArgumentList(); -// if (at(LPAR)) parseValueArgumentList(); TODO : we can do this... +// parseBinaryExpression(Precedence.MEMBER_ACCESS); + parseAtomicExpression(); + while (true) { + if (myBuilder.eolInLastWhitespace()) { + break; + } else if (at(LBRACKET)) { + parseArrayAccess(); + expression.done(ARRAY_ACCESS_EXPRESSION); + } else if (atSet(Precedence.POSTFIX.getOperations())) { + advance(); // operation + expression.done(POSTFIX_EXPRESSION); + } else if (at(LPAR)) { parseValueArgumentList(); expression.done(CALL_EXPRESSION); + } else if (at(LT)) { + // TODO: be more clever: f(foo(c)) is not a function call + int gtPos = matchTokenStreamPredicate(new FirstBefore(new At(GT), new AtSet(TYPE_ARGUMENT_LIST_STOPPERS, false)) { + @Override + public boolean isTopLevel(int openAngleBrackets, int openBrackets, int openBraces, int openParentheses) { + return openAngleBrackets == 1 && openBrackets == 0 && openBraces == 0 && openParentheses == 0; + } + }); + if (gtPos >= 0) { + myJetParsing.parseTypeArgumentList(); + if (at(LPAR)) parseValueArgumentList(); + expression.done(CALL_EXPRESSION); + } else { + break; + } + } else if (at(DOT)) { + advance(); // DOT + + parseAtomicExpression(); + + expression.done(DOT_QIALIFIED_EXPRESSION); + } else if (at(SAFE_ACCESS)) { + advance(); // SAFE_ACCESS + + parseAtomicExpression(); + + expression.done(SAFE_ACCESS_EXPRESSION); + } else if (at(HASH)) { + advance(); // HASH + + expect(IDENTIFIER, "Expecting property or function name"); + + expression.done(HASH_QIALIFIED_EXPRESSION); } else { - expression.drop(); + break; } - } else { - expression.drop(); + expression = expression.precede(); } + expression.drop(); } /* @@ -227,7 +252,7 @@ public class JetExpressionParsing extends AbstractJetParsing { * ; */ private void parseAtomicExpression() { -// System.out.println("atom at " + tt()); +// System.out.println("atom at " + myBuilder.getTokenText()); if (at(LPAR)) { diff --git a/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java b/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java index 765b61a742c..db15a151736 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java @@ -63,14 +63,25 @@ public class SemanticWhitespaceAwarePsiBuilderImpl extends PsiBuilderAdapter imp // TODO: Overhead @Override public Marker mark() { - return new MarkerAdapter(super.mark()) { - private final boolean eolInLastWhitespace = eolInLastWhitespace(); + return new MarkerWrapper(super.mark()); + } - @Override - public void rollbackTo() { - super.rollbackTo(); - myEOLInLastWhitespace = eolInLastWhitespace; - } - }; + private class MarkerWrapper extends MarkerAdapter { + private final boolean eolInLastWhitespace = eolInLastWhitespace(); + + public MarkerWrapper(Marker delegate) { + super(delegate); + } + + @Override + public void rollbackTo() { + super.rollbackTo(); + myEOLInLastWhitespace = eolInLastWhitespace; + } + + @Override + public Marker precede() { + return new MarkerWrapper(super.precede()); + } } } diff --git a/idea/testData/psi/EOLsOnRollback.jet b/idea/testData/psi/EOLsOnRollback.jet index 63ed7804abd..bf88512c006 100644 --- a/idea/testData/psi/EOLsOnRollback.jet +++ b/idea/testData/psi/EOLsOnRollback.jet @@ -9,4 +9,7 @@ fun foo() { var r [a] var foo = 4 + + 1 + [a] val f } \ No newline at end of file diff --git a/idea/testData/psi/Precedence.jet b/idea/testData/psi/Precedence.jet index e62234233f2..bab05d3a74e 100644 --- a/idea/testData/psi/Precedence.jet +++ b/idea/testData/psi/Precedence.jet @@ -1,4 +1,7 @@ fun foo() { + b().x + x++ . 4 + ++ -- ! a f(foo(x))) f(foo(x)) f((foo(x)) diff --git a/idea/testData/psi/Precedence.txt b/idea/testData/psi/Precedence.txt deleted file mode 100644 index ad252bd2988..00000000000 --- a/idea/testData/psi/Precedence.txt +++ /dev/null @@ -1,370 +0,0 @@ -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 ') - CALL_EXPRESSION - PsiElement(IDENTIFIER)('f') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - BINARY_EXPRESSION - PsiElement(IDENTIFIER)('foo') - PsiElement(LT)('<') - PsiElement(IDENTIFIER)('a') - PsiElement(COMMA)(',') - PsiWhiteSpace(' ') - VALUE_ARGUMENT - TUPLE - PsiElement(LPAR)('(') - BINARY_EXPRESSION - PsiElement(IDENTIFIER)('b') - PsiElement(GT)('>') - TUPLE - PsiElement(LPAR)('(') - PsiElement(IDENTIFIER)('x') - PsiElement(RPAR)(')') - PsiElement(RPAR)(')') - PsiElement(RPAR)(')') - PsiWhiteSpace('\n ') - CALL_EXPRESSION - PsiElement(IDENTIFIER)('f') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - CALL_EXPRESSION - PsiElement(IDENTIFIER)('foo') - TYPE_ARGUMENT_LIST - PsiElement(LT)('<') - TYPE_REFERENCE - USER_TYPE - PsiElement(IDENTIFIER)('a') - PsiElement(COMMA)(',') - PsiWhiteSpace(' ') - TYPE_REFERENCE - USER_TYPE - PsiElement(IDENTIFIER)('b') - PsiElement(GT)('>') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - PsiElement(IDENTIFIER)('x') - PsiElement(RPAR)(')') - PsiElement(RPAR)(')') - PsiWhiteSpace('\n ') - CALL_EXPRESSION - PsiElement(IDENTIFIER)('f') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - TUPLE - PsiElement(LPAR)('(') - BINARY_EXPRESSION - PsiElement(IDENTIFIER)('foo') - PsiElement(LT)('<') - PsiElement(IDENTIFIER)('a') - PsiElement(RPAR)(')') - PsiElement(COMMA)(',') - PsiWhiteSpace(' ') - VALUE_ARGUMENT - BINARY_EXPRESSION - PsiElement(IDENTIFIER)('b') - PsiElement(GT)('>') - TUPLE - PsiElement(LPAR)('(') - PsiElement(IDENTIFIER)('x') - PsiElement(RPAR)(')') - PsiElement(RPAR)(')') - PsiWhiteSpace('\n ') - CALL_EXPRESSION - PsiElement(IDENTIFIER)('f') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - BINARY_EXPRESSION - PsiElement(IDENTIFIER)('foo') - PsiElement(LT)('<') - PsiElement(IDENTIFIER)('a') - PsiElement(COMMA)(',') - PsiWhiteSpace(' ') - VALUE_ARGUMENT - PsiElement(IDENTIFIER)('b') - PsiElement(RPAR)(')') - 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