diff --git a/grammar/src/expressions.grm b/grammar/src/expressions.grm index ce251fa5230..0ed0fbe0b8b 100644 --- a/grammar/src/expressions.grm +++ b/grammar/src/expressions.grm @@ -174,7 +174,7 @@ postfixUnaryOperation ; memberAccessOperation - : "." : "?." : "#" + : "." : "?." : "#" : "?" ; typeArguments diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java index 7341bd4c811..44bca5a4baa 100644 --- a/idea/src/org/jetbrains/jet/JetNodeTypes.java +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -105,6 +105,7 @@ public interface JetNodeTypes { JetNodeType DOT_QIALIFIED_EXPRESSION = new JetNodeType("DOT_QIALIFIED_EXPRESSION", JetDotQualifiedExpression.class); JetNodeType HASH_QIALIFIED_EXPRESSION = new JetNodeType("HASH_QIALIFIED_EXPRESSION", JetHashQualifiedExpression.class); JetNodeType SAFE_ACCESS_EXPRESSION = new JetNodeType("SAFE_ACCESS_EXPRESSION", JetSafeQualifiedExpression.class); + JetNodeType PREDICATE_EXPRESSION = new JetNodeType("PREDICATE_EXPRESSION", JetPridcateExpression.class); JetNodeType DECOMPOSER_PATTERN = new JetNodeType("DECOMPOSER_PATTERN"); JetNodeType TUPLE_PATTERN = new JetNodeType("TUPLE_PATTERN"); JetNodeType OBJECT_LITERAL = new JetNodeType("OBJECT_LITERAL", JetObjectLiteralExpression.class); diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index a01f99b74a0..a446d6c43e1 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -274,7 +274,15 @@ public class JetExpressionParsing extends AbstractJetParsing { } /* - * expression operation? + * atomicExpression postfixUnaryOperation? + * + * postfixUnaryOperation + * : "++" : "--" + * : typeArguments? valueArguments + * : typeArguments + * : arrayAccess + * : memberAccessOperation postfixUnaryOperation // TODO: Review + * ; */ private void parsePostfixExpression() { // System.out.println("post at " + myBuilder.getTokenText()); @@ -324,6 +332,12 @@ public class JetExpressionParsing extends AbstractJetParsing { parseAtomicExpression(); expression.done(SAFE_ACCESS_EXPRESSION); + } else if (at(QUEST)) { + advance(); // QUEST + + parseAtomicExpression(); + + expression.done(PREDICATE_EXPRESSION); } else if (at(HASH)) { advance(); // HASH diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetPridcateExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetPridcateExpression.java new file mode 100644 index 00000000000..bb183cee0fb --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetPridcateExpression.java @@ -0,0 +1,13 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * @author abreslav + */ +public class JetPridcateExpression extends JetQualifiedExpression { + public JetPridcateExpression(@NotNull ASTNode node) { + super(node); + } +} diff --git a/idea/testData/psi/PredicateExpression.jet b/idea/testData/psi/PredicateExpression.jet new file mode 100644 index 00000000000..385f1838582 --- /dev/null +++ b/idea/testData/psi/PredicateExpression.jet @@ -0,0 +1,3 @@ +fun foo() { + a?f.foo +} \ No newline at end of file diff --git a/idea/testData/psi/PredicateExpression.txt b/idea/testData/psi/PredicateExpression.txt new file mode 100644 index 00000000000..2ddfa1de286 --- /dev/null +++ b/idea/testData/psi/PredicateExpression.txt @@ -0,0 +1,27 @@ +JetFile: PredicateExpression.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 ') + DOT_QIALIFIED_EXPRESSION + PREDICATE_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiElement(QUEST)('?') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('f') + PsiElement(DOT)('.') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('foo') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file