From b165ff675b66cd852f48aa3ce2eaf29961580c21 Mon Sep 17 00:00:00 2001 From: Stanislav Ruban Date: Sun, 10 Mar 2024 23:02:00 +0200 Subject: [PATCH] [tests][FIR][checkers][Wasm] Improve test coverage for WRONG_JS_INTEROP_TYPE --- .../complexCasesWithJsInteropTypes.fir.kt | 28 ++ .../complexCasesWithJsInteropTypes.kt | 28 ++ .../jsInterop/correctJsInteropTypes.kt | 365 ++++++++++++++++++ .../wasmTests/jsInterop/types.fir.kt | 116 ------ .../diagnostics/wasmTests/jsInterop/types.kt | 116 ------ .../jsInterop/wrongJsInteropTypes.fir.kt | 247 ++++++++++++ .../jsInterop/wrongJsInteropTypes.kt | 247 ++++++++++++ .../DiagnosticsFirWasmTestGenerated.java | 18 +- .../DiagnosticsWasmTestGenerated.java | 18 +- 9 files changed, 945 insertions(+), 238 deletions(-) create mode 100644 compiler/testData/diagnostics/wasmTests/jsInterop/complexCasesWithJsInteropTypes.fir.kt create mode 100644 compiler/testData/diagnostics/wasmTests/jsInterop/complexCasesWithJsInteropTypes.kt create mode 100644 compiler/testData/diagnostics/wasmTests/jsInterop/correctJsInteropTypes.kt delete mode 100644 compiler/testData/diagnostics/wasmTests/jsInterop/types.fir.kt delete mode 100644 compiler/testData/diagnostics/wasmTests/jsInterop/types.kt create mode 100644 compiler/testData/diagnostics/wasmTests/jsInterop/wrongJsInteropTypes.fir.kt create mode 100644 compiler/testData/diagnostics/wasmTests/jsInterop/wrongJsInteropTypes.kt diff --git a/compiler/testData/diagnostics/wasmTests/jsInterop/complexCasesWithJsInteropTypes.fir.kt b/compiler/testData/diagnostics/wasmTests/jsInterop/complexCasesWithJsInteropTypes.fir.kt new file mode 100644 index 00000000000..04e3d5f5b72 --- /dev/null +++ b/compiler/testData/diagnostics/wasmTests/jsInterop/complexCasesWithJsInteropTypes.fir.kt @@ -0,0 +1,28 @@ +// OPT_IN: kotlin.js.ExperimentalJsExport + +external interface EI +external open class EC +external object EO + +external fun complexFunctionTypesWithNonNullTypes( + f1: (Boolean, Byte, Short, Int, Long, Float, Double, Char, String, EI, EC, EO) -> Unit, + f2: (Boolean) -> ((Int) -> ((Float) -> ((String) -> EI))), + f3: ((((Boolean) -> Int) -> Float) -> String) -> EI, +) + +external fun complexFunctionTypesWithNullableTypes( + f1: ((Boolean?, Byte?, Short?, Int?, Long?, Float?, Double?, Char?, String?, EI?, EC?, EO?) -> Unit)?, + f2: ((Boolean?) -> ((Int?) -> ((Float?) -> ((String?) -> EI)?)?)?)?, + f3: ((((((((Boolean?) -> Int?)?) -> Float?)?) -> String?)?) -> EI?)?, +) + +external fun complexFunctionTypesWithWrongTypes( + f1: ((Any?, Byte?, Unit?, Int?, CharSequence?, Float?, IntArray?, Char?, String?, EI?, EC?, EO?) -> Unit)?, + f2: ((Boolean?) -> ((Any?) -> ((Float?) -> ((CharSequence?) -> EI)?)?)?)?, + f3: ((((((((Boolean?) -> Unit?)?) -> Float?)?) -> IntArray?)?) -> EI?)?, +) + +external fun typeParameterWithUpperBoundsWithDifferentJsInteropCorrectness(arg: T): T where T : EI, T : Any + +fun jsCodeFunctionWithBlockBody(x: Any): Any { js("return x;") } +val jsCodeProperty: Any = js("1") diff --git a/compiler/testData/diagnostics/wasmTests/jsInterop/complexCasesWithJsInteropTypes.kt b/compiler/testData/diagnostics/wasmTests/jsInterop/complexCasesWithJsInteropTypes.kt new file mode 100644 index 00000000000..da6a6f85433 --- /dev/null +++ b/compiler/testData/diagnostics/wasmTests/jsInterop/complexCasesWithJsInteropTypes.kt @@ -0,0 +1,28 @@ +// OPT_IN: kotlin.js.ExperimentalJsExport + +external interface EI +external open class EC +external object EO + +external fun complexFunctionTypesWithNonNullTypes( + f1: (Boolean, Byte, Short, Int, Long, Float, Double, Char, String, EI, EC, EO) -> Unit, + f2: (Boolean) -> ((Int) -> ((Float) -> ((String) -> EI))), + f3: ((((Boolean) -> Int) -> Float) -> String) -> EI, +) + +external fun complexFunctionTypesWithNullableTypes( + f1: ((Boolean?, Byte?, Short?, Int?, Long?, Float?, Double?, Char?, String?, EI?, EC?, EO?) -> Unit)?, + f2: ((Boolean?) -> ((Int?) -> ((Float?) -> ((String?) -> EI)?)?)?)?, + f3: ((((((((Boolean?) -> Int?)?) -> Float?)?) -> String?)?) -> EI?)?, +) + +external fun complexFunctionTypesWithWrongTypes( + f1: ((Any?, Byte?, Unit?, Int?, CharSequence?, Float?, IntArray?, Char?, String?, EI?, EC?, EO?) -> Unit)?, + f2: ((Boolean?) -> ((Any?) -> ((Float?) -> ((CharSequence?) -> EI)?)?)?)?, + f3: ((((((((Boolean?) -> Unit?)?) -> Float?)?) -> IntArray?)?) -> EI?)?, +) + +external fun <T> typeParameterWithUpperBoundsWithDifferentJsInteropCorrectness(arg: T): T where T : EI, T : Any + +fun jsCodeFunctionWithBlockBody(x: Any): Any { js("return x;") } +val jsCodeProperty: Any = js("1") diff --git a/compiler/testData/diagnostics/wasmTests/jsInterop/correctJsInteropTypes.kt b/compiler/testData/diagnostics/wasmTests/jsInterop/correctJsInteropTypes.kt new file mode 100644 index 00000000000..b5ff810f36d --- /dev/null +++ b/compiler/testData/diagnostics/wasmTests/jsInterop/correctJsInteropTypes.kt @@ -0,0 +1,365 @@ +// FIR_IDENTICAL + +// OPT_IN: kotlin.js.ExperimentalJsExport +// OPT_IN: kotlin.ExperimentalUnsignedTypes +// DIAGNOSTICS: -FINAL_UPPER_BOUND, -UNUSED_PARAMETER +// DIAGNOSTICS: -INLINE_CLASS_IN_EXTERNAL_DECLARATION, -NON_EXPORTABLE_TYPE + +external interface ExternalInterface +external open class ExternalOpenClass +external object ExternalObject + + +external fun correctJsInteropTypes( + // primitive types + boolean: Boolean, + char: Char, + byte: Byte, + short: Short, + int: Int, + long: Long, + float: Float, + double: Double, + // unsigned integer types + uByte: UByte, + uShort: UShort, + uInt: UInt, + uLong: ULong, + // string types + string: String, + // function types + function: () -> Unit, + // external types + externalInterface: ExternalInterface, + externalOpenClass: ExternalOpenClass, + externalObject: ExternalObject, +) + +external fun correctNullableJsInteropTypes( + // primitive types + boolean: Boolean?, + char: Char?, + byte: Byte?, + short: Short?, + int: Int?, + long: Long?, + float: Float?, + double: Double?, + // unsigned integer types + uByte: UByte?, + uShort: UShort?, + uInt: UInt?, + uLong: ULong?, + // string types + string: String?, + // function types + function: (() -> Unit)?, + // external types + externalInterface: ExternalInterface?, + externalOpenClass: ExternalOpenClass?, + externalObject: ExternalObject?, +) + + +// correct JS interop types as return types + +// Unit and Nothing +external fun unitAsReturnType(): Unit +external fun nothingAsReturnType(): Nothing + +// primitive types +external fun booleanAsReturnType(): Boolean +external fun charAsReturnType(): Char +external fun byteAsReturnType(): Byte +external fun shortAsReturnType(): Short +external fun intAsReturnType(): Int +external fun longAsReturnType(): Long +external fun floatAsReturnType(): Float +external fun doubleAsReturnType(): Double + +// unsigned integer types +external fun uByteAsReturnType(): UByte +external fun uShortAsReturnType(): UShort +external fun uIntAsReturnType(): UInt +external fun uLongAsReturnType(): ULong + +// string types +external fun stringAsReturnType(): String + +// function types +external fun functionAsReturnType(): () -> Unit + +// external types +external fun externalInterfaceAsReturnType(): ExternalInterface +external fun externalOpenClassAsReturnType(): ExternalOpenClass +external fun externalObjectAsReturnType(): ExternalObject + + +// correct JS interop types as vararg parameter types + +// primitive types +external fun booleanAsVarargParameterType(vararg args: Boolean) +external fun charAsVarargParameterType(vararg args: Char) +external fun byteAsVarargParameterType(vararg args: Byte) +external fun shortAsVarargParameterType(vararg args: Short) +external fun intAsVarargParameterType(vararg args: Int) +external fun longAsVarargParameterType(vararg args: Long) +external fun floatAsVarargParameterType(vararg args: Float) +external fun doubleAsVarargParameterType(vararg args: Double) + +// unsigned integer types +external fun uByteAsVarargParameterType(vararg args: UByte) +external fun uShortAsVarargParameterType(vararg args: UShort) +external fun uIntAsVarargParameterType(vararg args: UInt) +external fun uLongAsVarargParameterType(vararg args: ULong) + +// string types +external fun stringAsVarargParameterType(vararg args: String) + +// function types +external fun functionAsVarargParameterType(vararg args: () -> Unit) + +// external types +external fun externalInterfaceAsVarargParameterType(vararg args: ExternalInterface) +external fun externalOpenClassAsVarargParameterType(vararg args: ExternalOpenClass) +external fun externalObjectAsVarargParameterType(vararg args: ExternalObject) + + +external fun < + // primitive types + TBoolean: Boolean, + TChar: Char, + TByte: Byte, + TShort: Short, + TInt: Int, + TLong: Long, + TFloat: Float, + TDouble: Double, + // unsigned integer types + TUByte: UByte, + TUShort: UShort, + TUInt: UInt, + TULong: ULong, + // string types + TString: String, + // function types + TFunction: () -> Unit, + // external types + TExternalInterface: ExternalInterface, + TExternalOpenClass: ExternalOpenClass, + TExternalObject: ExternalObject, + // correct type parameter + TCorrectTypeParameter: TExternalInterface +> correctJsInteropTypesAsFunctionTypeParameterUpperBounds( + boolean: TBoolean, + char: TChar, + byte: TByte, + short: TShort, + int: TInt, + long: TLong, + float: TFloat, + double: TDouble, + uByte: TUByte, + uShort: TUShort, + uInt: TUInt, + uLong: TULong, + string: TString, + function: TFunction, + externalInterface: TExternalInterface, + externalOpenClass: TExternalOpenClass, + externalObject: TExternalObject, + correctTypeParameter: TCorrectTypeParameter +) + +external class CorrectJsInteropTypesAsClassTypeParameterUpperBounds< + // primitive types + TBoolean: Boolean, + TChar: Char, + TByte: Byte, + TShort: Short, + TInt: Int, + TLong: Long, + TFloat: Float, + TDouble: Double, + // unsigned integer types + TUByte: UByte, + TUShort: UShort, + TUInt: UInt, + TULong: ULong, + // string types + TString: String, + // function types + TFunction: () -> Unit, + // external types + TExternalInterface: ExternalInterface, + TExternalOpenClass: ExternalOpenClass, + TExternalObject: ExternalObject, + // correct type parameter + TCorrectTypeParameter: TExternalInterface +> + + +// correct JS interop types as property types + +// primitive types +external val booleanProperty: Boolean +external val charProperty: Char +external val byteProperty: Byte +external val shortProperty: Short +external val intProperty: Int +external val longProperty: Long +external val floatProperty: Float +external val doubleProperty: Double + +// unsigned integer types +external val uByteProperty: UByte +external val uShortProperty: UShort +external val uIntProperty: UInt +external val uLongProperty: ULong + +// string types +external val stringProperty: String + +// function types +external val functionProperty: () -> Unit + +// external types +external val externalInterfaceProperty: ExternalInterface +external val externalOpenClassProperty: ExternalOpenClass +external val externalObjectProperty: ExternalObject + + +external fun correctJsInteropTypesAsFunctionTypeParameterTypes( + primitiveTypes: (Boolean, Char, Byte, Short, Int, Long, Float, Double) -> Unit, + unsignedIntegerTypes: (UByte, UShort, UInt, ULong) -> Unit, + string: (String) -> Unit, + function: (() -> Unit) -> Unit, + externalTypes: (ExternalInterface, ExternalOpenClass, ExternalObject) -> Unit, +) + +external fun correctJsInteropTypesAsFunctionTypeReturnTypes( + // Unit and Nothing + unit: () -> Unit, + nothing: () -> Nothing, + // primitive types + boolean: () -> Boolean, + char: () -> Char, + byte: () -> Byte, + short: () -> Short, + int: () -> Int, + long: () -> Long, + float: () -> Float, + double: () -> Double, + // unsigned integer types + uByte: () -> UByte, + uShort: () -> UShort, + uInt: () -> UInt, + uLong: () -> ULong, + // string types + string: () -> String, + // function types + function: () -> (() -> Unit), + // external types + externalInterface: () -> ExternalInterface, + externalOpenClass: () -> ExternalOpenClass, + externalObject: () -> ExternalObject, +) + +fun correctJsInteropTypesInJsCodeFunction( + // primitive types + boolean: Boolean, + char: Char, + byte: Byte, + short: Short, + int: Int, + long: Long, + float: Float, + double: Double, + // unsigned integer types + uByte: UByte, + uShort: UShort, + uInt: UInt, + uLong: ULong, + // string types + string: String, + // function types + function: () -> Unit, + // external types + externalInterface: ExternalInterface, + externalOpenClass: ExternalOpenClass, + externalObject: ExternalObject, +): Nothing = js("42") + +@JsExport +fun correctJsInteropTypesInJsExportFunction( + // primitive types + boolean: Boolean, + char: Char, + byte: Byte, + short: Short, + int: Int, + long: Long, + float: Float, + double: Double, + // unsigned integer types + uByte: UByte, + uShort: UShort, + uInt: UInt, + uLong: ULong, + // string types + string: String, + // function types + function: () -> Unit, + // external types + externalInterface: ExternalInterface, + externalOpenClass: ExternalOpenClass, + externalObject: ExternalObject, +) {} + + +typealias AliasedBoolean = Boolean +typealias AliasedChar = Char +typealias AliasedByte = Byte +typealias AliasedShort = Short +typealias AliasedInt = Int +typealias AliasedLong = Long +typealias AliasedFloat = Float +typealias AliasedDouble = Double + +typealias AliasedUByte = UByte +typealias AliasedUShort = UShort +typealias AliasedUInt = UInt +typealias AliasedULong = ULong + +typealias AliasedString = String + +typealias AliasedFunction = () -> Unit + +typealias AliasedExternalInterface = ExternalInterface +typealias AliasedExternalOpenClass = ExternalOpenClass +typealias AliasedExternalObject = ExternalObject + +external fun aliasedCorrectJsInteropTypes( + // primitive types + boolean: AliasedBoolean, + char: AliasedChar, + byte: AliasedByte, + short: AliasedShort, + int: AliasedInt, + long: AliasedLong, + float: AliasedFloat, + double: AliasedDouble, + // unsigned integer types + uByte: AliasedUByte, + uShort: AliasedUShort, + uInt: AliasedUInt, + uLong: AliasedULong, + // string types + string: AliasedString, + // function types + function: AliasedFunction, + // external types + externalInterface: AliasedExternalInterface, + externalOpenClass: AliasedExternalOpenClass, + externalObject: AliasedExternalObject, +) diff --git a/compiler/testData/diagnostics/wasmTests/jsInterop/types.fir.kt b/compiler/testData/diagnostics/wasmTests/jsInterop/types.fir.kt deleted file mode 100644 index cbcd7dacbd6..00000000000 --- a/compiler/testData/diagnostics/wasmTests/jsInterop/types.fir.kt +++ /dev/null @@ -1,116 +0,0 @@ -// !OPT_IN: kotlin.js.ExperimentalJsExport - -external interface EI -external open class EC -external object EO - -external fun supportedTypes( - boolean: Boolean, - - byte: Byte, - short: Short, - int: Int, - long: Long, - - float: Float, - double: Double, - - char: Char, - string: String, - - ei: EI, - ec: EC, - eo: EO, - - f1: (Boolean, Byte, Short, Int, Long, Float, Double, Char, String, EI, EC, EO) -> Unit, - - f2: (Boolean) -> ((Int) -> ((Float) -> ((String) -> EI))), - - f3: ((((Boolean) -> Int) -> Float) -> String) -> EI, -): Unit - -external fun supportedNullableTypes( - boolean: Boolean?, - - byte: Byte?, - short: Short?, - int: Int?, - long: Long?, - - float: Float?, - double: Double?, - - char: Char?, - string: String?, - - ei: EI?, - ec: EC?, - eo: EO?, - - f1: ((Boolean?, Byte?, Short?, Int?, Long?, Float?, Double?, Char?, String?, EI?, EC?, EO?) -> Unit)?, - - f2: ((Boolean?) -> ((Int?) -> ((Float?) -> ((String?) -> EI)?)?)?)?, - - f3: ((((((((Boolean?) -> Int?)?) -> Float?)?) -> String?)?) -> EI?)?, -): Unit - -external fun supportedReturnTypeUnit(): Unit -external fun supportedReturnTypeNothing(): Nothing -external fun supportedReturnTypeBoolean(): Boolean -external fun supportedReturnTypeNullableInt(): Int? -external fun supportedReturnTypeEI(): EI -external fun supportedReturnTypeNullableEC(): EC? - -external fun < - T1 : EI, - T2 : EC?, - T3 : T1? - > supportedTypeParamtersUpperBounds(p1: T1, p2: T2): T3 - -external fun supportedVararg(vararg p: Int) - -external fun wrongExternalTypes( - any: Any, - nany: Any?, - unit: Unit, - nunit: Unit?, - nothing: Nothing, - nnothing: Nothing?, - charSequence: CharSequence, - list: List, - array: Array, - intArray: IntArray, - pair: Pair, - number: Number, -) - -external fun wrongVararg(vararg p: Any) - -external fun supportedTypeParamtersUpperBounds(p: T): T where T : EI, T : Any - -external fun < - T1, - T2 : Number, - T3: List, - > supportedTypeParamtersUpperBounds( - p1: T1, - p2: T2 -): T3 - -fun jsCode1(x: Any): Any = js("x") -fun jsCode2(x: Any): Any { - js("return x;") -} -val jsProp: Any = js("1") - -@JsExport -fun exported(x: Any): Any = x - -typealias EI_alias = EI -typealias Any_alias = Any -typealias Function_alias = (Int) -> Int -external fun fooAlias( - ei: EI_alias, - any: Any_alias, - function: Function_alias, -) diff --git a/compiler/testData/diagnostics/wasmTests/jsInterop/types.kt b/compiler/testData/diagnostics/wasmTests/jsInterop/types.kt deleted file mode 100644 index dbb8d32b7c3..00000000000 --- a/compiler/testData/diagnostics/wasmTests/jsInterop/types.kt +++ /dev/null @@ -1,116 +0,0 @@ -// !OPT_IN: kotlin.js.ExperimentalJsExport - -external interface EI -external open class EC -external object EO - -external fun supportedTypes( - boolean: Boolean, - - byte: Byte, - short: Short, - int: Int, - long: Long, - - float: Float, - double: Double, - - char: Char, - string: String, - - ei: EI, - ec: EC, - eo: EO, - - f1: (Boolean, Byte, Short, Int, Long, Float, Double, Char, String, EI, EC, EO) -> Unit, - - f2: (Boolean) -> ((Int) -> ((Float) -> ((String) -> EI))), - - f3: ((((Boolean) -> Int) -> Float) -> String) -> EI, -): Unit - -external fun supportedNullableTypes( - boolean: Boolean?, - - byte: Byte?, - short: Short?, - int: Int?, - long: Long?, - - float: Float?, - double: Double?, - - char: Char?, - string: String?, - - ei: EI?, - ec: EC?, - eo: EO?, - - f1: ((Boolean?, Byte?, Short?, Int?, Long?, Float?, Double?, Char?, String?, EI?, EC?, EO?) -> Unit)?, - - f2: ((Boolean?) -> ((Int?) -> ((Float?) -> ((String?) -> EI)?)?)?)?, - - f3: ((((((((Boolean?) -> Int?)?) -> Float?)?) -> String?)?) -> EI?)?, -): Unit - -external fun supportedReturnTypeUnit(): Unit -external fun supportedReturnTypeNothing(): Nothing -external fun supportedReturnTypeBoolean(): Boolean -external fun supportedReturnTypeNullableInt(): Int? -external fun supportedReturnTypeEI(): EI -external fun supportedReturnTypeNullableEC(): EC? - -external fun < - T1 : EI, - T2 : EC?, - T3 : T1? - > supportedTypeParamtersUpperBounds(p1: T1, p2: T2): T3 - -external fun supportedVararg(vararg p: Int) - -external fun wrongExternalTypes( - any: Any, - nany: Any?, - unit: Unit, - nunit: Unit?, - nothing: Nothing, - nnothing: Nothing?, - charSequence: CharSequence, - list: List, - array: Array, - intArray: IntArray, - pair: Pair, - number: Number, -) - -external fun wrongVararg(vararg p: Any) - -external fun <T> supportedTypeParamtersUpperBounds(p: T): T where T : EI, T : Any - -external fun < - T1, - T2 : Number, - T3: List, - > supportedTypeParamtersUpperBounds( - p1: T1, - p2: T2 -): T3 - -fun jsCode1(x: Any): Any = js("x") -fun jsCode2(x: Any): Any { - js("return x;") -} -val jsProp: Any = js("1") - -@JsExport -fun exported(x: Any): Any = x - -typealias EI_alias = EI -typealias Any_alias = Any -typealias Function_alias = (Int) -> Int -external fun fooAlias( - ei: EI_alias, - any: Any_alias, - function: Function_alias, -) diff --git a/compiler/testData/diagnostics/wasmTests/jsInterop/wrongJsInteropTypes.fir.kt b/compiler/testData/diagnostics/wasmTests/jsInterop/wrongJsInteropTypes.fir.kt new file mode 100644 index 00000000000..e05ed4fcb7f --- /dev/null +++ b/compiler/testData/diagnostics/wasmTests/jsInterop/wrongJsInteropTypes.fir.kt @@ -0,0 +1,247 @@ +// OPT_IN: kotlin.js.ExperimentalJsExport +// DIAGNOSTICS: -FINAL_UPPER_BOUND, -UNUSED_PARAMETER +// DIAGNOSTICS: -NON_EXPORTABLE_TYPE + +interface UserDefinedInterface +open class UserDefinedOpenClass +object UserDefinedObject + + +external fun wrongJsInteropTypes( + // Unit and Nothing + unit: Unit, + nothing: Nothing, + // built-in types + any: Any, + number: Number, + charSequence: CharSequence, + specializedArray: IntArray, + pair: Pair, + list: List, + genericArray: Array, + // user-defined types + userDefinedInterface: UserDefinedInterface, + userDefinedOpenClass: UserDefinedOpenClass, + userDefinedObject: UserDefinedObject, +) + +external fun wrongNullableJsInteropTypes( + // Unit and Nothing + unit: Unit?, + nothing: Nothing?, + // built-in types + any: Any?, + number: Number?, + charSequence: CharSequence?, + specializedArray: IntArray?, + pair: Pair?, + list: List?, + genericArray: Array?, + // user-defined types + userDefinedInterface: UserDefinedInterface?, + userDefinedOpenClass: UserDefinedOpenClass?, + userDefinedObject: UserDefinedObject?, +) + + +// wrong JS interop types as return types + +// built-in types +external fun anyAsReturnType(): Any +external fun numberAsReturnType(): Number +external fun charSequenceAsReturnType(): CharSequence +external fun specializedArrayAsReturnType(): IntArray +external fun pairAsReturnType(): Pair +external fun listAsReturnType(): List +external fun genericArrayAsReturnType(): Array + +// user-defined types +external fun userDefinedInterfaceAsReturnType(): UserDefinedInterface +external fun userDefinedOpenClassAsReturnType(): UserDefinedOpenClass +external fun userDefinedObjectAsReturnType(): UserDefinedObject + + +// wrong JS interop types as vararg parameter types + +// Unit (Nothing is not allowed in vararg parameters) +external fun unitAsVarargParameterType(vararg args: Unit) + +// built-in types +external fun anyAsVarargParameterType(vararg args: Any) +external fun numberAsVarargParameterType(vararg args: Number) +external fun charSequenceAsVarargParameterType(vararg args: CharSequence) +external fun specializedArrayAsVarargParameterType(vararg args: IntArray) +external fun pairAsVarargParameterType(vararg args: Pair) +external fun listAsVarargParameterType(vararg args: List) +external fun genericArrayAsVarargParameterType(vararg args: Array) + +// user-defined types +external fun userDefinedInterfaceAsVarargParameterType(vararg args: UserDefinedInterface) +external fun userDefinedOpenClassAsVarargParameterType(vararg args: UserDefinedOpenClass) +external fun userDefinedObjectAsVarargParameterType(vararg args: UserDefinedObject) + + +external fun < + // Unit (Nothing as an upper bound results in an empty intersection type) + TUnit: Unit, + // built-in types + TAny: Any, + TNumber: Number, + TCharSequence: CharSequence, + TSpecializedArray: IntArray, + TPair: Pair, + TList: List, + TGenericArray: Array, + // user-defined types + TUserDefinedInterface: UserDefinedInterface, + TUserDefinedOpenClass: UserDefinedOpenClass, + TUserDefinedObject: UserDefinedObject, + // type parameter with implicit upper bound + TTypeParameterWithImplicitUpperBound +> wrongJsInteropTypesAsFunctionTypeParameterUpperBounds( + unit: TUnit, + any: TAny, + number: TNumber, + charSequence: TCharSequence, + specializedArray: TSpecializedArray, + pair: TPair, + list: TList, + genericArray: TGenericArray, + userDefinedInterface: TUserDefinedInterface, + userDefinedOpenClass: TUserDefinedOpenClass, + userDefinedObject: TUserDefinedObject, + typeParameterWithImplicitUpperBound: TTypeParameterWithImplicitUpperBound +) + +external class WrongJsInteropTypesAsClassTypeParameterUpperBounds< + // Unit (Nothing as an upper bound results in an empty intersection type) + TUnit: Unit, + // built-in types + TAny: Any, + TNumber: Number, + TCharSequence: CharSequence, + TSpecializedArray: IntArray, + TPair: Pair, + TList: List, + TGenericArray: Array, + // user-defined types + TUserDefinedInterface: UserDefinedInterface, + TUserDefinedOpenClass: UserDefinedOpenClass, + TUserDefinedObject: UserDefinedObject, + // type parameter with implicit upper bound + TTypeParameterWithImplicitUpperBound +> + + +// wrong JS interop types as property types + +// Unit and Nothing +external val unitProperty: Unit +external val nothingProperty: Nothing + +// built-in types +external val anyProperty: Any +external val numberProperty: Number +external val charSequenceProperty: CharSequence +external val specializedArrayProperty: IntArray +external val pairProperty: Pair +external val listProperty: List +external val genericArrayProperty: Array + +// user-defined types +external val userDefinedInterfaceProperty: UserDefinedInterface +external val userDefinedOpenClassProperty: UserDefinedOpenClass +external val userDefinedObjectProperty: UserDefinedObject + + +external fun wrongJsInteropTypesAsFunctionTypeParameterTypes( + unitAndNothing: (Unit, Nothing) -> Unit, + builtInTypes: (Any, Number, CharSequence, IntArray, Pair, List, Array) -> Unit, + userDefinedTypes: (UserDefinedInterface, UserDefinedOpenClass, UserDefinedObject) -> Unit, +) + +external fun wrongJsInteropTypesAsFunctionTypeReturnTypes( + // built-in types + any: () -> Any, + number: () -> Number, + charSequence: () -> CharSequence, + specializedArray: () -> IntArray, + pair: () -> Pair, + list: () -> List, + genericArray: () -> Array, + // user-defined types + userDefinedInterface: () -> UserDefinedInterface, + userDefinedOpenClass: () -> UserDefinedOpenClass, + userDefinedObject: () -> UserDefinedObject, +) + +fun wrongJsInteropTypesInJsCodeFunction( + // Unit and Nothing + unit: Unit, + nothing: Nothing, + // built-in types + any: Any, + number: Number, + charSequence: CharSequence, + specializedArray: IntArray, + pair: Pair, + list: List, + genericArray: Array, + // user-defined types + userDefinedInterface: UserDefinedInterface, + userDefinedOpenClass: UserDefinedOpenClass, + userDefinedObject: UserDefinedObject, +): Nothing = js("42") + +@JsExport +fun wrongJsInteropTypesInJsExportFunction( + // Unit and Nothing + unit: Unit, + nothing: Nothing, + // built-in types + any: Any, + number: Number, + charSequence: CharSequence, + specializedArray: IntArray, + pair: Pair, + list: List, + genericArray: Array, + // user-defined types + userDefinedInterface: UserDefinedInterface, + userDefinedOpenClass: UserDefinedOpenClass, + userDefinedObject: UserDefinedObject, +) {} + + +typealias AliasedUnit = Unit +typealias AliasedNothing = Nothing + +typealias AliasedAny = Any +typealias AliasedNumber = Number +typealias AliasedCharSequence = CharSequence +typealias AliasedSpecializedArray = IntArray +typealias AliasedPair = Pair +typealias AliasedList = List +typealias AliasedGenericArray = Array + +typealias AliasedUserDefinedInterface = UserDefinedInterface +typealias AliasedUserDefinedOpenClass = UserDefinedOpenClass +typealias AliasedUserDefinedObject = UserDefinedObject + +external fun aliasedWrongJsInteropTypes( + // Unit and Nothing + unit: AliasedUnit, + nothing: AliasedNothing, + // built-in types + any: AliasedAny, + number: AliasedNumber, + charSequence: AliasedCharSequence, + specializedArray: AliasedSpecializedArray, + pair: AliasedPair, + list: AliasedList, + genericArray: AliasedGenericArray, + // user-defined types + userDefinedInterface: AliasedUserDefinedInterface, + userDefinedOpenClass: AliasedUserDefinedOpenClass, + userDefinedObject: AliasedUserDefinedObject, +) diff --git a/compiler/testData/diagnostics/wasmTests/jsInterop/wrongJsInteropTypes.kt b/compiler/testData/diagnostics/wasmTests/jsInterop/wrongJsInteropTypes.kt new file mode 100644 index 00000000000..ec3a5802d39 --- /dev/null +++ b/compiler/testData/diagnostics/wasmTests/jsInterop/wrongJsInteropTypes.kt @@ -0,0 +1,247 @@ +// OPT_IN: kotlin.js.ExperimentalJsExport +// DIAGNOSTICS: -FINAL_UPPER_BOUND, -UNUSED_PARAMETER +// DIAGNOSTICS: -NON_EXPORTABLE_TYPE + +interface UserDefinedInterface +open class UserDefinedOpenClass +object UserDefinedObject + + +external fun wrongJsInteropTypes( + // Unit and Nothing + unit: Unit, + nothing: Nothing, + // built-in types + any: Any, + number: Number, + charSequence: CharSequence, + specializedArray: IntArray, + pair: Pair, + list: List, + genericArray: Array, + // user-defined types + userDefinedInterface: UserDefinedInterface, + userDefinedOpenClass: UserDefinedOpenClass, + userDefinedObject: UserDefinedObject, +) + +external fun wrongNullableJsInteropTypes( + // Unit and Nothing + unit: Unit?, + nothing: Nothing?, + // built-in types + any: Any?, + number: Number?, + charSequence: CharSequence?, + specializedArray: IntArray?, + pair: Pair?, + list: List?, + genericArray: Array?, + // user-defined types + userDefinedInterface: UserDefinedInterface?, + userDefinedOpenClass: UserDefinedOpenClass?, + userDefinedObject: UserDefinedObject?, +) + + +// wrong JS interop types as return types + +// built-in types +external fun anyAsReturnType(): Any +external fun numberAsReturnType(): Number +external fun charSequenceAsReturnType(): CharSequence +external fun specializedArrayAsReturnType(): IntArray +external fun pairAsReturnType(): Pair +external fun listAsReturnType(): List +external fun genericArrayAsReturnType(): Array + +// user-defined types +external fun userDefinedInterfaceAsReturnType(): UserDefinedInterface +external fun userDefinedOpenClassAsReturnType(): UserDefinedOpenClass +external fun userDefinedObjectAsReturnType(): UserDefinedObject + + +// wrong JS interop types as vararg parameter types + +// Unit (Nothing is not allowed in vararg parameters) +external fun unitAsVarargParameterType(vararg args: Unit) + +// built-in types +external fun anyAsVarargParameterType(vararg args: Any) +external fun numberAsVarargParameterType(vararg args: Number) +external fun charSequenceAsVarargParameterType(vararg args: CharSequence) +external fun specializedArrayAsVarargParameterType(vararg args: IntArray) +external fun pairAsVarargParameterType(vararg args: Pair) +external fun listAsVarargParameterType(vararg args: List) +external fun genericArrayAsVarargParameterType(vararg args: Array) + +// user-defined types +external fun userDefinedInterfaceAsVarargParameterType(vararg args: UserDefinedInterface) +external fun userDefinedOpenClassAsVarargParameterType(vararg args: UserDefinedOpenClass) +external fun userDefinedObjectAsVarargParameterType(vararg args: UserDefinedObject) + + +external fun < + // Unit (Nothing as an upper bound results in an empty intersection type) + TUnit: Unit, + // built-in types + TAny: Any, + TNumber: Number, + TCharSequence: CharSequence, + TSpecializedArray: IntArray, + TPair: Pair, + TList: List, + TGenericArray: Array, + // user-defined types + TUserDefinedInterface: UserDefinedInterface, + TUserDefinedOpenClass: UserDefinedOpenClass, + TUserDefinedObject: UserDefinedObject, + // type parameter with implicit upper bound + TTypeParameterWithImplicitUpperBound +> wrongJsInteropTypesAsFunctionTypeParameterUpperBounds( + unit: TUnit, + any: TAny, + number: TNumber, + charSequence: TCharSequence, + specializedArray: TSpecializedArray, + pair: TPair, + list: TList, + genericArray: TGenericArray, + userDefinedInterface: TUserDefinedInterface, + userDefinedOpenClass: TUserDefinedOpenClass, + userDefinedObject: TUserDefinedObject, + typeParameterWithImplicitUpperBound: TTypeParameterWithImplicitUpperBound +) + +external class WrongJsInteropTypesAsClassTypeParameterUpperBounds< + // Unit (Nothing as an upper bound results in an empty intersection type) + TUnit: Unit, + // built-in types + TAny: Any, + TNumber: Number, + TCharSequence: CharSequence, + TSpecializedArray: IntArray, + TPair: Pair, + TList: List, + TGenericArray: Array, + // user-defined types + TUserDefinedInterface: UserDefinedInterface, + TUserDefinedOpenClass: UserDefinedOpenClass, + TUserDefinedObject: UserDefinedObject, + // type parameter with implicit upper bound + TTypeParameterWithImplicitUpperBound +> + + +// wrong JS interop types as property types + +// Unit and Nothing +external val unitProperty: Unit +external val nothingProperty: Nothing + +// built-in types +external val anyProperty: Any +external val numberProperty: Number +external val charSequenceProperty: CharSequence +external val specializedArrayProperty: IntArray +external val pairProperty: Pair +external val listProperty: List +external val genericArrayProperty: Array + +// user-defined types +external val userDefinedInterfaceProperty: UserDefinedInterface +external val userDefinedOpenClassProperty: UserDefinedOpenClass +external val userDefinedObjectProperty: UserDefinedObject + + +external fun wrongJsInteropTypesAsFunctionTypeParameterTypes( + unitAndNothing: (Unit, Nothing) -> Unit, + builtInTypes: (Any, Number, CharSequence, IntArray, Pair, List, Array) -> Unit, + userDefinedTypes: (UserDefinedInterface, UserDefinedOpenClass, UserDefinedObject) -> Unit, +) + +external fun wrongJsInteropTypesAsFunctionTypeReturnTypes( + // built-in types + any: () -> Any, + number: () -> Number, + charSequence: () -> CharSequence, + specializedArray: () -> IntArray, + pair: () -> Pair, + list: () -> List, + genericArray: () -> Array, + // user-defined types + userDefinedInterface: () -> UserDefinedInterface, + userDefinedOpenClass: () -> UserDefinedOpenClass, + userDefinedObject: () -> UserDefinedObject, +) + +fun wrongJsInteropTypesInJsCodeFunction( + // Unit and Nothing + unit: Unit, + nothing: Nothing, + // built-in types + any: Any, + number: Number, + charSequence: CharSequence, + specializedArray: IntArray, + pair: Pair, + list: List, + genericArray: Array, + // user-defined types + userDefinedInterface: UserDefinedInterface, + userDefinedOpenClass: UserDefinedOpenClass, + userDefinedObject: UserDefinedObject, +): Nothing = js("42") + +@JsExport +fun wrongJsInteropTypesInJsExportFunction( + // Unit and Nothing + unit: Unit, + nothing: Nothing, + // built-in types + any: Any, + number: Number, + charSequence: CharSequence, + specializedArray: IntArray, + pair: Pair, + list: List, + genericArray: Array, + // user-defined types + userDefinedInterface: UserDefinedInterface, + userDefinedOpenClass: UserDefinedOpenClass, + userDefinedObject: UserDefinedObject, +) {} + + +typealias AliasedUnit = Unit +typealias AliasedNothing = Nothing + +typealias AliasedAny = Any +typealias AliasedNumber = Number +typealias AliasedCharSequence = CharSequence +typealias AliasedSpecializedArray = IntArray +typealias AliasedPair = Pair +typealias AliasedList = List +typealias AliasedGenericArray = Array + +typealias AliasedUserDefinedInterface = UserDefinedInterface +typealias AliasedUserDefinedOpenClass = UserDefinedOpenClass +typealias AliasedUserDefinedObject = UserDefinedObject + +external fun aliasedWrongJsInteropTypes( + // Unit and Nothing + unit: AliasedUnit, + nothing: AliasedNothing, + // built-in types + any: AliasedAny, + number: AliasedNumber, + charSequence: AliasedCharSequence, + specializedArray: AliasedSpecializedArray, + pair: AliasedPair, + list: AliasedList, + genericArray: AliasedGenericArray, + // user-defined types + userDefinedInterface: AliasedUserDefinedInterface, + userDefinedOpenClass: AliasedUserDefinedOpenClass, + userDefinedObject: AliasedUserDefinedObject, +) diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsFirWasmTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsFirWasmTestGenerated.java index c7db9f13761..4718ffc3576 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsFirWasmTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsFirWasmTestGenerated.java @@ -51,6 +51,18 @@ public class DiagnosticsFirWasmTestGenerated extends AbstractDiagnosticsFirWasmT runTest("compiler/testData/diagnostics/wasmTests/jsInterop/body.kt"); } + @Test + @TestMetadata("complexCasesWithJsInteropTypes.kt") + public void testComplexCasesWithJsInteropTypes() { + runTest("compiler/testData/diagnostics/wasmTests/jsInterop/complexCasesWithJsInteropTypes.kt"); + } + + @Test + @TestMetadata("correctJsInteropTypes.kt") + public void testCorrectJsInteropTypes() { + runTest("compiler/testData/diagnostics/wasmTests/jsInterop/correctJsInteropTypes.kt"); + } + @Test @TestMetadata("definedExternally.kt") public void testDefinedExternally() { @@ -124,9 +136,9 @@ public class DiagnosticsFirWasmTestGenerated extends AbstractDiagnosticsFirWasmT } @Test - @TestMetadata("types.kt") - public void testTypes() { - runTest("compiler/testData/diagnostics/wasmTests/jsInterop/types.kt"); + @TestMetadata("wrongJsInteropTypes.kt") + public void testWrongJsInteropTypes() { + runTest("compiler/testData/diagnostics/wasmTests/jsInterop/wrongJsInteropTypes.kt"); } @Test diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsWasmTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsWasmTestGenerated.java index ee969c84e16..4b7ddc7297f 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsWasmTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsWasmTestGenerated.java @@ -51,6 +51,18 @@ public class DiagnosticsWasmTestGenerated extends AbstractDiagnosticsWasmTest { runTest("compiler/testData/diagnostics/wasmTests/jsInterop/body.kt"); } + @Test + @TestMetadata("complexCasesWithJsInteropTypes.kt") + public void testComplexCasesWithJsInteropTypes() { + runTest("compiler/testData/diagnostics/wasmTests/jsInterop/complexCasesWithJsInteropTypes.kt"); + } + + @Test + @TestMetadata("correctJsInteropTypes.kt") + public void testCorrectJsInteropTypes() { + runTest("compiler/testData/diagnostics/wasmTests/jsInterop/correctJsInteropTypes.kt"); + } + @Test @TestMetadata("definedExternally.kt") public void testDefinedExternally() { @@ -124,9 +136,9 @@ public class DiagnosticsWasmTestGenerated extends AbstractDiagnosticsWasmTest { } @Test - @TestMetadata("types.kt") - public void testTypes() { - runTest("compiler/testData/diagnostics/wasmTests/jsInterop/types.kt"); + @TestMetadata("wrongJsInteropTypes.kt") + public void testWrongJsInteropTypes() { + runTest("compiler/testData/diagnostics/wasmTests/jsInterop/wrongJsInteropTypes.kt"); } @Test