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) {
|
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, ""));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user