Fix NPE on equals/hashCode for callable references without kotlin-reflect

#KT-11316 Fixed
 #KT-15847 Fixed
This commit is contained in:
Alexander Udalov
2017-02-03 01:45:24 +03:00
parent 0db60bf6cb
commit b784680fe2
13 changed files with 143 additions and 2 deletions
@@ -1,5 +1,4 @@
// WITH_REFLECT
// TODO: replace with WITH_RUNTIME once KT-11316 is fixed
import kotlin.reflect.*
@@ -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"
}
@@ -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"
}
@@ -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
@@ -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
}
@@ -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) {
@@ -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
@@ -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