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
|
||||
// TODO: replace with WITH_RUNTIME once KT-11316 is fixed
|
||||
|
||||
import kotlin.reflect.*
|
||||
|
||||
|
||||
Vendored
+9
@@ -11,6 +11,9 @@ class M {
|
||||
val bar = 1
|
||||
}
|
||||
|
||||
fun topLevelFun() {}
|
||||
val topLevelProp = ""
|
||||
|
||||
fun checkEquals(x: KCallable<*>, y: KCallable<*>) {
|
||||
assertEquals(x, y)
|
||||
assertEquals(y, x)
|
||||
@@ -26,9 +29,15 @@ fun box(): String {
|
||||
checkEquals(M::bar, M::bar)
|
||||
checkEquals(::M, ::M)
|
||||
|
||||
checkEquals(::topLevelFun, ::topLevelFun)
|
||||
checkEquals(::topLevelProp, ::topLevelProp)
|
||||
|
||||
checkToString(M::foo, "function foo")
|
||||
checkToString(M::bar, "property bar")
|
||||
checkToString(::M, "constructor")
|
||||
|
||||
checkToString(::topLevelFun, "function topLevelFun")
|
||||
checkToString(::topLevelProp, "property topLevelProp")
|
||||
|
||||
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
|
||||
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 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 @org.jetbrains.annotations.NotNull method getTopLevelProp(): java.lang.String
|
||||
public final static method topLevelFun(): void
|
||||
}
|
||||
|
||||
@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");
|
||||
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");
|
||||
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");
|
||||
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) {
|
||||
return null;
|
||||
return new PackageReference(javaClass, moduleName);
|
||||
}
|
||||
|
||||
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.");
|
||||
}
|
||||
|
||||
@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 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 fun <init> (I)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 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 fun <init> (I)V
|
||||
public final fun addSpread (Ljava/lang/Object;)V
|
||||
|
||||
Reference in New Issue
Block a user