diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 8927ebcdbc4..d28c5c02ce2 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -8,6 +8,7 @@ import com.intellij.psi.util.PsiTreeUtil; import jet.IntRange; import jet.JetObject; import jet.NoPatternMatchedException; +import jet.Range; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; @@ -40,6 +41,7 @@ public class ExpressionCodegen extends JetVisitor { private static final String CLASS_ITERABLE = "java/lang/Iterable"; private static final String CLASS_ITERATOR = "java/util/Iterator"; + private static final String CLASS_RANGE = "jet/Range"; private static final String CLASS_INT_RANGE = "jet/IntRange"; private static final String CLASS_NO_PATTERN_MATCHED_EXCEPTION = "jet/NoPatternMatchedException"; @@ -50,6 +52,7 @@ public class ExpressionCodegen extends JetVisitor { private static final Type OBJECT_TYPE = Type.getType(Object.class); private static final Type ITERATOR_TYPE = Type.getType(Iterator.class); + private static final Type RANGE_TYPE = Type.getType(Range.class); private static final Type INT_RANGE_TYPE = Type.getType(IntRange.class); private static final Type JET_OBJECT_TYPE = Type.getType(JetObject.class); private static final Type NO_PATTERN_MATCHED_EXCEPTION_TYPE = Type.getType(NoPatternMatchedException.class); @@ -1406,6 +1409,13 @@ public class ExpressionCodegen extends JetVisitor { generateEqualsForExpressionsOnStack(JetTokens.EQEQ, subjectType, condType); myStack.pop().condJump(nextEntry, true, v); } + else if (condition instanceof JetWhenConditionInRange) { + JetExpression range = ((JetWhenConditionInRange) condition).getRangeExpression(); + gen(range, RANGE_TYPE); + new StackValue.Local(subjectLocal, subjectType).put(OBJECT_TYPE, v); + v.invokeinterface(CLASS_RANGE, "contains", "(Ljava/lang/Comparable;)Z"); + new StackValue.OnStack(Type.BOOLEAN_TYPE).condJump(nextEntry, true, v); + } else { throw new UnsupportedOperationException("unsupported kind of when condition"); } diff --git a/idea/testData/codegen/patternMatching/range.jet b/idea/testData/codegen/patternMatching/range.jet new file mode 100644 index 00000000000..329a4234971 --- /dev/null +++ b/idea/testData/codegen/patternMatching/range.jet @@ -0,0 +1,4 @@ +fun isDigit(a: Int) = when(a) { + in 0..9 => "digit" + else => "something" +} diff --git a/idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java b/idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java index 1cd98049184..eb4436d6507 100644 --- a/idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java @@ -41,4 +41,12 @@ public class PatternMatchingTest extends CodegenTestCase { assertEquals("string", foo.invoke(null, "")); assertEquals("something", foo.invoke(null, new Object())); } + + public void testRange() throws Exception { + loadFile(); + System.out.println(generateToText()); + Method foo = generateFunction(); + assertEquals("digit", foo.invoke(null, 9)); + assertEquals("something", foo.invoke(null, 19)); + } }