JS: prohibit dynamic values as handlers of property delegates. Prohibit delegation of classes by dynamic values. See KT-15283

This commit is contained in:
Alexey Andreev
2016-12-26 18:15:20 +03:00
parent a4b2abc7d5
commit 199790276b
14 changed files with 169 additions and 25 deletions
@@ -0,0 +1,13 @@
val x: dynamic = 23
interface I {
fun foo(): String
}
class C : I by <!DELEGATION_BY_DYNAMIC!>x<!>
object O : I by <!DELEGATION_BY_DYNAMIC!>x<!>
fun box(): String {
return object : I by <!DELEGATION_BY_DYNAMIC!>x<!> {}.foo()
}
@@ -1,16 +1,27 @@
package
public final class C : Tr {
public constructor C(/*0*/ d: dynamic)
public val x: dynamic = 23
public fun box(): kotlin.String
public final class C : I {
public constructor C()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*delegation*/ fun foo(): kotlin.Unit
public open override /*1*/ /*delegation*/ fun foo(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface Tr {
public interface I {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun foo(): kotlin.Unit
public abstract fun foo(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public object O : I {
private constructor O()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*delegation*/ fun foo(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -52,6 +52,3 @@ public final fun get(/*0*/ p0: dynamic): dynamic
public final fun divAssign(/*0*/ p0: dynamic): dynamic
public final fun get(/*0*/ p0: dynamic): dynamic
public final fun remAssign(/*0*/ p0: dynamic): dynamic
public final fun getValue(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic
public final fun getValue(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic
public final fun setValue(/*0*/ p0: dynamic, /*1*/ p1: dynamic, /*2*/ p2: dynamic): dynamic
@@ -81,6 +81,3 @@ fun test(d: dynamic) {
<!DEBUG_INFO_DYNAMIC!>d[1]<!> <!DEBUG_INFO_DYNAMIC!>%=<!> 1
}
val dyn: dynamic = null
val foo : Int <!DEBUG_INFO_DYNAMIC!>by dyn<!>
var bar : Int <!DEBUG_INFO_DYNAMIC, DEBUG_INFO_DYNAMIC!>by dyn<!>
@@ -1,6 +1,3 @@
package
public var bar: kotlin.Int
public val dyn: dynamic = null
public val foo: kotlin.Int
public fun test(/*0*/ d: dynamic): kotlin.Unit
@@ -1,5 +0,0 @@
interface Tr {
fun foo()
}
class C(d: dynamic) : Tr by d
@@ -0,0 +1,4 @@
public final fun getValue(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic
public final fun setValue(/*0*/ p0: dynamic, /*1*/ p1: dynamic, /*2*/ p2: dynamic): dynamic
public final fun getValue(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic
public final fun getValue(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic
@@ -0,0 +1,27 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
external val x: dynamic
var y: Any? by <!PROPERTY_DELEGATION_BY_DYNAMIC!>x<!>
fun foo() {
val a: Any by <!PROPERTY_DELEGATION_BY_DYNAMIC!>x<!>
}
class C {
val a: dynamic by <!PROPERTY_DELEGATION_BY_DYNAMIC!>x<!>
}
class A {
operator fun provideDelegate(host: Any?, p: Any): dynamic = TODO("")
}
val z: Any? by <!PROPERTY_DELEGATION_BY_DYNAMIC!>A()<!>
class DynamicHandler {
operator fun getValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>): dynamic = 23
}
class B {
val x: dynamic by DynamicHandler()
}
@@ -0,0 +1,38 @@
package
public external val x: dynamic
public var y: kotlin.Any?
public val z: kotlin.Any?
public fun foo(): kotlin.Unit
public final class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public final operator fun provideDelegate(/*0*/ host: kotlin.Any?, /*1*/ p: kotlin.Any): dynamic
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class B {
public constructor B()
public final val x: dynamic
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class C {
public constructor C()
public final val a: dynamic
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class DynamicHandler {
public constructor DynamicHandler()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final operator fun getValue(/*0*/ thisRef: kotlin.Any?, /*1*/ property: kotlin.reflect.KProperty<*>): dynamic
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}