Predicate expression, a?b?.f()
This commit is contained in:
@@ -174,7 +174,7 @@ postfixUnaryOperation
|
||||
;
|
||||
|
||||
memberAccessOperation
|
||||
: "." : "?." : "#"
|
||||
: "." : "?." : "#" : "?"
|
||||
;
|
||||
|
||||
typeArguments
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fun foo() {
|
||||
a?f.foo
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
JetFile: PredicateExpression.jet
|
||||
NAMESPACE
|
||||
FUN
|
||||
PsiElement(fun)('fun')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(IDENTIFIER)('foo')
|
||||
TYPE_PARAMETER_LIST
|
||||
<empty 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)('}')
|
||||
Reference in New Issue
Block a user