From d953079635cec5068c62a8487449d505cbfaa691 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 19 May 2011 20:05:30 +0200 Subject: [PATCH] generate wildcard patterns --- .../jet/codegen/ExpressionCodegen.java | 19 ++++++++++++------- .../jet/codegen/PatternMatchingTest.java | 6 ++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 2d0eb217f87..a21ea8a50dc 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1347,14 +1347,19 @@ public class ExpressionCodegen extends JetVisitor { } private void generatePatternMatch(JetPattern pattern, boolean negated, Runnable expressionGen) { - if (!(pattern instanceof JetTypePattern)) { - throw new UnsupportedOperationException("can only generate a type pattern with 'is'"); + if (pattern instanceof JetTypePattern) { + JetTypeReference typeReference = ((JetTypePattern) pattern).getTypeReference(); + JetType jetType = bindingContext.resolveTypeReference(typeReference); + generateInstanceOf(expressionGen, jetType, false); + StackValue value = StackValue.onStack(Type.BOOLEAN_TYPE); + myStack.push(negated ? StackValue.not(value) : value); + } + else if (pattern instanceof JetWildcardPattern) { + myStack.push(StackValue.constant(!negated, Type.BOOLEAN_TYPE)); + } + else { + throw new UnsupportedOperationException("Unsupported pattern type: " + pattern); } - JetTypeReference typeReference = ((JetTypePattern) pattern).getTypeReference(); - JetType jetType = bindingContext.resolveTypeReference(typeReference); - generateInstanceOf(expressionGen, jetType, false); - StackValue value = StackValue.onStack(Type.BOOLEAN_TYPE); - myStack.push(negated ? StackValue.not(value) : value); } private void generateInstanceOf(Runnable expressionGen, JetType jetType, boolean leaveExpressionOnStack) { diff --git a/idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java b/idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java index 2f0703678a7..eaf9ee21c3f 100644 --- a/idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java @@ -49,4 +49,10 @@ public class PatternMatchingTest extends CodegenTestCase { assertEquals("digit", foo.invoke(null, 9)); assertEquals("something", foo.invoke(null, 19)); } + + public void testWildcardPattern() throws Exception { + loadText("fun foo(x: String) = when(x) { is * => \"something\" }"); + Method foo = generateFunction(); + assertEquals("something", foo.invoke(null, "")); + } }