generate wildcard patterns
This commit is contained in:
@@ -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, ""));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user