From 298407210e8fd582887572c59ba8f74f6c2baf54 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 19 May 2011 22:53:03 +0400 Subject: [PATCH] Working on patterns + Constructor for Array --- idea/src/jet/Library.jet | 2 +- idea/src/org/jetbrains/jet/JetNodeTypes.java | 10 +++--- .../jet/lang/cfg/JetControlFlowProcessor.java | 10 ++++++ .../jet/lang/psi/JetBindingPattern.java | 21 +++++++++++++ .../jet/lang/psi/JetDecomposerPattern.java | 13 ++++++++ .../jet/lang/psi/JetExpressionPattern.java | 23 ++++++++++++++ .../jet/lang/psi/JetTuplePattern.java | 26 ++++++++++++++++ .../jet/lang/psi/JetTuplePatternEntry.java | 31 +++++++++++++++++++ .../jetbrains/jet/lang/psi/JetVisitor.java | 20 ++++++++---- .../jet/lang/types/JetTypeInferrer.java | 18 +++++++++++ 10 files changed, 162 insertions(+), 12 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetBindingPattern.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetDecomposerPattern.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetExpressionPattern.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetTuplePattern.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetTuplePatternEntry.java diff --git a/idea/src/jet/Library.jet b/idea/src/jet/Library.jet index e428ef10db5..950ea00e93e 100644 --- a/idea/src/jet/Library.jet +++ b/idea/src/jet/Library.jet @@ -17,7 +17,7 @@ class Iterable { fun iterator() : Iterator } -class Array { +class Array(val size : Int) { fun get(index : Int) : T fun set(index : Int, value : T) : Unit diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java index 32ab360a69c..3200017a44c 100644 --- a/idea/src/org/jetbrains/jet/JetNodeTypes.java +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -117,13 +117,13 @@ public interface JetNodeTypes { JetNodeType OBJECT_LITERAL = new JetNodeType("OBJECT_LITERAL", JetObjectLiteralExpression.class); JetNodeType ROOT_NAMESPACE = new JetNodeType("ROOT_NAMESPACE", JetRootNamespaceExpression.class); - JetNodeType EXPRESSION_PATTERN = new JetNodeType("EXPRESSION_PATTERN", JetPattern.class); // TODO + JetNodeType EXPRESSION_PATTERN = new JetNodeType("EXPRESSION_PATTERN", JetExpressionPattern.class); JetNodeType TYPE_PATTERN = new JetNodeType("TYPE_PATTERN", JetTypePattern.class); JetNodeType WILDCARD_PATTERN = new JetNodeType("WILDCARD_PATTERN", JetWildcardPattern.class); - JetNodeType BINDING_PATTERN = new JetNodeType("BINDING_PATTERN", JetPattern.class); // TODO - JetNodeType TUPLE_PATTERN = new JetNodeType("TUPLE_PATTERN", JetPattern.class); // TODO - JetNodeType TUPLE_PATTERN_ENTRY = new JetNodeType("TUPLE_PATTERN_ENTRY"); - JetNodeType DECOMPOSER_PATTERN = new JetNodeType("DECOMPOSER_PATTERN", JetPattern.class); // TODO + JetNodeType BINDING_PATTERN = new JetNodeType("BINDING_PATTERN", JetBindingPattern.class); + JetNodeType TUPLE_PATTERN = new JetNodeType("TUPLE_PATTERN", JetTuplePattern.class); + 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"); JetNodeType DECOMPOSER_ARGUMENT = new JetNodeType("DECOMPOSER_ARGUMENT"); diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 69ed7f05f88..c72493f7be4 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -662,6 +662,16 @@ public class JetControlFlowProcessor { // TODO } + @Override + public void visitExpressionPattern(JetExpressionPattern pattern) { + value(pattern.getExpression(), false, inCondition); + } + + @Override + public void visitTuplePattern(JetTuplePattern pattern) { + // TODO + } + @Override public void visitJetElement(JetElement elem) { throw new UnsupportedOperationException("[JetControlFlowProcessor] " + elem.toString()); diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetBindingPattern.java b/idea/src/org/jetbrains/jet/lang/psi/JetBindingPattern.java new file mode 100644 index 00000000000..e7343798308 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetBindingPattern.java @@ -0,0 +1,21 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lexer.JetTokens; + +/** + * @author abreslav + */ +public class JetBindingPattern extends JetPattern { + public JetBindingPattern(@NotNull ASTNode node) { + super(node); + } + + public boolean isVar() { + return findChildByType(JetTokens.VAR_KEYWORD) != null; + } + + + +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetDecomposerPattern.java b/idea/src/org/jetbrains/jet/lang/psi/JetDecomposerPattern.java new file mode 100644 index 00000000000..e3ecc5a13a5 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetDecomposerPattern.java @@ -0,0 +1,13 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * @author abreslav + */ +public class JetDecomposerPattern extends JetPattern { + public JetDecomposerPattern(@NotNull ASTNode node) { + super(node); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetExpressionPattern.java b/idea/src/org/jetbrains/jet/lang/psi/JetExpressionPattern.java new file mode 100644 index 00000000000..1f8a61c9611 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetExpressionPattern.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * @author abreslav + */ +public class JetExpressionPattern extends JetPattern { + public JetExpressionPattern(@NotNull ASTNode node) { + super(node); + } + + @NotNull + public JetExpression getExpression() { + return findChildByClass(JetExpression.class); + } + + @Override + public void accept(@NotNull JetVisitor visitor) { + visitor.visitExpressionPattern(this); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetTuplePattern.java b/idea/src/org/jetbrains/jet/lang/psi/JetTuplePattern.java new file mode 100644 index 00000000000..f887ef54183 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetTuplePattern.java @@ -0,0 +1,26 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.JetNodeTypes; + +import java.util.List; + +/** + * @author abreslav + */ +public class JetTuplePattern extends JetPattern { + public JetTuplePattern(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(@NotNull JetVisitor visitor) { + visitor.visitTuplePattern(this); + } + + @NotNull + public List getEntries() { + return findChildrenByType(JetNodeTypes.TUPLE_PATTERN_ENTRY); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetTuplePatternEntry.java b/idea/src/org/jetbrains/jet/lang/psi/JetTuplePatternEntry.java new file mode 100644 index 00000000000..c933a950c90 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetTuplePatternEntry.java @@ -0,0 +1,31 @@ +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.lexer.JetTokens; + +/** + * @author abreslav + */ +public class JetTuplePatternEntry extends JetElement { + public JetTuplePatternEntry(@NotNull ASTNode node) { + super(node); + } + + @Nullable + public ASTNode getNameLabelNode() { + return getNode().findChildByType(JetTokens.IDENTIFIER); + } + + @Nullable + public String getNameLabel() { + ASTNode nameLabelNode = getNameLabelNode(); + return nameLabelNode == null ? null : nameLabelNode.getText(); + } + + @Nullable @IfNotParsed + public JetPattern getPattern() { + return findChildByClass(JetPattern.class); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java index fd1178cae14..edcefa6b9e8 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java @@ -366,15 +366,23 @@ public class JetVisitor extends PsiElementVisitor { visitJetElement(condition); } - public void visitTypePattern(JetTypePattern typePattern) { - visitPattern(typePattern); - } - - public void visitPattern(JetPattern pattern) { - visitJetElement(pattern); + public void visitTypePattern(JetTypePattern pattern) { + visitPattern(pattern); } public void visitWildcardPattern(JetWildcardPattern pattern) { visitPattern(pattern); } + + public void visitExpressionPattern(JetExpressionPattern pattern) { + visitPattern(pattern); + } + + public void visitTuplePattern(JetTuplePattern pattern) { + visitPattern(pattern); + } + + private void visitPattern(JetPattern pattern) { + visitJetElement(pattern); + } } diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 655d33dca3f..9969f249a80 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -1038,6 +1038,24 @@ public class JetTypeInferrer { // Nothing } + @Override + public void visitExpressionPattern(JetExpressionPattern pattern) { + getType(scope, pattern.getExpression(), false); // TODO : check type compatibility + trace.getErrorHandler().genericWarning(pattern.getNode(), "TODO : Types not checked"); + } + + @Override + public void visitTuplePattern(JetTuplePattern pattern) { + for (JetTuplePatternEntry entry : pattern.getEntries()) { + // TODO : is a name always allowed, ie for tuple patterns, not decomposer arg lists? + String nameLabel = entry.getNameLabel(); + JetPattern entryPattern = entry.getPattern(); + if (entryPattern != null) { + entryPattern.accept(this); // TODO : type checking + } + } + } + @Override public void visitJetElement(JetElement elem) { trace.getErrorHandler().genericError(elem.getNode(), "Unsupported [JetTypeInferrer]");