From a1e055af89d3ef3a5e77b22b675db43939ec82f1 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 20 May 2011 22:24:13 +0400 Subject: [PATCH] Decomposer patterns supported: any expression resolvable in the context of the matched one and returning a tuple is a decomposer --- idea/src/org/jetbrains/jet/JetNodeTypes.java | 2 +- .../jet/lang/annotations/JetPsiChecker.java | 6 +- .../jet/lang/cfg/JetControlFlowProcessor.java | 6 ++ .../jet/lang/parsing/AbstractJetParsing.java | 56 ++++++++++++--- .../parsing/AbstractTokenStreamPattern.java | 11 +++ .../parsing/AbstractTokenStreamPredicate.java | 18 +++++ .../lang/parsing/JetExpressionParsing.java | 12 +++- .../jet/lang/parsing/JetParsing.java | 5 +- .../jet/lang/parsing/TokenStreamPattern.java | 11 ++- .../lang/parsing/TokenStreamPredicate.java | 2 + .../jet/lang/psi/JetDecomposerPattern.java | 16 +++++ .../jetbrains/jet/lang/psi/JetVisitor.java | 4 ++ .../jet/lang/types/JetTypeInferrer.java | 11 ++- idea/testData/checker/When.jet | 6 +- idea/testData/psi/RootNamespace.txt | 2 +- .../psi/TypeExpressionAmbiguities_ERR.jet | 1 + .../psi/TypeExpressionAmbiguities_ERR.txt | 72 +++++++++++++++++++ idea/testData/psi/When.txt | 58 +++++++-------- idea/testData/psi/examples/BinaryTree.txt | 16 ++--- 19 files changed, 256 insertions(+), 59 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/lang/parsing/AbstractTokenStreamPredicate.java diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java index 0eeb28d8159..166640903dc 100644 --- a/idea/src/org/jetbrains/jet/JetNodeTypes.java +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -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); diff --git a/idea/src/org/jetbrains/jet/lang/annotations/JetPsiChecker.java b/idea/src/org/jetbrains/jet/lang/annotations/JetPsiChecker.java index 8b62f57ce68..9687851af75 100644 --- a/idea/src/org/jetbrains/jet/lang/annotations/JetPsiChecker.java +++ b/idea/src/org/jetbrains/jet/lang/annotations/JetPsiChecker.java @@ -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); } diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index c72493f7be4..9c2cd502407 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -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()); diff --git a/idea/src/org/jetbrains/jet/lang/parsing/AbstractJetParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/AbstractJetParsing.java index c9ce19b2867..f99e0218f70 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/AbstractJetParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/AbstractJetParsing.java @@ -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 opens = new Stack(); 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; + } + } } diff --git a/idea/src/org/jetbrains/jet/lang/parsing/AbstractTokenStreamPattern.java b/idea/src/org/jetbrains/jet/lang/parsing/AbstractTokenStreamPattern.java index 03c7fb86010..43499269ca3 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/AbstractTokenStreamPattern.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/AbstractTokenStreamPattern.java @@ -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; + } } diff --git a/idea/src/org/jetbrains/jet/lang/parsing/AbstractTokenStreamPredicate.java b/idea/src/org/jetbrains/jet/lang/parsing/AbstractTokenStreamPredicate.java new file mode 100644 index 00000000000..0cdf5b611a7 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/parsing/AbstractTokenStreamPredicate.java @@ -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); + } + }; + } +} diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index 7ddb116c475..66143c837c3 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -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(); diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java index 76c83715607..3a8b724f278 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java @@ -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; diff --git a/idea/src/org/jetbrains/jet/lang/parsing/TokenStreamPattern.java b/idea/src/org/jetbrains/jet/lang/parsing/TokenStreamPattern.java index 8035cd652b6..64b026d59b4 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/TokenStreamPattern.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/TokenStreamPattern.java @@ -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); } diff --git a/idea/src/org/jetbrains/jet/lang/parsing/TokenStreamPredicate.java b/idea/src/org/jetbrains/jet/lang/parsing/TokenStreamPredicate.java index 41db1f39f19..a619d46755b 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/TokenStreamPredicate.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/TokenStreamPredicate.java @@ -5,4 +5,6 @@ package org.jetbrains.jet.lang.parsing; */ public interface TokenStreamPredicate { boolean matching(boolean topLevel); + + TokenStreamPredicate or(TokenStreamPredicate other); } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetDecomposerPattern.java b/idea/src/org/jetbrains/jet/lang/psi/JetDecomposerPattern.java index e3ecc5a13a5..e123ac4aeab 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetDecomposerPattern.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetDecomposerPattern.java @@ -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); + } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java index edcefa6b9e8..3d2779e1b10 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java @@ -385,4 +385,8 @@ public class JetVisitor extends PsiElementVisitor { private void visitPattern(JetPattern pattern) { visitJetElement(pattern); } + + public void visitDecomposerPattern(JetDecomposerPattern pattern) { + visitPattern(pattern); + } } diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index a8d1fe84111..11538e6dec4 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -888,7 +888,7 @@ public class JetTypeInferrer { List entries = expression.getEntries(); List types = new ArrayList(); 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; diff --git a/idea/testData/checker/When.jet b/idea/testData/checker/When.jet index 0ba241e365a..11e780d1034 100644 --- a/idea/testData/checker/When.jet +++ b/idea/testData/checker/When.jet @@ -43,5 +43,9 @@ fun test() { is (1, 1) => 1 is (1, "1") => 1 is (1, "1", *) => 1 + is boo @ (1, "a", *) => 1 + is boo @ (1, *) => 1 } -} \ No newline at end of file +} + +val (Int, Int).boo : (Int, Int, Int) = (1, 1, 1) diff --git a/idea/testData/psi/RootNamespace.txt b/idea/testData/psi/RootNamespace.txt index 36f3bf77468..491a2930473 100644 --- a/idea/testData/psi/RootNamespace.txt +++ b/idea/testData/psi/RootNamespace.txt @@ -107,7 +107,7 @@ JetFile: RootNamespace.jet PsiWhiteSpace(' ') DECOMPOSER_ARGUMENT_LIST PsiElement(LPAR)('(') - DECOMPOSER_ARGUMENT + TUPLE_PATTERN_ENTRY TYPE_PATTERN TYPE_REFERENCE USER_TYPE diff --git a/idea/testData/psi/TypeExpressionAmbiguities_ERR.jet b/idea/testData/psi/TypeExpressionAmbiguities_ERR.jet index 02e849f937f..42e4918a0ed 100644 --- a/idea/testData/psi/TypeExpressionAmbiguities_ERR.jet +++ b/idea/testData/psi/TypeExpressionAmbiguities_ERR.jet @@ -1,4 +1,5 @@ fun foo() { + dd<(Int, Int, Int)>(if (true) (1, 1, 1) else (2, 2, 2)) foo(bar(d)) foo(bar(d)) foo(bar(d)) diff --git a/idea/testData/psi/TypeExpressionAmbiguities_ERR.txt b/idea/testData/psi/TypeExpressionAmbiguities_ERR.txt index 636c284bbea..0f4338ef3b8 100644 --- a/idea/testData/psi/TypeExpressionAmbiguities_ERR.txt +++ b/idea/testData/psi/TypeExpressionAmbiguities_ERR.txt @@ -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') diff --git a/idea/testData/psi/When.txt b/idea/testData/psi/When.txt index ce04da868f3..3c76d08e1ad 100644 --- a/idea/testData/psi/When.txt +++ b/idea/testData/psi/When.txt @@ -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 diff --git a/idea/testData/psi/examples/BinaryTree.txt b/idea/testData/psi/examples/BinaryTree.txt index ab177ef66d9..9b6eab8d8b4 100644 --- a/idea/testData/psi/examples/BinaryTree.txt +++ b/idea/testData/psi/examples/BinaryTree.txt @@ -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