Fix NPE on equals/hashCode for callable references without kotlin-reflect
#KT-11316 Fixed #KT-15847 Fixed
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
// WITH_REFLECT
|
// WITH_REFLECT
|
||||||
// TODO: replace with WITH_RUNTIME once KT-11316 is fixed
|
|
||||||
|
|
||||||
import kotlin.reflect.*
|
import kotlin.reflect.*
|
||||||
|
|
||||||
|
|||||||
Vendored
+9
@@ -11,6 +11,9 @@ class M {
|
|||||||
val bar = 1
|
val bar = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun topLevelFun() {}
|
||||||
|
val topLevelProp = ""
|
||||||
|
|
||||||
fun checkEquals(x: KCallable<*>, y: KCallable<*>) {
|
fun checkEquals(x: KCallable<*>, y: KCallable<*>) {
|
||||||
assertEquals(x, y)
|
assertEquals(x, y)
|
||||||
assertEquals(y, x)
|
assertEquals(y, x)
|
||||||
@@ -26,9 +29,15 @@ fun box(): String {
|
|||||||
checkEquals(M::bar, M::bar)
|
checkEquals(M::bar, M::bar)
|
||||||
checkEquals(::M, ::M)
|
checkEquals(::M, ::M)
|
||||||
|
|
||||||
|
checkEquals(::topLevelFun, ::topLevelFun)
|
||||||
|
checkEquals(::topLevelProp, ::topLevelProp)
|
||||||
|
|
||||||
checkToString(M::foo, "function foo")
|
checkToString(M::foo, "function foo")
|
||||||
checkToString(M::bar, "property bar")
|
checkToString(M::bar, "property bar")
|
||||||
checkToString(::M, "constructor")
|
checkToString(::M, "constructor")
|
||||||
|
|
||||||
|
checkToString(::topLevelFun, "function topLevelFun")
|
||||||
|
checkToString(::topLevelProp, "property topLevelProp")
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+28
@@ -0,0 +1,28 @@
|
|||||||
|
// IGNORE_BACKEND: JS
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
object Delegate {
|
||||||
|
lateinit var prop: KProperty<*>
|
||||||
|
|
||||||
|
operator fun provideDelegate(thiz: Any?, p: KProperty<*>): Delegate {
|
||||||
|
prop = p
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun getValue(x: Any?, p: KProperty<*>) {
|
||||||
|
assertEquals(prop, p)
|
||||||
|
assertEquals(p, prop)
|
||||||
|
assertEquals(p.hashCode(), prop.hashCode())
|
||||||
|
assertEquals("property x (Kotlin reflection is not available)", p.toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val x: Unit by Delegate
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
x
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+3
@@ -1,8 +1,11 @@
|
|||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class CallableReferencesKt {
|
public final class CallableReferencesKt {
|
||||||
|
private final static @org.jetbrains.annotations.NotNull field topLevelProp: java.lang.String
|
||||||
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
|
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
|
||||||
public final static method checkEquals(@org.jetbrains.annotations.NotNull p0: kotlin.reflect.KCallable, @org.jetbrains.annotations.NotNull p1: kotlin.reflect.KCallable): void
|
public final static method checkEquals(@org.jetbrains.annotations.NotNull p0: kotlin.reflect.KCallable, @org.jetbrains.annotations.NotNull p1: kotlin.reflect.KCallable): void
|
||||||
public final static method checkToString(@org.jetbrains.annotations.NotNull p0: kotlin.reflect.KCallable, @org.jetbrains.annotations.NotNull p1: java.lang.String): void
|
public final static method checkToString(@org.jetbrains.annotations.NotNull p0: kotlin.reflect.KCallable, @org.jetbrains.annotations.NotNull p1: java.lang.String): void
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getTopLevelProp(): java.lang.String
|
||||||
|
public final static method topLevelFun(): void
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
|
|||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
@kotlin.Metadata
|
||||||
|
public final class Delegate {
|
||||||
|
public final static field INSTANCE: Delegate
|
||||||
|
public static @org.jetbrains.annotations.NotNull field prop: kotlin.reflect.KProperty
|
||||||
|
private method <init>(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getProp(): kotlin.reflect.KProperty
|
||||||
|
public final method getValue(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.reflect.KProperty): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method provideDelegate(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.reflect.KProperty): Delegate
|
||||||
|
public final method setProp(@org.jetbrains.annotations.NotNull p0: kotlin.reflect.KProperty): void
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.Metadata
|
||||||
|
public final class DelegatedPropertyKt {
|
||||||
|
private synthetic final static field $$delegatedProperties: kotlin.reflect.KProperty[]
|
||||||
|
private final static @org.jetbrains.annotations.NotNull field x$delegate: Delegate
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getX(): kotlin.Unit
|
||||||
|
}
|
||||||
+6
@@ -14531,6 +14531,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/noReflectAtRuntime/methodsFromAny/classReference.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/noReflectAtRuntime/methodsFromAny/classReference.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("delegatedProperty.kt")
|
||||||
|
public void testDelegatedProperty() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/noReflectAtRuntime/methodsFromAny/delegatedProperty.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14531,6 +14531,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/noReflectAtRuntime/methodsFromAny/classReference.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/noReflectAtRuntime/methodsFromAny/classReference.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("delegatedProperty.kt")
|
||||||
|
public void testDelegatedProperty() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/noReflectAtRuntime/methodsFromAny/delegatedProperty.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14531,6 +14531,12 @@ public class LightAnalysisModeCodegenTestGenerated extends AbstractLightAnalysis
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/noReflectAtRuntime/methodsFromAny/classReference.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/noReflectAtRuntime/methodsFromAny/classReference.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("delegatedProperty.kt")
|
||||||
|
public void testDelegatedProperty() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/noReflectAtRuntime/methodsFromAny/delegatedProperty.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kotlin.jvm.internal
|
||||||
|
|
||||||
|
import kotlin.reflect.KCallable
|
||||||
|
|
||||||
|
class PackageReference(
|
||||||
|
override val jClass: Class<*>,
|
||||||
|
@Suppress("unused") private val moduleName: String
|
||||||
|
) : ClassBasedDeclarationContainer {
|
||||||
|
override val members: Collection<KCallable<*>>
|
||||||
|
get() = throw KotlinReflectionNotSupportedError()
|
||||||
|
|
||||||
|
override fun equals(other: Any?) =
|
||||||
|
other is PackageReference && jClass == other.jClass
|
||||||
|
|
||||||
|
override fun hashCode() =
|
||||||
|
jClass.hashCode()
|
||||||
|
|
||||||
|
override fun toString() =
|
||||||
|
jClass.toString() + Reflection.REFLECTION_NOT_AVAILABLE
|
||||||
|
}
|
||||||
@@ -30,7 +30,7 @@ public class ReflectionFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public KDeclarationContainer getOrCreateKotlinPackage(Class javaClass, String moduleName) {
|
public KDeclarationContainer getOrCreateKotlinPackage(Class javaClass, String moduleName) {
|
||||||
return null;
|
return new PackageReference(javaClass, moduleName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public KClass getOrCreateKotlinClass(Class javaClass) {
|
public KClass getOrCreateKotlinClass(Class javaClass) {
|
||||||
|
|||||||
+12
@@ -17964,6 +17964,18 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
}
|
}
|
||||||
throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that.");
|
throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("delegatedProperty.kt")
|
||||||
|
public void testDelegatedProperty() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/noReflectAtRuntime/methodsFromAny/delegatedProperty.kt");
|
||||||
|
try {
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
catch (Throwable ignore) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -666,6 +666,15 @@ public class kotlin/jvm/internal/MutablePropertyReference2Impl : kotlin/jvm/inte
|
|||||||
public fun set (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
|
public fun set (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class kotlin/jvm/internal/PackageReference : kotlin/jvm/internal/ClassBasedDeclarationContainer {
|
||||||
|
public fun <init> (Ljava/lang/Class;Ljava/lang/String;)V
|
||||||
|
public fun equals (Ljava/lang/Object;)Z
|
||||||
|
public fun getJClass ()Ljava/lang/Class;
|
||||||
|
public fun getMembers ()Ljava/util/Collection;
|
||||||
|
public fun hashCode ()I
|
||||||
|
public fun toString ()Ljava/lang/String;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract class kotlin/jvm/internal/PrimitiveSpreadBuilder {
|
public abstract class kotlin/jvm/internal/PrimitiveSpreadBuilder {
|
||||||
public fun <init> (I)V
|
public fun <init> (I)V
|
||||||
public final fun addSpread (Ljava/lang/Object;)V
|
public final fun addSpread (Ljava/lang/Object;)V
|
||||||
|
|||||||
+9
@@ -2659,6 +2659,15 @@ public class kotlin/jvm/internal/MutablePropertyReference2Impl : kotlin/jvm/inte
|
|||||||
public fun set (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
|
public fun set (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class kotlin/jvm/internal/PackageReference : kotlin/jvm/internal/ClassBasedDeclarationContainer {
|
||||||
|
public fun <init> (Ljava/lang/Class;Ljava/lang/String;)V
|
||||||
|
public fun equals (Ljava/lang/Object;)Z
|
||||||
|
public fun getJClass ()Ljava/lang/Class;
|
||||||
|
public fun getMembers ()Ljava/util/Collection;
|
||||||
|
public fun hashCode ()I
|
||||||
|
public fun toString ()Ljava/lang/String;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract class kotlin/jvm/internal/PrimitiveSpreadBuilder {
|
public abstract class kotlin/jvm/internal/PrimitiveSpreadBuilder {
|
||||||
public fun <init> (I)V
|
public fun <init> (I)V
|
||||||
public final fun addSpread (Ljava/lang/Object;)V
|
public final fun addSpread (Ljava/lang/Object;)V
|
||||||
|
|||||||
Reference in New Issue
Block a user