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:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user