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 TUPLE_PATTERN_ENTRY = new JetNodeType("TUPLE_PATTERN_ENTRY", JetTuplePatternEntry.class);
JetNodeType DECOMPOSER_PATTERN = new JetNodeType("DECOMPOSER_PATTERN", JetDecomposerPattern.class); JetNodeType DECOMPOSER_PATTERN = new JetNodeType("DECOMPOSER_PATTERN", JetDecomposerPattern.class);
JetNodeType DECOMPOSER_ARGUMENT_LIST = new JetNodeType("DECOMPOSER_ARGUMENT_LIST", JetTuplePattern.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 = new JetNodeType("WHEN", JetWhenExpression.class);
JetNodeType WHEN_ENTRY = new JetNodeType("WHEN_ENTRY", JetWhenEntry.class); JetNodeType WHEN_ENTRY = new JetNodeType("WHEN_ENTRY", JetWhenEntry.class);
@@ -33,8 +33,6 @@ public class JetPsiChecker implements Annotator {
@Override @Override
public void annotate(@NotNull PsiElement element, @NotNull final AnnotationHolder holder) { public void annotate(@NotNull PsiElement element, @NotNull final AnnotationHolder holder) {
if (element instanceof JetFile) { if (element instanceof JetFile) {
Project project = element.getProject();
JetFile file = (JetFile) element; JetFile file = (JetFile) element;
try { try {
final BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file); final BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file);
@@ -89,9 +87,7 @@ public class JetPsiChecker implements Annotator {
} }
}; };
for (JetDiagnostic diagnostic : bindingContext.getDiagnostics()) { AnalyzingUtils.applyHandler(errorHandler, bindingContext);
diagnostic.acceptHandler(errorHandler);
}
highlightBackingFields(holder, file, bindingContext); highlightBackingFields(holder, file, bindingContext);
} }
@@ -672,6 +672,12 @@ public class JetControlFlowProcessor {
// TODO // TODO
} }
@Override
public void visitDecomposerPattern(JetDecomposerPattern pattern) {
value(pattern.getDecomposerExpression(), false, inCondition);
pattern.getArgumentList().accept(this);
}
@Override @Override
public void visitJetElement(JetElement elem) { public void visitJetElement(JetElement elem) {
throw new UnsupportedOperationException("[JetControlFlowProcessor] " + elem.toString()); throw new UnsupportedOperationException("[JetControlFlowProcessor] " + elem.toString());
@@ -1,5 +1,6 @@
package org.jetbrains.jet.lang.parsing; package org.jetbrains.jet.lang.parsing;
import com.intellij.codeInspection.dataFlow.instructions.ReturnFromSubInstruction;
import com.intellij.lang.PsiBuilder; import com.intellij.lang.PsiBuilder;
import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet; import com.intellij.psi.tree.TokenSet;
@@ -9,6 +10,7 @@ import org.jetbrains.jet.lexer.JetTokens;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Stack;
import static org.jetbrains.jet.lexer.JetTokens.*; import static org.jetbrains.jet.lexer.JetTokens.*;
@@ -109,6 +111,10 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
*/ */
protected boolean _at(IElementType expectation) { protected boolean _at(IElementType expectation) {
IElementType token = tt(); IElementType token = tt();
return tokenMatches(token, expectation);
}
private boolean tokenMatches(IElementType token, IElementType expectation) {
if (token == expectation) return true; if (token == expectation) return true;
if (expectation == EOL_OR_SEMICOLON) { if (expectation == EOL_OR_SEMICOLON) {
if (eof()) return true; if (eof()) return true;
@@ -217,6 +223,7 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
protected int matchTokenStreamPredicate(TokenStreamPattern pattern) { protected int matchTokenStreamPredicate(TokenStreamPattern pattern) {
PsiBuilder.Marker currentPosition = mark(); PsiBuilder.Marker currentPosition = mark();
Stack<IElementType> opens = new Stack<IElementType>();
int openAngleBrackets = 0; int openAngleBrackets = 0;
int openBraces = 0; int openBraces = 0;
int openParentheses = 0; int openParentheses = 0;
@@ -229,18 +236,27 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
} }
if (at(LPAR)) { if (at(LPAR)) {
openParentheses++; openParentheses++;
opens.push(LPAR);
} }
else if (at(LT)) { else if (at(LT)) {
openAngleBrackets++; openAngleBrackets++;
opens.push(LT);
} }
else if (at(LBRACE)) { else if (at(LBRACE)) {
openBraces++; openBraces++;
opens.push(LBRACE);
} }
else if (at(LBRACKET)) { else if (at(LBRACKET)) {
openBrackets++; openBrackets++;
opens.push(LBRACKET);
} }
else if (at(RPAR)) { else if (at(RPAR)) {
openParentheses--; openParentheses--;
if (opens.isEmpty() || opens.pop() != LPAR) {
if (pattern.handleUnmatchedClosing(RPAR)) {
break;
}
}
} }
else if (at(GT)) { else if (at(GT)) {
openAngleBrackets--; openAngleBrackets--;
@@ -279,7 +295,7 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
return create(new TruncatedSemanticWhitespaceAwarePsiBuilder(myBuilder, eofPosition)); return create(new TruncatedSemanticWhitespaceAwarePsiBuilder(myBuilder, eofPosition));
} }
protected class AtOffset implements TokenStreamPredicate { protected class AtOffset extends AbstractTokenStreamPredicate {
private final int offset; 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 IElementType lookFor;
private final boolean topLevelOnly; 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 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.lookFor = lookFor;
this.topLevelOnly = topLevelOnly; this.topLevelOnly = topLevelOnly;
} }
public AtSet(TokenSet lookFor) { public AtSet(TokenSet lookFor) {
this(lookFor, true); this(lookFor, lookFor);
} }
public AtSet(IElementType... lookFor) { public AtSet(IElementType... lookFor) {
this(TokenSet.create(lookFor), true); this(TokenSet.create(lookFor), TokenSet.create(lookFor));
} }
@Override @Override
public boolean matching(boolean topLevel) { 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; package org.jetbrains.jet.lang.parsing;
import com.intellij.psi.tree.IElementType;
/** /**
* @author abreslav * @author abreslav
*/ */
@@ -7,6 +9,10 @@ public abstract class AbstractTokenStreamPattern implements TokenStreamPattern {
protected int lastOccurrence = -1; protected int lastOccurrence = -1;
protected void fail() {
lastOccurrence = -1;
}
@Override @Override
public int result() { public int result() {
return lastOccurrence; return lastOccurrence;
@@ -16,5 +22,10 @@ public abstract class AbstractTokenStreamPattern implements TokenStreamPattern {
public boolean isTopLevel(int openAngleBrackets, int openBrackets, int openBraces, int openParentheses) { public boolean isTopLevel(int openAngleBrackets, int openBrackets, int openBraces, int openParentheses) {
return openBraces == 0 && openBrackets == 0 && openParentheses == 0 && openAngleBrackets == 0; 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)) { else if (at(LT)) {
// TODO: be (even) more clever // 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 @Override
public boolean isTopLevel(int openAngleBrackets, int openBrackets, int openBraces, int openParentheses) { public boolean isTopLevel(int openAngleBrackets, int openBrackets, int openBraces, int openParentheses) {
return openAngleBrackets == 1 && openBrackets == 0 && openBraces == 0 && openParentheses == 0; return openAngleBrackets == 1 && openBrackets == 0 && openBraces == 0 && openParentheses == 0;
} }
@Override
public boolean handleUnmatchedClosing(IElementType token) {
fail();
return true;
}
}); });
if (gtPos >= 0) { if (gtPos >= 0) {
myJetParsing.parseTypeArgumentList(); myJetParsing.parseTypeArgumentList();
@@ -725,13 +725,14 @@ public class JetParsing extends AbstractJetParsing {
// TODO: extract constant // TODO: extract constant
int lastDot = matchTokenStreamPredicate(new FirstBefore( int lastDot = matchTokenStreamPredicate(new FirstBefore(
new TokenStreamPredicate() { new AbstractTokenStreamPredicate() {
@Override @Override
public boolean matching(boolean topLevel) { public boolean matching(boolean topLevel) {
return topLevel return topLevel
&& at(DOT); && at(DOT);
} }
}, new TokenStreamPredicate() { },
new AbstractTokenStreamPredicate() {
@Override @Override
public boolean matching(boolean topLevel) { public boolean matching(boolean topLevel) {
if (topLevel && (at(EQ) || at(COLON))) return true; if (topLevel && (at(EQ) || at(COLON))) return true;
@@ -1,5 +1,7 @@
package org.jetbrains.jet.lang.parsing; package org.jetbrains.jet.lang.parsing;
import com.intellij.psi.tree.IElementType;
/** /**
* @author abreslav * @author abreslav
*/ */
@@ -18,9 +20,16 @@ public interface TokenStreamPattern {
*/ */
int result(); int result();
/* /**
* Decides if the combination of open bracet counts makes a "top level position" * 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 * 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); 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 { public interface TokenStreamPredicate {
boolean matching(boolean topLevel); boolean matching(boolean topLevel);
TokenStreamPredicate or(TokenStreamPredicate other);
} }
@@ -2,6 +2,8 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode; import com.intellij.lang.ASTNode;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.JetNodeTypes;
/** /**
* @author abreslav * @author abreslav
@@ -10,4 +12,18 @@ public class JetDecomposerPattern extends JetPattern {
public JetDecomposerPattern(@NotNull ASTNode node) { public JetDecomposerPattern(@NotNull ASTNode node) {
super(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) { private void visitPattern(JetPattern pattern) {
visitJetElement(pattern); visitJetElement(pattern);
} }
public void visitDecomposerPattern(JetDecomposerPattern pattern) {
visitPattern(pattern);
}
} }
@@ -888,7 +888,7 @@ public class JetTypeInferrer {
List<JetExpression> entries = expression.getEntries(); List<JetExpression> entries = expression.getEntries();
List<JetType> types = new ArrayList<JetType>(); List<JetType> types = new ArrayList<JetType>();
for (JetExpression entry : entries) { for (JetExpression entry : entries) {
types.add(getType(scope, entry, false)); types.add(safeGetType(scope, entry, false));
} }
// TODO : labels // TODO : labels
result = JetStandardClasses.getTupleType(types); result = JetStandardClasses.getTupleType(types);
@@ -1069,7 +1069,7 @@ public class JetTypeInferrer {
TypeConstructor typeConstructor = subjectType.getConstructor(); TypeConstructor typeConstructor = subjectType.getConstructor();
if (!JetStandardClasses.getTuple(entries.size()).getTypeConstructor().equals(typeConstructor) if (!JetStandardClasses.getTuple(entries.size()).getTypeConstructor().equals(typeConstructor)
|| typeConstructor.getParameters().size() != entries.size()) { || 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 { else {
for (int i = 0, entriesSize = entries.size(); i < entriesSize; i++) { 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) { private void checkTypeCompatibility(@Nullable JetType type, @NotNull JetType subjectType, @NotNull JetElement reportErrorOn) {
if (type == null) { if (type == null) {
return; return;
+5 -1
View File
@@ -43,5 +43,9 @@ fun test() {
is (1, 1) => 1 is (1, 1) => 1
is (1, <error>"1"</error>) => 1 is (1, <error>"1"</error>) => 1
is <error>(1, "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(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -1,4 +1,5 @@
fun foo() { 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, c>(d))
foo(bar<a, b+1, c>(d)) foo(bar<a, b+1, c>(d))
foo(bar<a, f(), c>(d)) foo(bar<a, f(), c>(d))
@@ -11,6 +11,78 @@ JetFile: TypeExpressionAmbiguities_ERR.jet
BLOCK BLOCK
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ') 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 CALL_EXPRESSION
REFERENCE_EXPRESSION REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo') PsiElement(IDENTIFIER)('foo')
+29 -29
View File
@@ -145,7 +145,7 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -153,7 +153,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -178,7 +178,7 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -186,7 +186,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -465,13 +465,13 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN EXPRESSION_PATTERN
NULL NULL
PsiElement(null)('null') PsiElement(null)('null')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
BINDING_PATTERN BINDING_PATTERN
PsiElement(val)('val') PsiElement(val)('val')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
@@ -495,7 +495,7 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -503,7 +503,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -528,7 +528,7 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -536,7 +536,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -565,7 +565,7 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -573,7 +573,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -602,7 +602,7 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
PsiElement(IDENTIFIER)('foo') PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(EQ)('=') PsiElement(EQ)('=')
@@ -614,7 +614,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
PsiElement(IDENTIFIER)('bar') PsiElement(IDENTIFIER)('bar')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(EQ)('=') PsiElement(EQ)('=')
@@ -651,7 +651,7 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -659,7 +659,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -684,7 +684,7 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
BINDING_PATTERN BINDING_PATTERN
PsiElement(val)('val') PsiElement(val)('val')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
@@ -699,7 +699,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('T') PsiElement(IDENTIFIER)('T')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -724,7 +724,7 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -732,7 +732,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('b') PsiElement(IDENTIFIER)('b')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN EXPRESSION_PATTERN
INTEGER_CONSTANT INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1') PsiElement(INTEGER_LITERAL)('1')
@@ -952,7 +952,7 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -1080,13 +1080,13 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN EXPRESSION_PATTERN
NULL NULL
PsiElement(null)('null') PsiElement(null)('null')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
BINDING_PATTERN BINDING_PATTERN
PsiElement(val)('val') PsiElement(val)('val')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
@@ -1105,7 +1105,7 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -1113,7 +1113,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -1169,7 +1169,7 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -1177,7 +1177,7 @@ JetFile: When.jet
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -1206,14 +1206,14 @@ JetFile: When.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
BINDING_PATTERN BINDING_PATTERN
PsiElement(val)('val') PsiElement(val)('val')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('b') PsiElement(IDENTIFIER)('b')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
+8 -8
View File
@@ -1351,13 +1351,13 @@ JetFile: BinaryTree.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN EXPRESSION_PATTERN
NULL NULL
PsiElement(null)('null') PsiElement(null)('null')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN EXPRESSION_PATTERN
NULL NULL
PsiElement(null)('null') PsiElement(null)('null')
@@ -1392,13 +1392,13 @@ JetFile: BinaryTree.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN EXPRESSION_PATTERN
NULL NULL
PsiElement(null)('null') PsiElement(null)('null')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -1435,7 +1435,7 @@ JetFile: BinaryTree.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -1443,7 +1443,7 @@ JetFile: BinaryTree.jet
PsiElement(IDENTIFIER)('left') PsiElement(IDENTIFIER)('left')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
EXPRESSION_PATTERN EXPRESSION_PATTERN
NULL NULL
PsiElement(null)('null') PsiElement(null)('null')
@@ -1478,7 +1478,7 @@ JetFile: BinaryTree.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT_LIST DECOMPOSER_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE
@@ -1486,7 +1486,7 @@ JetFile: BinaryTree.jet
PsiElement(IDENTIFIER)('left') PsiElement(IDENTIFIER)('left')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
DECOMPOSER_ARGUMENT TUPLE_PATTERN_ENTRY
TYPE_PATTERN TYPE_PATTERN
TYPE_REFERENCE TYPE_REFERENCE
USER_TYPE USER_TYPE