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) { private void generatePatternMatch(JetPattern pattern, boolean negated, Runnable expressionGen) {
if (!(pattern instanceof JetTypePattern)) { if (pattern instanceof JetTypePattern) {
throw new UnsupportedOperationException("can only generate a type pattern with 'is'"); 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) { 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("digit", foo.invoke(null, 9));
assertEquals("something", foo.invoke(null, 19)); 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, ""));
}
} }