From 92a3e9275ca3bdfc6e0d53dc4c7710a7ca11478c Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 19 May 2011 16:09:31 +0200 Subject: [PATCH] pattern matching for expressions --- .../jet/codegen/ExpressionCodegen.java | 87 ++++++++++++++++--- .../org/jetbrains/jet/codegen/FrameMap.java | 10 +++ .../codegen/patternMatching/constant.jet | 4 + .../patternMatching/exceptionOnNoMatch.jet | 3 + .../jet/codegen/PatternMatchingTest.java | 37 ++++++++ stdlib/src/jet/NoPatternMatchedException.java | 7 ++ 6 files changed, 136 insertions(+), 12 deletions(-) create mode 100644 idea/testData/codegen/patternMatching/constant.jet create mode 100644 idea/testData/codegen/patternMatching/exceptionOnNoMatch.jet create mode 100644 idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java create mode 100644 stdlib/src/jet/NoPatternMatchedException.java diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 2a1e5c8f2d2..8927ebcdbc4 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -7,11 +7,15 @@ import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; import jet.IntRange; import jet.JetObject; +import jet.NoPatternMatchedException; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.types.*; +import org.jetbrains.jet.lang.types.JetStandardClasses; +import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.TypeProjection; +import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.resolve.DescriptorRenderer; import org.objectweb.asm.Label; @@ -37,6 +41,7 @@ public class ExpressionCodegen extends JetVisitor { private static final String CLASS_ITERATOR = "java/util/Iterator"; private static final String CLASS_INT_RANGE = "jet/IntRange"; + private static final String CLASS_NO_PATTERN_MATCHED_EXCEPTION = "jet/NoPatternMatchedException"; private static final String ITERABLE_ITERATOR_DESCRIPTOR = "()Ljava/util/Iterator;"; private static final String ITERATOR_HASNEXT_DESCRIPTOR = "()Z"; @@ -47,6 +52,7 @@ public class ExpressionCodegen extends JetVisitor { private static final Type ITERATOR_TYPE = Type.getType(Iterator.class); private static final Type INT_RANGE_TYPE = Type.getType(IntRange.class); private static final Type JET_OBJECT_TYPE = Type.getType(JetObject.class); + private static final Type NO_PATTERN_MATCHED_EXCEPTION_TYPE = Type.getType(NoPatternMatchedException.class); private final Stack