diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/RangeTo.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/RangeTo.kt index 36dca6d3b0d..27451b5a5a2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/RangeTo.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/RangeTo.kt @@ -24,20 +24,23 @@ import org.jetbrains.org.objectweb.asm.Type.* import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter class RangeTo : IntrinsicMethod() { - private fun nameToPrimitive(name: String): Type = - when (name) { - "Double" -> DOUBLE_TYPE - "Float" -> FLOAT_TYPE - "Long" -> LONG_TYPE - "Int" -> INT_TYPE - "Short" -> SHORT_TYPE - "Char" -> CHAR_TYPE - "Byte" -> BYTE_TYPE - else -> throw IllegalStateException("RangeTo intrinsic can only work for primitive types: $name") - } + private fun rangeTypeToPrimitiveType(rangeType: Type): Type { + val fqName = rangeType.internalName + val name = fqName.substringAfter("kotlin/ranges/").substringBefore("Range") + return when (name) { + "Double" -> DOUBLE_TYPE + "Float" -> FLOAT_TYPE + "Long" -> LONG_TYPE + "Int" -> INT_TYPE + "Short" -> SHORT_TYPE + "Char" -> CHAR_TYPE + "Byte" -> BYTE_TYPE + else -> throw IllegalStateException("RangeTo intrinsic can only work for primitive types: $fqName") + } + } override fun toCallable(method: CallableMethod): Callable { - val argType = nameToPrimitive(method.returnType.internalName.substringAfter("kotlin/").substringBefore("Range")) + val argType = rangeTypeToPrimitiveType(method.returnType) return object : IntrinsicCallable( method.returnType, method.valueParameterTypes.map { argType }, diff --git a/core/builtins/src/kotlin/Iterators.kt b/core/builtins/src/kotlin/Iterators.kt index dc03217efee..9916b3ec352 100644 --- a/core/builtins/src/kotlin/Iterators.kt +++ b/core/builtins/src/kotlin/Iterators.kt @@ -16,7 +16,7 @@ // Auto-generated file. DO NOT EDIT! -package kotlin +package kotlin.collections /** An iterator over a sequence of values of type `Byte`. */ public abstract class ByteIterator : Iterator { diff --git a/core/builtins/src/kotlin/ProgressionIterators.kt b/core/builtins/src/kotlin/ProgressionIterators.kt index 7cbfb64795d..32022ef050a 100644 --- a/core/builtins/src/kotlin/ProgressionIterators.kt +++ b/core/builtins/src/kotlin/ProgressionIterators.kt @@ -16,7 +16,7 @@ // Auto-generated file. DO NOT EDIT! -package kotlin +package kotlin.ranges /** * An iterator over a progression of values of type `Byte`. diff --git a/core/builtins/src/kotlin/Progressions.kt b/core/builtins/src/kotlin/Progressions.kt index e3e326dc30e..698ba36a4e4 100644 --- a/core/builtins/src/kotlin/Progressions.kt +++ b/core/builtins/src/kotlin/Progressions.kt @@ -16,7 +16,7 @@ // Auto-generated file. DO NOT EDIT! -package kotlin +package kotlin.ranges import kotlin.internal.getProgressionLastElement diff --git a/core/builtins/src/kotlin/Range.kt b/core/builtins/src/kotlin/Range.kt index 825e688ce2a..892155ebe4b 100644 --- a/core/builtins/src/kotlin/Range.kt +++ b/core/builtins/src/kotlin/Range.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package kotlin +package kotlin.ranges /** * Represents a range of values (for example, numbers or characters). diff --git a/core/builtins/src/kotlin/Ranges.kt b/core/builtins/src/kotlin/Ranges.kt index 5952d1c7d0b..9397e111c61 100644 --- a/core/builtins/src/kotlin/Ranges.kt +++ b/core/builtins/src/kotlin/Ranges.kt @@ -16,7 +16,7 @@ // Auto-generated file. DO NOT EDIT! -package kotlin +package kotlin.ranges @Deprecated("Use IntRange instead.", ReplaceWith("IntRange"), level = DeprecationLevel.WARNING) /** diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/specialBuiltinMembers.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/specialBuiltinMembers.kt index cc0e10b7150..f1220e301b0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/specialBuiltinMembers.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/specialBuiltinMembers.kt @@ -274,7 +274,7 @@ fun ClassDescriptor.hasRealKotlinSuperClassWithOverrideOf( if (doesOverrideBuiltinDeclaration) { val containingPackageFragment = DescriptorUtils.getParentOfType(superClassDescriptor, PackageFragmentDescriptor::class.java) - if (containingPackageFragment === superClassDescriptor.builtIns.builtInsPackageFragment) return false + if (superClassDescriptor.builtIns.isBuiltInPackageFragment(containingPackageFragment)) return false return true } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index 1f073530f4a..204b79656de 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -50,15 +50,21 @@ public abstract class KotlinBuiltIns { public static final Name BUILT_INS_PACKAGE_NAME = Name.identifier("kotlin"); public static final FqName BUILT_INS_PACKAGE_FQ_NAME = FqName.topLevel(BUILT_INS_PACKAGE_NAME); public static final FqName ANNOTATION_PACKAGE_FQ_NAME = BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier("annotation")); + public static final FqName COLLECTIONS_PACKAGE_FQ_NAME = BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier("collections")); + public static final FqName RANGES_PACKAGE_FQ_NAME = BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier("ranges")); public static final Set BUILT_INS_PACKAGE_FQ_NAMES = setOf( BUILT_INS_PACKAGE_FQ_NAME, + COLLECTIONS_PACKAGE_FQ_NAME, + RANGES_PACKAGE_FQ_NAME, ANNOTATION_PACKAGE_FQ_NAME, ReflectionTypesKt.getKOTLIN_REFLECT_FQ_NAME() ); protected final ModuleDescriptorImpl builtInsModule; private final BuiltinsPackageFragment builtinsPackageFragment; + private final BuiltinsPackageFragment collectionsPackageFragment; + private final BuiltinsPackageFragment rangesPackageFragment; private final BuiltinsPackageFragment annotationPackageFragment; private final Map primitiveTypeToArrayKotlinType; @@ -89,6 +95,8 @@ public abstract class KotlinBuiltIns { builtInsModule.setDependencies(builtInsModule); builtinsPackageFragment = (BuiltinsPackageFragment) single(packageFragmentProvider.getPackageFragments(BUILT_INS_PACKAGE_FQ_NAME)); + collectionsPackageFragment = (BuiltinsPackageFragment) single(packageFragmentProvider.getPackageFragments(COLLECTIONS_PACKAGE_FQ_NAME)); + rangesPackageFragment = (BuiltinsPackageFragment) single(packageFragmentProvider.getPackageFragments(RANGES_PACKAGE_FQ_NAME)); annotationPackageFragment = (BuiltinsPackageFragment) single(packageFragmentProvider.getPackageFragments(ANNOTATION_PACKAGE_FQ_NAME)); primitiveTypeToArrayKotlinType = new EnumMap(PrimitiveType.class); @@ -204,6 +212,10 @@ public abstract class KotlinBuiltIns { return builtinsPackageFragment; } + public boolean isBuiltInPackageFragment(@Nullable PackageFragmentDescriptor packageFragment) { + return packageFragment != null && packageFragment.getContainingDeclaration() == getBuiltInsModule(); + } + @NotNull public MemberScope getBuiltInsPackageScope() { return builtinsPackageFragment.getMemberScope(); @@ -222,24 +234,32 @@ public abstract class KotlinBuiltIns { @NotNull public ClassDescriptor getAnnotationClassByName(@NotNull Name simpleName) { - ClassifierDescriptor classifier = annotationPackageFragment.getMemberScope().getContributedClassifier(simpleName, - NoLookupLocation.FROM_BUILTINS); - assert classifier instanceof ClassDescriptor : "Must be a class descriptor " + simpleName + ", but was " + - (classifier == null ? "null" : classifier.toString()); - return (ClassDescriptor) classifier; + return getBuiltInClassByName(simpleName, annotationPackageFragment); } @NotNull public ClassDescriptor getBuiltInClassByName(@NotNull Name simpleName) { - ClassDescriptor classDescriptor = getBuiltInClassByNameNullable(simpleName); + return getBuiltInClassByName(simpleName, getBuiltInsPackageFragment()); + } + + @NotNull + private static ClassDescriptor getBuiltInClassByName(@NotNull Name simpleName, @NotNull PackageFragmentDescriptor packageFragment) { + ClassDescriptor classDescriptor = getBuiltInClassByNameNullable(simpleName, packageFragment); assert classDescriptor != null : "Built-in class " + simpleName + " is not found"; return classDescriptor; } @Nullable public ClassDescriptor getBuiltInClassByNameNullable(@NotNull Name simpleName) { - ClassifierDescriptor classifier = getBuiltInsPackageFragment().getMemberScope().getContributedClassifier(simpleName, - NoLookupLocation.FROM_BUILTINS); + return getBuiltInClassByNameNullable(simpleName, getBuiltInsPackageFragment()); + } + + @Nullable + private static ClassDescriptor getBuiltInClassByNameNullable(@NotNull Name simpleName, @NotNull PackageFragmentDescriptor packageFragment) { + ClassifierDescriptor classifier = packageFragment.getMemberScope().getContributedClassifier( + simpleName, + NoLookupLocation.FROM_BUILTINS); + assert classifier == null || classifier instanceof ClassDescriptor : "Must be a class descriptor " + simpleName + ", but was " + classifier; return (ClassDescriptor) classifier; @@ -250,6 +270,13 @@ public abstract class KotlinBuiltIns { return getBuiltInClassByName(Name.identifier(simpleName)); } + @NotNull + private static ClassDescriptor getBuiltInClassByName(@NotNull String simpleName, PackageFragmentDescriptor packageFragment) { + return getBuiltInClassByName(Name.identifier(simpleName), packageFragment); + } + + + // Special @NotNull @@ -314,10 +341,10 @@ public abstract class KotlinBuiltIns { @NotNull public Set getIntegralRanges() { return SetsKt.setOf( - getBuiltInClassByName("ByteRange"), - getBuiltInClassByName("ShortRange"), - getBuiltInClassByName("CharRange"), - getBuiltInClassByName("IntRange") + getBuiltInClassByName("ByteRange", rangesPackageFragment), + getBuiltInClassByName("ShortRange", rangesPackageFragment), + getBuiltInClassByName("CharRange", rangesPackageFragment), + getBuiltInClassByName("IntRange", rangesPackageFragment) ); } diff --git a/generators/src/org/jetbrains/kotlin/generators/builtins/iterators.kt b/generators/src/org/jetbrains/kotlin/generators/builtins/iterators.kt index 25a2208846f..7129a2e6644 100644 --- a/generators/src/org/jetbrains/kotlin/generators/builtins/iterators.kt +++ b/generators/src/org/jetbrains/kotlin/generators/builtins/iterators.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.generators.builtins.generateBuiltIns.* import java.io.PrintWriter class GenerateIterators(out: PrintWriter) : BuiltInsSourceGenerator(out) { + override fun getPackage() = "kotlin.collections" override fun generateBody() { for (kind in PrimitiveType.values()) { val s = kind.capitalized diff --git a/generators/src/org/jetbrains/kotlin/generators/builtins/progressionIterators.kt b/generators/src/org/jetbrains/kotlin/generators/builtins/progressionIterators.kt index a9ff00f7b51..ff658a9bd3b 100644 --- a/generators/src/org/jetbrains/kotlin/generators/builtins/progressionIterators.kt +++ b/generators/src/org/jetbrains/kotlin/generators/builtins/progressionIterators.kt @@ -76,6 +76,7 @@ internal class ${t}ProgressionIterator(start: $t, val end: $t, val increment: $t } class GenerateProgressionIterators(out: PrintWriter) : BuiltInsSourceGenerator(out) { + override fun getPackage() = "kotlin.ranges" override fun generateBody() { for (kind in ProgressionKind.values()) { if (kind != FLOAT && kind != DOUBLE) { diff --git a/generators/src/org/jetbrains/kotlin/generators/builtins/progressions.kt b/generators/src/org/jetbrains/kotlin/generators/builtins/progressions.kt index 65715df09b0..fa7c8cbcbe4 100644 --- a/generators/src/org/jetbrains/kotlin/generators/builtins/progressions.kt +++ b/generators/src/org/jetbrains/kotlin/generators/builtins/progressions.kt @@ -23,6 +23,7 @@ import java.io.PrintWriter class GenerateProgressions(out: PrintWriter) : BuiltInsSourceGenerator(out) { + override fun getPackage() = "kotlin.ranges" private fun generateDiscreteBody(kind: ProgressionKind) { require(kind != FLOAT && kind != DOUBLE) diff --git a/generators/src/org/jetbrains/kotlin/generators/builtins/ranges.kt b/generators/src/org/jetbrains/kotlin/generators/builtins/ranges.kt index 84edb42f5a4..76c86cb6142 100644 --- a/generators/src/org/jetbrains/kotlin/generators/builtins/ranges.kt +++ b/generators/src/org/jetbrains/kotlin/generators/builtins/ranges.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.generators.builtins.ProgressionKind.* import java.io.PrintWriter class GenerateRanges(out: PrintWriter) : BuiltInsSourceGenerator(out) { + override fun getPackage() = "kotlin.ranges" override fun generateBody() { for (kind in ProgressionKind.values()) { val t = kind.capitalized diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/DebuggerSteppingHelper.java b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/DebuggerSteppingHelper.java index cd9396323ad..bf385726d48 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/DebuggerSteppingHelper.java +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/stepping/DebuggerSteppingHelper.java @@ -24,7 +24,8 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiElement; import com.intellij.xdebugger.impl.XSourcePositionImpl; -import kotlin.IntRange; +import kotlin.*; +import kotlin.ranges.*; import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.psi.KtFunction; import org.jetbrains.kotlin.psi.KtFunctionLiteral; diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/descriptorUtils/descriptorUtils.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/descriptorUtils/descriptorUtils.kt index fb869a41ecd..0011f6e3c7c 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/descriptorUtils/descriptorUtils.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/descriptorUtils/descriptorUtils.kt @@ -18,21 +18,21 @@ package org.jetbrains.kotlin.js.descriptorUtils import com.intellij.openapi.util.text.StringUtil import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.utils.addToStdlib.check val KotlinType.nameIfStandardType: Name? get() { - val descriptor = constructor.declarationDescriptor - - if (descriptor?.containingDeclaration == descriptor?.builtIns?.builtInsPackageFragment) { - return descriptor?.name - } - - return null + return constructor.declarationDescriptor + ?.check { descriptor -> + descriptor.builtIns.isBuiltInPackageFragment(descriptor.containingDeclaration as? PackageFragmentDescriptor) + } + ?.name } fun KotlinType.getJetTypeFqName(printTypeArguments: Boolean): String { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StandardClasses.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StandardClasses.java index 18636293ffd..4495553fb0f 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StandardClasses.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StandardClasses.java @@ -98,15 +98,15 @@ public final class StandardClasses { if (type == PrimitiveType.CHAR || type == PrimitiveType.LONG) continue; String typeName = type.getTypeName().asString(); - standardClasses.declare().forFQ("kotlin." + typeName + "Range").kotlinClass("NumberRange"); - standardClasses.declare().forFQ("kotlin." + typeName + "Progression").kotlinClass("NumberProgression"); + standardClasses.declare().forFQ("kotlin.ranges." + typeName + "Range").kotlinClass("NumberRange"); + standardClasses.declare().forFQ("kotlin.ranges." + typeName + "Progression").kotlinClass("NumberProgression"); } - standardClasses.declare().forFQ("kotlin.LongRange").kotlinClass("LongRange"); - standardClasses.declare().forFQ("kotlin.CharRange").kotlinClass("CharRange"); + standardClasses.declare().forFQ("kotlin.ranges.LongRange").kotlinClass("LongRange"); + standardClasses.declare().forFQ("kotlin.ranges.CharRange").kotlinClass("CharRange"); - standardClasses.declare().forFQ("kotlin.LongProgression").kotlinClass("LongProgression"); - standardClasses.declare().forFQ("kotlin.CharProgression").kotlinClass("CharProgression"); + standardClasses.declare().forFQ("kotlin.ranges.LongProgression").kotlinClass("LongProgression"); + standardClasses.declare().forFQ("kotlin.ranges.CharProgression").kotlinClass("CharProgression"); standardClasses.declare().forFQ("kotlin.Enum").kotlinClass("Enum"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ProgressionCompanionFIF.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ProgressionCompanionFIF.kt index 40e5cef95bf..a17662a1ec3 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ProgressionCompanionFIF.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ProgressionCompanionFIF.kt @@ -34,7 +34,7 @@ object ProgressionCompanionFIF : CompositeFIF() { add(methodPattern("CharProgression"), CallProgressionConstructorIntrinsic("CharProgression")) } - private fun methodPattern(builtinProgressionName: String) = pattern("kotlin", builtinProgressionName, "Companion", "fromClosedRange") + private fun methodPattern(builtinProgressionName: String) = pattern("kotlin.ranges", builtinProgressionName, "Companion", "fromClosedRange") private class CallProgressionConstructorIntrinsic(val libraryProgressionName: String) : FunctionIntrinsic() { override fun apply(receiver: JsExpression?, arguments: MutableList, context: TranslationContext): JsExpression diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java index 74a1aadc569..384a29ec13a 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java @@ -156,7 +156,7 @@ public final class JsDescriptorUtils { public static boolean isBuiltin(@NotNull DeclarationDescriptor descriptor) { PackageFragmentDescriptor containingPackageFragment = DescriptorUtils.getParentOfType(descriptor, PackageFragmentDescriptor.class); - return containingPackageFragment == org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getBuiltIns(descriptor).getBuiltInsPackageFragment(); + return org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getBuiltIns(descriptor).isBuiltInPackageFragment(containingPackageFragment); } @Nullable diff --git a/js/js.translator/testData/kotlin_lib.js b/js/js.translator/testData/kotlin_lib.js index 627c807ea2f..bd491df87c3 100644 --- a/js/js.translator/testData/kotlin_lib.js +++ b/js/js.translator/testData/kotlin_lib.js @@ -888,7 +888,7 @@ lazyInitClasses.NumberRange = Kotlin.createClass( function() { - return [Kotlin.modules['builtins'].kotlin.ClosedRange, Kotlin.NumberProgression] + return [Kotlin.modules['builtins'].kotlin.ranges.ClosedRange, Kotlin.NumberProgression] }, function $fun(start, endInclusive) { $fun.baseInitializer.call(this, start, endInclusive, 1); @@ -976,7 +976,7 @@ lazyInitClasses.LongRange = Kotlin.createClass( function () { - return [Kotlin.modules['builtins'].kotlin.ClosedRange, Kotlin.LongProgression]; + return [Kotlin.modules['builtins'].kotlin.ranges.ClosedRange, Kotlin.LongProgression]; }, function $fun(start, endInclusive) { $fun.baseInitializer.call(this, start, endInclusive, Kotlin.Long.ONE); @@ -1058,7 +1058,7 @@ lazyInitClasses.CharRange = Kotlin.createClass( function() { - return [Kotlin.modules['builtins'].kotlin.ClosedRange, Kotlin.CharProgression] + return [Kotlin.modules['builtins'].kotlin.ranges.ClosedRange, Kotlin.CharProgression] }, function $fun(start, endInclusive) { $fun.baseInitializer.call(this, start, endInclusive, 1);