generate wildcard patterns

This commit is contained in:
Dmitry Jemerov
2011-05-19 20:05:30 +02:00
parent a58672515a
commit d953079635
2 changed files with 18 additions and 7 deletions
@@ -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) {
@@ -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, ""));
}
}