[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:
+3
@@ -268,6 +268,9 @@ class K2JSCompilerArguments : CommonCompilerArguments() {
|
||||
if (!isIrBackendEnabled()) {
|
||||
this[LanguageFeature.JsAllowInvalidCharsIdentifiersEscaping] = LanguageFeature.State.DISABLED
|
||||
}
|
||||
if (isIrBackendEnabled()) {
|
||||
this[LanguageFeature.JsAllowValueClassesInExternals] = LanguageFeature.State.ENABLED
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
@@ -88,6 +88,10 @@ class LanguageVersionSettingsBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
if (targetBackend?.isIR == true) {
|
||||
specificFeatures[LanguageFeature.JsAllowValueClassesInExternals] = LanguageFeature.State.ENABLED
|
||||
}
|
||||
|
||||
directives[LanguageSettingsDirectives.LANGUAGE].forEach { parseLanguageFeature(it) }
|
||||
}
|
||||
|
||||
|
||||
+64
@@ -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<!>
|
||||
}
|
||||
+69
@@ -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
|
||||
}
|
||||
}
|
||||
+6
@@ -857,6 +857,12 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes
|
||||
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("inlineClassAsParameterOrReturnType_allowed.kt.kt")
|
||||
public void testInlineClassAsParameterOrReturnType_allowed_kt() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/testsWithJsStdLib/native/inlineClassAsParameterOrReturnType_allowed.kt.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("inlineClassAsParameterOrReturnType.kt.kt")
|
||||
public void testInlineClassAsParameterOrReturnType_kt() throws Exception {
|
||||
|
||||
@@ -267,7 +267,8 @@ enum class LanguageFeature(
|
||||
ProhibitComparisonOfIncompatibleClasses(sinceVersion = null, kind = BUG_FIX, defaultState = State.DISABLED),
|
||||
ExplicitBackingFields(sinceVersion = null, defaultState = State.DISABLED, kind = UNSTABLE_FEATURE),
|
||||
FunctionalTypeWithExtensionAsSupertype(sinceVersion = KOTLIN_1_6, defaultState = State.DISABLED),
|
||||
JsAllowInvalidCharsIdentifiersEscaping(sinceVersion = null, defaultState = State.DISABLED, kind = UNSTABLE_FEATURE)
|
||||
JsAllowInvalidCharsIdentifiersEscaping(sinceVersion = null, defaultState = State.DISABLED, kind = UNSTABLE_FEATURE),
|
||||
JsAllowValueClassesInExternals(sinceVersion = null, defaultState = State.DISABLED, kind = UNSTABLE_FEATURE)
|
||||
|
||||
;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user