From 737b794935a49f291317e228bf8b214114a08632 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Fri, 31 Aug 2012 13:48:25 +0300 Subject: [PATCH] fix for KT-2711 wrong check on descriptor being integral range method added to JetStandardLibrary to get all integral range descriptors #KT-2711 fixed --- .../jet/codegen/ExpressionCodegen.java | 9 ++------- .../lang/types/lang/JetStandardLibrary.java | 20 ++++++++++++++----- .../testData/codegen/regressions/kt2711.kt | 14 +++++++++++++ .../jetbrains/jet/codegen/ClassGenTest.java | 5 +++++ 4 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2711.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index c7333cde379..ad4451cfb21 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -74,6 +74,7 @@ public class ExpressionCodegen extends JetVisitor implem private static final String CLASS_NO_PATTERN_MATCHED_EXCEPTION = "jet/NoPatternMatchedException"; private static final String CLASS_TYPE_CAST_EXCEPTION = "jet/TypeCastException"; + public static final Set INTEGRAL_RANGES = JetStandardLibrary.getInstance().getIntegralRanges(); private int myLastLineNumber = -1; @@ -3535,13 +3536,7 @@ The "returned" value of try expression with no finally is either the last expres JetType jetType = bindingContext.get(BindingContext.EXPRESSION_TYPE, rangeExpression); assert jetType != null; final DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor(); - if (isClass(descriptor, "IntRange") || - isClass(descriptor, "CharRange") || - isClass(descriptor, "ByteRange") || - isClass(descriptor, "LongRange") || - isClass(descriptor, "ShortRange")) { - return true; - } + return INTEGRAL_RANGES.contains(descriptor); } } return false; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardLibrary.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardLibrary.java index c7282b754f1..1c381ef5faa 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardLibrary.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardLibrary.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.types.lang; +import com.google.common.collect.ImmutableSet; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; @@ -23,6 +24,7 @@ import com.intellij.psi.PsiFileFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.JetFile; @@ -34,11 +36,7 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; -import org.jetbrains.jet.lang.types.JetType; -import org.jetbrains.jet.lang.types.JetTypeImpl; -import org.jetbrains.jet.lang.types.TypeProjection; -import org.jetbrains.jet.lang.types.TypeUtils; -import org.jetbrains.jet.lang.types.Variance; +import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.plugin.JetFileType; import java.io.IOException; @@ -218,6 +216,18 @@ public class JetStandardLibrary { jetArrayTypeToPrimitiveJetType.put(arrayType, type); } + public Set getIntegralRanges() { + initStdClasses(); + + return ImmutableSet.of( + getStdClassByName("ByteRange"), + getStdClassByName("ShortRange"), + getStdClassByName("CharRange"), + getStdClassByName("IntRange"), + getStdClassByName("LongRange") + ); + } + public Collection getStandardTypes() { initStdClasses(); diff --git a/compiler/testData/codegen/regressions/kt2711.kt b/compiler/testData/codegen/regressions/kt2711.kt new file mode 100644 index 00000000000..b58fd12aaea --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2711.kt @@ -0,0 +1,14 @@ +class IntRange { + fun contains(a: Int) = (1..2).contains(a) +} + +class C() { + fun rangeTo(i: Int) = IntRange() +} + + +fun main(args: Array) { + if (2 in C()..2) { + System.out?.println(2) + } +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java index e8eaa6898dc..6b5e8e9a334 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java @@ -533,4 +533,9 @@ public class ClassGenTest extends CodegenTestCase { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); blackBoxFile("regressions/kt1535.kt"); } + + public void testKt2711() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("regressions/kt2711.kt"); + } }