diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt index c97db2f7ad5..01ab78b43f8 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt @@ -26,10 +26,10 @@ enum class KClassOrigin { FOREIGN } -private val KOTLIN_CLASS_ANNOTATION_CLASS = javaClassOf() -private val KOTLIN_SYNTHETIC_CLASS_ANNOTATION_CLASS = javaClassOf() +private val KOTLIN_CLASS_ANNOTATION_CLASS = javaClass() +private val KOTLIN_SYNTHETIC_CLASS_ANNOTATION_CLASS = javaClass() -class KClassImpl(val jClass: Class, isKnownToBeKotlin: Boolean) : KClass { +class KClassImpl(val jClass: Class, isKnownToBeKotlin: Boolean = false) : KClass { // TODO: write metadata to local classes private val origin: KClassOrigin = if (isKnownToBeKotlin || @@ -44,7 +44,7 @@ class KClassImpl(val jClass: Class, isKnownToBeKotlin: Boolean) : KClass = - if (origin identityEquals KClassOrigin.KOTLIN) { + if (origin === KClassOrigin.KOTLIN) { KMemberPropertyImpl(name, this) } else { @@ -52,7 +52,7 @@ class KClassImpl(val jClass: Class, isKnownToBeKotlin: Boolean) : KClass = - if (origin identityEquals KClassOrigin.KOTLIN) { + if (origin === KClassOrigin.KOTLIN) { KMutableMemberPropertyImpl(name, this) } else { diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KMemberFunctionImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KMemberFunctionImpl.kt index 661b6576468..1c80fb91dd3 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KMemberFunctionImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KMemberFunctionImpl.kt @@ -19,5 +19,5 @@ package kotlin.reflect.jvm.internal import java.io.Serializable public abstract class KMemberFunctionImpl : Serializable { - override fun toString() = "${(this as Object).getClass().getGenericInterfaces()[0]}" + override fun toString() = "${javaClass.getGenericInterfaces().first()}" } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt index edfbb59a03d..93269825fda 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt @@ -75,7 +75,7 @@ class KMutableMemberPropertyImpl( { try { val returnType = if (getter != null) getter.getReturnType() else field!!.getType() - setter = owner.jClass.getMaybeDeclaredMethod(setterName(name), returnType!!) + setter = owner.jClass.getMaybeDeclaredMethod(setterName(name), returnType) } catch (e: NoSuchMethodException) { if (field == null) throw NoSuchPropertyException(e) diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt index 3e3323d86e9..df51b69f5af 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt @@ -19,7 +19,7 @@ package kotlin.reflect.jvm.internal import kotlin.reflect.KPackage import kotlin.jvm.internal.KotlinPackage -private val KOTLIN_PACKAGE_ANNOTATION_CLASS = javaClassOf() +private val KOTLIN_PACKAGE_ANNOTATION_CLASS = javaClass() class KPackageImpl(val jClass: Class<*>) : KPackage { override fun equals(other: Any?): Boolean = @@ -28,22 +28,11 @@ class KPackageImpl(val jClass: Class<*>) : KPackage { override fun hashCode(): Int = jClass.hashCode() - suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") override fun toString(): String { - val name = jClass.getName() as java.lang.String - return if (jClass.isAnnotationPresent(KOTLIN_PACKAGE_ANNOTATION_CLASS)) { - // Cast to Any is needed to suppress the error: "Operator '==' cannot be applied to 'java.lang.String' and 'kotlin.String'" - if ((name : Any) == "_DefaultPackage") { - "package " - } - else { - val lastDot = name.lastIndexOf(".") - if (lastDot >= 0) { - "package ${name.substring(0, lastDot)}" - } - else "package $name" - } + val name = jClass.getName() + return "package " + if (jClass.isAnnotationPresent(KOTLIN_PACKAGE_ANNOTATION_CLASS)) { + if (name == "_DefaultPackage") "" else name.substringBeforeLast(".") } - else "package $name" + else name } } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTopLevelExtensionPropertyImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTopLevelExtensionPropertyImpl.kt index 77d40982792..6be866dc6bb 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTopLevelExtensionPropertyImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTopLevelExtensionPropertyImpl.kt @@ -60,7 +60,7 @@ class KMutableTopLevelExtensionPropertyImpl( receiverClass: Class ) : KMutableTopLevelExtensionProperty, KMutablePropertyImpl, KTopLevelExtensionPropertyImpl(name, owner, receiverClass) { override val setter: Method = try { - owner.jClass.getMethod(setterName(name), receiverClass, getter.getReturnType()!!) + owner.jClass.getMethod(setterName(name), receiverClass, getter.getReturnType()) } catch (e: NoSuchMethodException) { throw NoSuchPropertyException(e) @@ -79,9 +79,8 @@ class KMutableTopLevelExtensionPropertyImpl( "var ${mapJavaClassToKotlin(receiverClass.getName())}.$name" } -suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") private fun mapJavaClassToKotlin(name: String): String { - if (Character.isLowerCase(name[0])) { + if (name[0].isLowerCase()) { return when (name) { "boolean" -> "kotlin.Boolean" "char" -> "kotlin.Char" @@ -95,8 +94,8 @@ private fun mapJavaClassToKotlin(name: String): String { } } if (name[0] == '[') { - val element = (name as java.lang.String).substring(1) as java.lang.String - return when (element.charAt(0)) { + val element = name.substring(1) + return when (element[0]) { 'Z' -> "kotlin.BooleanArray" 'C' -> "kotlin.CharArray" 'B' -> "kotlin.ByteArray" @@ -106,7 +105,7 @@ private fun mapJavaClassToKotlin(name: String): String { 'J' -> "kotlin.LongArray" 'D' -> "kotlin.DoubleArray" 'L' -> "kotlin.Array<${mapJavaClassToKotlin(element.substring(1, element.length() - 1))}>" - else -> "kotlin.Array<${mapJavaClassToKotlin(element as kotlin.String)}>" + else -> "kotlin.Array<${mapJavaClassToKotlin(element)}>" } } return name diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTopLevelVariableImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTopLevelVariableImpl.kt index 9feadfc4947..b4d7903d10f 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTopLevelVariableImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTopLevelVariableImpl.kt @@ -59,7 +59,7 @@ class KMutableTopLevelVariableImpl( owner: KPackageImpl ) : KMutableTopLevelVariable, KMutableVariableImpl, KTopLevelVariableImpl(name, owner) { override val setter: Method = try { - owner.jClass.getMethod(setterName(name), getter.getReturnType()!!) + owner.jClass.getMethod(setterName(name), getter.getReturnType()) } catch (e: NoSuchMethodException) { throw NoSuchPropertyException(e) diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/foreignKClasses.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/foreignKClasses.kt index e8037d40fbf..4830af8131e 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/foreignKClasses.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/foreignKClasses.kt @@ -42,7 +42,7 @@ fun foreignKotlinClass(jClass: Class): KClassImpl { for (ref in cached) { val kClass = ref.get() if (kClass?.jClass == jClass) { - return kClass!! + return kClass } } @@ -53,13 +53,13 @@ fun foreignKotlinClass(jClass: Class): KClassImpl { val newArray = arrayOfNulls>>(size + 1) // Don't use Arrays.copyOf because it works reflectively System.arraycopy(cached, 0, newArray, 0, size) - val newKClass = KClassImpl(jClass, false) + val newKClass = KClassImpl(jClass) newArray[size] = WeakReference(newKClass) FOREIGN_K_CLASSES = FOREIGN_K_CLASSES.plus(name, newArray) return newKClass } - val newKClass = KClassImpl(jClass, false) + val newKClass = KClassImpl(jClass) FOREIGN_K_CLASSES = FOREIGN_K_CLASSES.plus(name, WeakReference(newKClass)) return newKClass } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt index 5d658c6ef06..ffa445f2a92 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt @@ -17,29 +17,16 @@ package kotlin.reflect.jvm.internal import java.lang.reflect.Method -import kotlin.jvm.internal.Intrinsic -// TODO: use stdlib? -suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") private fun String.capitalizeWithJavaBeanConvention(): String { - // The code is a bit crooked because otherwise there are overload resolution ambiguities caused by the fact - // that we compile it with the built-ins both in source and as a compiled library - val l = length() - if (l > 1 && Character.isUpperCase(get(1))) return this - val first = get(0) - this as java.lang.String - return "" + Character.toUpperCase(first) + substring(1, l) + if (length() > 1 && Character.isUpperCase(this[1])) return this + return Character.toUpperCase(this[0]) + substring(1, length()) } private fun getterName(propertyName: String): String = "get" + propertyName.capitalizeWithJavaBeanConvention() private fun setterName(propertyName: String): String = "set" + propertyName.capitalizeWithJavaBeanConvention() -// A local copy of javaClass() from stdlib is needed because there's no dependency on stdlib in runtime.jvm -[Intrinsic("kotlin.javaClass.function")] -fun javaClassOf(): Class = throw UnsupportedOperationException() - - private fun Class<*>.getMaybeDeclaredMethod(name: String, vararg parameterTypes: Class<*>): Method { try { return getMethod(name, *parameterTypes) diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt index da2bc4efda3..c833c0b8ca0 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt @@ -61,7 +61,7 @@ public val KMemberProperty<*, *>.javaField: Field? // TODO: getstatic $kotlinClass or go to foreignKClasses public val Class.kotlin: KClass - get() = KClassImpl(this, false) + get() = KClassImpl(this) // TODO: getstatic $kotlinPackage public val Class<*>.kotlinPackage: KPackage @@ -71,7 +71,7 @@ public val Class<*>.kotlinPackage: KPackage public val Field.kotlin: KProperty<*> get() { val clazz = getDeclaringClass() - val name = getName()!! + val name = getName() val modifiers = getModifiers() val static = Modifier.isStatic(modifiers) val final = Modifier.isFinal(modifiers) @@ -84,4 +84,3 @@ public val Field.kotlin: KProperty<*> return if (final) Reflection.memberProperty(name, kClass) else Reflection.mutableMemberProperty(name, kClass) } } -