Decomposer patterns supported: any expression resolvable in the context of the matched one and returning a tuple is a decomposer

This commit is contained in:
Andrey Breslav
2011-05-20 22:24:13 +04:00
parent 0afddb4d9e
commit a1e055af89
19 changed files with 256 additions and 59 deletions
+1 -1
View File
@@ -125,7 +125,7 @@ public interface JetNodeTypes {
JetNodeType TUPLE_PATTERN_ENTRY = new JetNodeType("TUPLE_PATTERN_ENTRY", JetTuplePatternEntry.class);
JetNodeType DECOMPOSER_PATTERN = new JetNodeType("DECOMPOSER_PATTERN", JetDecomposerPattern.class);
JetNodeType DECOMPOSER_ARGUMENT_LIST = new JetNodeType("DECOMPOSER_ARGUMENT_LIST", JetTuplePattern.class);
JetNodeType DECOMPOSER_ARGUMENT = new JetNodeType("DECOMPOSER_ARGUMENT", JetTuplePatternEntry.class);
JetNodeType DECOMPOSER_ARGUMENT = TUPLE_PATTERN_ENTRY;//new JetNodeType("DECOMPOSER_ARGUMENT", JetTuplePatternEntry.class);
JetNodeType WHEN = new JetNodeType("WHEN", JetWhenExpression.class);
JetNodeType WHEN_ENTRY = new JetNodeType("WHEN_ENTRY", JetWhenEntry.class);
@@ -33,8 +33,6 @@ public class JetPsiChecker implements Annotator {
@Override
public void annotate(@NotNull PsiElement element, @NotNull final AnnotationHolder holder) {
if (element instanceof JetFile) {
Project project = element.getProject();
JetFile file = (JetFile) element;
try {
final BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file);
@@ -89,9 +87,7 @@ public class JetPsiChecker implements Annotator {
}
};
for (JetDiagnostic diagnostic : bindingContext.getDiagnostics()) {
diagnostic.acceptHandler(errorHandler);
}
AnalyzingUtils.applyHandler(errorHandler, bindingContext);
highlightBackingFields(holder, file, bindingContext);
}
@@ -672,6 +672,12 @@ public class JetControlFlowProcessor {
// TODO
}
@Override
public void visitDecomposerPattern(JetDecomposerPattern pattern) {
value(pattern.getDecomposerExpression(), false, inCondition);
pattern.getArgumentList().accept(this);
}
@Override
public void visitJetElement(JetElement elem) {
throw new UnsupportedOperationException("[JetControlFlowProcessor] " + elem.toString());
@@ -1,5 +1,6 @@
package org.jetbrains.jet.lang.parsing;
import com.intellij.codeInspection.dataFlow.instructions.ReturnFromSubInstruction;
import com.intellij.lang.PsiBuilder;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
@@ -9,6 +10,7 @@ import org.jetbrains.jet.lexer.JetTokens;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import static org.jetbrains.jet.lexer.JetTokens.*;
@@ -109,6 +111,10 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
*/
protected boolean _at(IElementType expectation) {
IElementType token = tt();
return tokenMatches(token, expectation);
}
private boolean tokenMatches(IElementType token, IElementType expectation) {
if (token == expectation) return true;
if (expectation == EOL_OR_SEMICOLON) {
if (eof()) return true;
@@ -217,6 +223,7 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
protected int matchTokenStreamPredicate(TokenStreamPattern pattern) {
PsiBuilder.Marker currentPosition = mark();
Stack<IElementType> opens = new Stack<IElementType>();
int openAngleBrackets = 0;
int openBraces = 0;
int openParentheses = 0;
@@ -229,18 +236,27 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
}
if (at(LPAR)) {
openParentheses++;
opens.push(LPAR);
}
else if (at(LT)) {
openAngleBrackets++;
opens.push(LT);
}
else if (at(LBRACE)) {
openBraces++;
opens.push(LBRACE);
}
else if (at(LBRACKET)) {
openBrackets++;
opens.push(LBRACKET);
}
else if (at(RPAR)) {
openParentheses--;
if (opens.isEmpty() || opens.pop() != LPAR) {
if (pattern.handleUnmatchedClosing(RPAR)) {
break;
}
}
}
else if (at(GT)) {
openAngleBrackets--;
@@ -279,7 +295,7 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
return create(new TruncatedSemanticWhitespaceAwarePsiBuilder(myBuilder, eofPosition));
}
protected class AtOffset implements TokenStreamPredicate {
protected class AtOffset extends AbstractTokenStreamPredicate {
private final int offset;
@@ -294,7 +310,7 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
}
protected class At implements TokenStreamPredicate {
protected class At extends AbstractTokenStreamPredicate {
private final IElementType lookFor;
private final boolean topLevelOnly;
@@ -315,28 +331,52 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
}
protected class AtSet implements TokenStreamPredicate {
protected class AtSet extends AbstractTokenStreamPredicate {
private final TokenSet lookFor;
private final boolean topLevelOnly;
private final TokenSet topLevelOnly;
public AtSet(TokenSet lookFor, boolean topLevelOnly) {
public AtSet(TokenSet lookFor, TokenSet topLevelOnly) {
this.lookFor = lookFor;
this.topLevelOnly = topLevelOnly;
}
public AtSet(TokenSet lookFor) {
this(lookFor, true);
this(lookFor, lookFor);
}
public AtSet(IElementType... lookFor) {
this(TokenSet.create(lookFor), true);
this(TokenSet.create(lookFor), TokenSet.create(lookFor));
}
@Override
public boolean matching(boolean topLevel) {
return (topLevel || !topLevelOnly) && atSet(lookFor);
return (topLevel || !atSet(topLevelOnly)) && atSet(lookFor);
}
}
protected class AtFirstTokenOfTokens extends AbstractTokenStreamPredicate {
private final IElementType[] tokens;
public AtFirstTokenOfTokens(IElementType... tokens) {
assert tokens.length > 0;
this.tokens = tokens;
}
@Override
public boolean matching(boolean topLevel) {
int length = tokens.length;
if (!at(tokens[0])) return false;
for (int i = 1; i < length; i++) {
IElementType lookAhead = myBuilder.lookAhead(i);
if (lookAhead == null || !tokenMatches(lookAhead, tokens[i])) {
return false;
}
}
return true;
}
}
}
@@ -1,5 +1,7 @@
package org.jetbrains.jet.lang.parsing;
import com.intellij.psi.tree.IElementType;
/**
* @author abreslav
*/
@@ -7,6 +9,10 @@ public abstract class AbstractTokenStreamPattern implements TokenStreamPattern {
protected int lastOccurrence = -1;
protected void fail() {
lastOccurrence = -1;
}
@Override
public int result() {
return lastOccurrence;
@@ -16,5 +22,10 @@ public abstract class AbstractTokenStreamPattern implements TokenStreamPattern {
public boolean isTopLevel(int openAngleBrackets, int openBrackets, int openBraces, int openParentheses) {
return openBraces == 0 && openBrackets == 0 && openParentheses == 0 && openAngleBrackets == 0;
}
@Override
public boolean handleUnmatchedClosing(IElementType token) {
return false;
}
}
@@ -0,0 +1,18 @@
package org.jetbrains.jet.lang.parsing;
/**
* @author abreslav
*/
public abstract class AbstractTokenStreamPredicate implements TokenStreamPredicate {
@Override
public TokenStreamPredicate or(final TokenStreamPredicate other) {
return new AbstractTokenStreamPredicate() {
@Override
public boolean matching(boolean topLevel) {
if (AbstractTokenStreamPredicate.this.matching(topLevel)) return true;
return other.matching(topLevel);
}
};
}
}
@@ -395,11 +395,21 @@ public class JetExpressionParsing extends AbstractJetParsing {
}
else if (at(LT)) {
// TODO: be (even) more clever
int gtPos = matchTokenStreamPredicate(new FirstBefore(new At(GT), new AtSet(TYPE_ARGUMENT_LIST_STOPPERS, false)) {
int gtPos = matchTokenStreamPredicate(new FirstBefore(
new At(GT),
new AtSet(TYPE_ARGUMENT_LIST_STOPPERS, TokenSet.create(RPAR, RBRACE, RBRACKET))
.or(new AtFirstTokenOfTokens(IDENTIFIER, LPAR))
) {
@Override
public boolean isTopLevel(int openAngleBrackets, int openBrackets, int openBraces, int openParentheses) {
return openAngleBrackets == 1 && openBrackets == 0 && openBraces == 0 && openParentheses == 0;
}
@Override
public boolean handleUnmatchedClosing(IElementType token) {
fail();
return true;
}
});
if (gtPos >= 0) {
myJetParsing.parseTypeArgumentList();
@@ -725,13 +725,14 @@ public class JetParsing extends AbstractJetParsing {
// TODO: extract constant
int lastDot = matchTokenStreamPredicate(new FirstBefore(
new TokenStreamPredicate() {
new AbstractTokenStreamPredicate() {
@Override
public boolean matching(boolean topLevel) {
return topLevel
&& at(DOT);
}
}, new TokenStreamPredicate() {
},
new AbstractTokenStreamPredicate() {
@Override
public boolean matching(boolean topLevel) {
if (topLevel && (at(EQ) || at(COLON))) return true;
@@ -1,5 +1,7 @@
package org.jetbrains.jet.lang.parsing;
import com.intellij.psi.tree.IElementType;
/**
* @author abreslav
*/
@@ -18,9 +20,16 @@ public interface TokenStreamPattern {
*/
int result();
/*
/**
* Decides if the combination of open bracet counts makes a "top level position"
* Straightforward meaning would be: if all counts are zero, then it's a top level
*/
boolean isTopLevel(int openAngleBrackets, int openBrackets, int openBraces, int openParentheses);
/**
* Called on right parentheses, brackets, braces and angles (>)
* @param token the closing bracket
* @return true to stop matching, false to proceed
*/
boolean handleUnmatchedClosing(IElementType token);
}
@@ -5,4 +5,6 @@ package org.jetbrains.jet.lang.parsing;
*/
public interface TokenStreamPredicate {
boolean matching(boolean topLevel);
TokenStreamPredicate or(TokenStreamPredicate other);
}
@@ -2,6 +2,8 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.JetNodeTypes;
/**
* @author abreslav
@@ -10,4 +12,18 @@ public class JetDecomposerPattern extends JetPattern {
public JetDecomposerPattern(@NotNull ASTNode node) {
super(node);
}
@Nullable @IfNotParsed
public JetExpression getDecomposerExpression() {
return findChildByClass(JetExpression.class);
}
public JetTuplePattern getArgumentList() {
return (JetTuplePattern) findChildByType(JetNodeTypes.DECOMPOSER_ARGUMENT_LIST);
}
@Override
public void accept(@NotNull JetVisitor visitor) {
visitor.visitDecomposerPattern(this);
}
}
@@ -385,4 +385,8 @@ public class JetVisitor extends PsiElementVisitor {
private void visitPattern(JetPattern pattern) {
visitJetElement(pattern);
}
public void visitDecomposerPattern(JetDecomposerPattern pattern) {
visitPattern(pattern);
}
}
@@ -888,7 +888,7 @@ public class JetTypeInferrer {
List<JetExpression> entries = expression.getEntries();
List<JetType> types = new ArrayList<JetType>();
for (JetExpression entry : entries) {
types.add(getType(scope, entry, false));
types.add(safeGetType(scope, entry, false));
}
// TODO : labels
result = JetStandardClasses.getTupleType(types);
@@ -1069,7 +1069,7 @@ public class JetTypeInferrer {
TypeConstructor typeConstructor = subjectType.getConstructor();
if (!JetStandardClasses.getTuple(entries.size()).getTypeConstructor().equals(typeConstructor)
|| typeConstructor.getParameters().size() != entries.size()) {
trace.getErrorHandler().genericError(pattern.getNode(), "Type mismatch: subject is of type " + subjectType + " but the pattern if of type Tuple" + entries.size()); // TODO : message
trace.getErrorHandler().genericError(pattern.getNode(), "Type mismatch: subject is of type " + subjectType + " but the pattern is of type Tuple" + entries.size()); // TODO : message
}
else {
for (int i = 0, entriesSize = entries.size(); i < entriesSize; i++) {
@@ -1090,6 +1090,13 @@ public class JetTypeInferrer {
}
}
@Override
public void visitDecomposerPattern(JetDecomposerPattern pattern) {
JetType selectorReturnType = getSelectorReturnType(subjectType, pattern.getDecomposerExpression());
checkPatternType(pattern.getArgumentList(), selectorReturnType == null ? ErrorUtils.createErrorType("No type") : selectorReturnType);
}
private void checkTypeCompatibility(@Nullable JetType type, @NotNull JetType subjectType, @NotNull JetElement reportErrorOn) {
if (type == null) {
return;
+5 -1
View File
@@ -43,5 +43,9 @@ fun test() {
is (1, 1) => 1
is (1, <error>"1"</error>) => 1
is <error>(1, "1", *)</error> => 1
is boo @ (1, <error>"a"</error>, *) => 1
is boo @ <error>(1, *)</error> => 1
}
}
}
val (Int, Int).boo : (Int, Int, Int) = (1, 1, 1)
+1 -1
View File
@@ -107,7 +107,7 @@ JetFile: RootNamespace.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -1,4 +1,5 @@
fun foo() {
dd<(Int, Int, Int)>(if (true) (1, 1, 1) else (2, 2, 2))
foo(bar<a, b, c>(d))
foo(bar<a, b+1, c>(d))
foo(bar<a, f(), c>(d))
@@ -11,6 +11,78 @@ JetFile: TypeExpressionAmbiguities_ERR.jet
BLOCK
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
CALL_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('dd')
TYPE_ARGUMENT_LIST
PsiElement(LT)('<')
TYPE_PROJECTION
TYPE_REFERENCE
TUPLE_TYPE
PsiElement(LPAR)('(')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('Int')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('Int')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('Int')
PsiElement(RPAR)(')')
PsiElement(GT)('>')
VALUE_ARGUMENT_LIST
PsiElement(LPAR)('(')
VALUE_ARGUMENT
IF
PsiElement(if)('if')
PsiWhiteSpace(' ')
PsiElement(LPAR)('(')
CONDITION
BOOLEAN_CONSTANT
PsiElement(true)('true')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
THEN
TUPLE
PsiElement(LPAR)('(')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
PsiElement(else)('else')
PsiWhiteSpace(' ')
ELSE
TUPLE
PsiElement(LPAR)('(')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('2')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('2')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('2')
PsiElement(RPAR)(')')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n ')
CALL_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
+29 -29
View File
@@ -145,7 +145,7 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -153,7 +153,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -178,7 +178,7 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -186,7 +186,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -465,13 +465,13 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN
NULL
PsiElement(null)('null')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
BINDING_PATTERN
PsiElement(val)('val')
PsiWhiteSpace(' ')
@@ -495,7 +495,7 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -503,7 +503,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -528,7 +528,7 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -536,7 +536,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -565,7 +565,7 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -573,7 +573,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -602,7 +602,7 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace(' ')
PsiElement(EQ)('=')
@@ -614,7 +614,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
PsiElement(IDENTIFIER)('bar')
PsiWhiteSpace(' ')
PsiElement(EQ)('=')
@@ -651,7 +651,7 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -659,7 +659,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -684,7 +684,7 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
BINDING_PATTERN
PsiElement(val)('val')
PsiWhiteSpace(' ')
@@ -699,7 +699,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('T')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -724,7 +724,7 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -732,7 +732,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('b')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
@@ -952,7 +952,7 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -1080,13 +1080,13 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN
NULL
PsiElement(null)('null')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
BINDING_PATTERN
PsiElement(val)('val')
PsiWhiteSpace(' ')
@@ -1105,7 +1105,7 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -1113,7 +1113,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -1169,7 +1169,7 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -1177,7 +1177,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -1206,14 +1206,14 @@ JetFile: When.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
BINDING_PATTERN
PsiElement(val)('val')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('b')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
+8 -8
View File
@@ -1351,13 +1351,13 @@ JetFile: BinaryTree.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN
NULL
PsiElement(null)('null')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN
NULL
PsiElement(null)('null')
@@ -1392,13 +1392,13 @@ JetFile: BinaryTree.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN
NULL
PsiElement(null)('null')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -1435,7 +1435,7 @@ JetFile: BinaryTree.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -1443,7 +1443,7 @@ JetFile: BinaryTree.jet
PsiElement(IDENTIFIER)('left')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN
NULL
PsiElement(null)('null')
@@ -1478,7 +1478,7 @@ JetFile: BinaryTree.jet
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE
@@ -1486,7 +1486,7 @@ JetFile: BinaryTree.jet
PsiElement(IDENTIFIER)('left')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT
TUPLE_PATTERN_ENTRY
TYPE_PATTERN
TYPE_REFERENCE
USER_TYPE