[JS IR] Allow value classes in external decls

Instances of value classes are passed unboxed, unless the instance is
nullable _and_ the value class wraps another nullable value.

#KT-43224 Fixed
This commit is contained in:
Sergej Jaskiewicz
2021-11-29 21:51:29 +00:00
committed by Space
parent 3f47725eb9
commit 887e91328f
12 changed files with 1974 additions and 3 deletions
@@ -0,0 +1,64 @@
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, +JsAllowValueClassesInExternals
// FILE: uint.kt
package kotlin
inline class UInt(private val i: Int)
// FILE: test.kt
inline class SomeIC(val a: Int)
external val l: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
external val ll
get(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!> = definedExternally
external var r: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
external var rr: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
get() = definedExternally
set(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>v: SomeIC<!>) { definedExternally }
external fun foo(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
external fun foo(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
external fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
external fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!><!FORBIDDEN_VARARG_PARAMETER_TYPE!>vararg<!> args: SomeIC<!>)
external fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>ui: UInt<!>, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>vararg args: UInt<!>)
external class CC(
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>a: SomeIC<!>,
<!EXTERNAL_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER, INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>val b: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!><!>,
<!EXTERNAL_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER, INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>var c: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!><!>
) {
val l: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
var r: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
class N(
<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>a: SomeIC<!>,
<!EXTERNAL_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER, INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>val b: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!><!>,
<!EXTERNAL_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER, INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>var c: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!><!>
) {
val l: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
var r: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
}
}
external interface EI {
val l: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
var r: <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(<!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
fun foo(a: Int, <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>c: SomeIC<!>): <!INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING!>SomeIC<!>
}
@@ -0,0 +1,69 @@
package
public external val l: SomeIC
public external val ll: SomeIC
public external var r: SomeIC
public external var rr: SomeIC
public external fun foo(): SomeIC
public external fun foo(/*0*/ c: SomeIC): SomeIC
public external fun foo(/*0*/ a: kotlin.Int, /*1*/ c: SomeIC): SomeIC
public external fun foo(/*0*/ a: kotlin.Int, /*1*/ vararg args: SomeIC /*kotlin.Array<out SomeIC>*/): kotlin.Unit
public external fun foo(/*0*/ a: kotlin.Int, /*1*/ ui: kotlin.UInt, /*2*/ vararg args: kotlin.UInt /*kotlin.UIntArray*/): kotlin.Unit
public final external class CC {
public constructor CC(/*0*/ a: SomeIC, /*1*/ b: SomeIC, /*2*/ c: SomeIC)
public final val b: SomeIC
public final var c: SomeIC
public final val l: SomeIC
public final var r: SomeIC
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): SomeIC
public final fun foo(/*0*/ c: SomeIC): SomeIC
public final fun foo(/*0*/ a: kotlin.Int, /*1*/ c: SomeIC): SomeIC
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final class N {
public constructor N(/*0*/ a: SomeIC, /*1*/ b: SomeIC, /*2*/ c: SomeIC)
public final val b: SomeIC
public final var c: SomeIC
public final val l: SomeIC
public final var r: SomeIC
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): SomeIC
public final fun foo(/*0*/ c: SomeIC): SomeIC
public final fun foo(/*0*/ a: kotlin.Int, /*1*/ c: SomeIC): SomeIC
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
public external interface EI {
public abstract val l: SomeIC
public abstract var r: SomeIC
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun foo(): SomeIC
public abstract fun foo(/*0*/ c: SomeIC): SomeIC
public abstract fun foo(/*0*/ a: kotlin.Int, /*1*/ c: SomeIC): SomeIC
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final inline class SomeIC {
public constructor SomeIC(/*0*/ a: kotlin.Int)
public final val a: kotlin.Int
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
package kotlin {
public final inline class UInt {
public constructor UInt(/*0*/ i: kotlin.Int)
private final val i: kotlin.Int
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
}