From 37ecf5def5d80499436c1bf4b6add6748ab06531 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 13 Oct 2015 18:43:29 +0300 Subject: [PATCH] Fix: bridges are now generated for non-final functions of Kotlin built-in classes --- .../kotlin/codegen/builtinSpecialBridges.kt | 15 +++++++++------ .../repl/primitiveTypes/boxingOnPurpose.repl | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/builtinSpecialBridges.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/builtinSpecialBridges.kt index 7ecadebd2e5..7ea36dfc84f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/builtinSpecialBridges.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/builtinSpecialBridges.kt @@ -17,13 +17,11 @@ package org.jetbrains.kotlin.codegen import org.jetbrains.kotlin.backend.common.bridges.* -import org.jetbrains.kotlin.descriptors.CallableDescriptor -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.load.java.getBuiltinSpecialOverridden import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.types.checker.TypeCheckingProcedure import org.jetbrains.kotlin.utils.singletonOrEmptyList import java.util.* @@ -102,8 +100,13 @@ private fun needGenerateSpecialBridge( if (superClassDescriptor !is JavaClassDescriptor) { // Kotlin class - // ? - if (implementsBuiltinDeclaration) return false + if (implementsBuiltinDeclaration) { + if (!functionDescriptor.modality.isOverridable) return false + // Generate bridges if it's built-in + val containingPackageFragment = DescriptorUtils.getParentOfType(superClassDescriptor, PackageFragmentDescriptor::class.java) + if (containingPackageFragment === superClassDescriptor.builtIns.builtInsPackageFragment) return true + return false + } } else { // java super class inherits builtin class and it's declaration is final diff --git a/compiler/testData/repl/primitiveTypes/boxingOnPurpose.repl b/compiler/testData/repl/primitiveTypes/boxingOnPurpose.repl index 63035485204..df5b2e5cc15 100644 --- a/compiler/testData/repl/primitiveTypes/boxingOnPurpose.repl +++ b/compiler/testData/repl/primitiveTypes/boxingOnPurpose.repl @@ -1,6 +1,6 @@ >>> Integer.valueOf(42) 42 ->>> Integer(239).intValue() +>>> Integer(239).toInt() 239 >>> java.lang.Long.MIN_VALUE as Any -9223372036854775808