diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onLocalExtensionFun.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onLocalExtensionFun.kt index d40bd9b50a5..64c689af8d6 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onLocalExtensionFun.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onLocalExtensionFun.kt @@ -5,10 +5,19 @@ fun foo() { fun Int.set(a: String, v: Int) {} [nativeSetter] - fun Int.set2(a: Number, v: String?) = "OK" + fun Int.set2(a: Number, v: String?): Any? = null [nativeSetter] - fun Int.set3(a: Double, v: String?) = "OK" + fun Int.set3(a: Double, v: String) = "OK" + + [nativeSetter] + fun Int.set4(a: Double, v: String): Any = 1 + + [nativeSetter] + fun Int.set5(a: Double, v: String): CharSequence = "OK" + + [nativeSetter] + fun Int.set6(a: Double, v: String): Number = 1 [nativeSetter] fun Int.set(a: Any): Int? = 1 @@ -20,5 +29,5 @@ fun foo() { fun Int.set3(a: Any, b: Int, c: Any?) {} [nativeSetter] - fun Any.foo(a: Double = 0.0, v: String? = null) = "OK" + fun Any.foo(a: Double = 0.0, v: String? = null) = "OK" } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onLocalNativeClassMembers.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onLocalNativeClassMembers.kt index 2f79ac8a614..7950f5db146 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onLocalNativeClassMembers.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onLocalNativeClassMembers.kt @@ -11,6 +11,12 @@ fun foo() { nativeSetter fun foo(a: Int, v: String) {} + + nativeSetter + fun set4(a: Double, v: String): Any = 1 + + nativeSetter + fun set5(a: Double, v: String): CharSequence = "OK" } [native] @@ -25,10 +31,13 @@ fun foo() { fun Int.set(a: String, v: Int) {} nativeSetter - fun Int.set2(a: Number, v: String?) = "OK" + fun Int.set2(a: Number, v: String?) = "OK" nativeSetter - fun Int.set3(a: Double, v: String?) = "OK" + fun Int.set3(a: Double, v: String?) = "OK" + + nativeSetter + fun set6(a: Double, v: String): Number = 1 nativeSetter fun set(): Any? = null diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onLocalNonNativeClassMembers.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onLocalNonNativeClassMembers.kt index 39e9c01a55a..c5b1af46a0a 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onLocalNonNativeClassMembers.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onLocalNonNativeClassMembers.kt @@ -22,10 +22,10 @@ fun foo() { fun Int.set(a: String, v: Int) {} nativeSetter - fun Int.set2(a: Number, v: String?) = "OK" + fun Int.set2(a: Number, v: String?) = "OK" nativeSetter - fun Int.set3(a: Double, v: String?) = "OK" + fun Int.set3(a: Double, v: String?) = "OK" nativeSetter fun set(): Any? = null diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNativeClassMembers.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNativeClassMembers.kt index 18792d639ba..c6a532c28cd 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNativeClassMembers.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNativeClassMembers.kt @@ -11,6 +11,12 @@ class A { nativeSetter fun foo(a: Int, v: String) {} + nativeSetter + fun set4(a: Double, v: String): Any = 1 + + nativeSetter + fun set5(a: Double, v: String): CharSequence = "OK" + class object { nativeSetter fun set(a: String, v: Any?): Any? = null @@ -20,6 +26,12 @@ class A { nativeSetter fun foo(a: Int, v: String) {} + + nativeSetter + fun set4(a: Double, v: String): Any = 1 + + nativeSetter + fun set5(a: Double, v: String): CharSequence = "OK" } } @@ -46,10 +58,13 @@ class C { fun Int.set(a: String, v: Int) {} nativeSetter - fun Int.set2(a: Number, v: String?) = "OK" + fun Int.set2(a: Number, v: String?) = "OK" nativeSetter - fun Int.set3(a: Double, v: String?) = "OK" + fun Int.set3(a: Double, v: String?) = "OK" + + nativeSetter + fun set6(a: Double, v: String): Number = 1 nativeSetter fun set(): Any? = null diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNativeClassMembers.txt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNativeClassMembers.txt index 2ba6ab35092..06c65f23473 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNativeClassMembers.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNativeClassMembers.txt @@ -7,6 +7,8 @@ kotlin.js.native() internal final class A { public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int kotlin.js.nativeSetter() internal final fun put(/*0*/ a: kotlin.Number, /*1*/ v: kotlin.String): kotlin.Unit kotlin.js.nativeSetter() internal final fun set(/*0*/ a: kotlin.String, /*1*/ v: kotlin.Any?): kotlin.Any? + kotlin.js.nativeSetter() internal final fun set4(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.Any + kotlin.js.nativeSetter() internal final fun set5(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.CharSequence public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String internal class object { @@ -16,6 +18,8 @@ kotlin.js.native() internal final class A { public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int kotlin.js.nativeSetter() internal final fun put(/*0*/ a: kotlin.Number, /*1*/ v: kotlin.String): kotlin.Unit kotlin.js.nativeSetter() internal final fun set(/*0*/ a: kotlin.String, /*1*/ v: kotlin.Any?): kotlin.Any? + kotlin.js.nativeSetter() internal final fun set4(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.Any + kotlin.js.nativeSetter() internal final fun set5(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.CharSequence public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } } @@ -73,6 +77,7 @@ kotlin.js.native() internal final class C { kotlin.js.nativeSetter() internal final fun set(/*0*/ a: A): kotlin.Any? kotlin.js.nativeSetter() internal final fun set(/*0*/ a: A, /*1*/ v: kotlin.Any?): kotlin.Unit kotlin.js.nativeSetter() internal final fun set(/*0*/ a: kotlin.String, /*1*/ v: kotlin.Any, /*2*/ v2: kotlin.Any): kotlin.Unit + kotlin.js.nativeSetter() internal final fun set6(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.Number public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String kotlin.js.nativeSetter() internal final fun kotlin.Int.set(/*0*/ a: kotlin.String, /*1*/ v: kotlin.Int): kotlin.Unit kotlin.js.nativeSetter() internal final fun kotlin.Int.set2(/*0*/ a: kotlin.Number, /*1*/ v: kotlin.String?): kotlin.String diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNativeClass.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNativeClass.kt index b417ec58a04..3c5ddfafc9e 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNativeClass.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNativeClass.kt @@ -13,6 +13,12 @@ class A { nativeSetter fun foo(a: Int, v: String) {} + nativeSetter + fun set4(a: Double, v: String): Any = 1 + + nativeSetter + fun set5(a: Double, v: String): CharSequence = "OK" + class object { nativeSetter fun set(a: String, v: Any?): Any? = null @@ -22,6 +28,12 @@ class A { nativeSetter fun foo(a: Int, v: String) {} + + nativeSetter + fun set4(a: Double, v: String): Any = 1 + + nativeSetter + fun set5(a: Double, v: String): CharSequence = "OK" } } @@ -46,10 +58,13 @@ class A { fun Int.set(a: String, v: Int) {} nativeSetter - fun Int.set2(a: Number, v: String?) = "OK" + fun Int.set2(a: Number, v: String?) = "OK" nativeSetter - fun Int.set3(a: Double, v: String?) = "OK" + fun Int.set3(a: Double, v: String?) = "OK" + + nativeSetter + fun set6(a: Double, v: String): Number = 1 nativeSetter fun set(): Any? = null @@ -72,10 +87,10 @@ class A { fun Int.set(a: String, v: Int) {} nativeSetter - fun Int.set2(a: Number, v: String?) = "OK" + fun Int.set2(a: Number, v: String?) = "OK" nativeSetter - fun Int.set3(a: Double, v: String?) = "OK" + fun Int.set3(a: Double, v: String?) = "OK" nativeSetter fun set(): Any? = null @@ -98,10 +113,10 @@ class A { fun Int.set(a: String, v: Int) {} nativeSetter - fun Int.set2(a: Number, v: String?) = "OK" + fun Int.set2(a: Number, v: String?) = "OK" nativeSetter - fun Int.set3(a: Double, v: String?) = "OK" + fun Int.set3(a: Double, v: String?) = "OK" nativeSetter fun set(): Any? = null diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNativeClass.txt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNativeClass.txt index a9f55120c1a..89e1712e332 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNativeClass.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNativeClass.txt @@ -20,6 +20,8 @@ kotlin.js.native() internal final class A { public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int kotlin.js.nativeSetter() internal final fun put(/*0*/ a: kotlin.Number, /*1*/ v: kotlin.String): kotlin.Unit kotlin.js.nativeSetter() internal final fun set(/*0*/ a: kotlin.String, /*1*/ v: kotlin.Any?): kotlin.Any? + kotlin.js.nativeSetter() internal final fun set4(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.Any + kotlin.js.nativeSetter() internal final fun set5(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.CharSequence public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String internal class object { @@ -29,6 +31,8 @@ kotlin.js.native() internal final class A { public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int kotlin.js.nativeSetter() internal final fun put(/*0*/ a: kotlin.Number, /*1*/ v: kotlin.String): kotlin.Unit kotlin.js.nativeSetter() internal final fun set(/*0*/ a: kotlin.String, /*1*/ v: kotlin.Any?): kotlin.Any? + kotlin.js.nativeSetter() internal final fun set4(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.Any + kotlin.js.nativeSetter() internal final fun set5(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.CharSequence public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } } @@ -86,6 +90,7 @@ kotlin.js.native() internal final class A { kotlin.js.nativeSetter() internal final fun set(/*0*/ a: A.B.A): kotlin.Any? kotlin.js.nativeSetter() internal final fun set(/*0*/ a: A.B.A, /*1*/ v: kotlin.Any?): kotlin.Unit kotlin.js.nativeSetter() internal final fun set(/*0*/ a: kotlin.String, /*1*/ v: kotlin.Any, /*2*/ v2: kotlin.Any): kotlin.Unit + kotlin.js.nativeSetter() internal final fun set6(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.Number public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String kotlin.js.nativeSetter() internal final fun kotlin.Int.set(/*0*/ a: kotlin.String, /*1*/ v: kotlin.Int): kotlin.Unit kotlin.js.nativeSetter() internal final fun kotlin.Int.set2(/*0*/ a: kotlin.Number, /*1*/ v: kotlin.String?): kotlin.String diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNonNativeClass.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNonNativeClass.kt index 9537bebf2a8..a5dd9690c45 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNonNativeClass.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNonNativeClass.kt @@ -12,6 +12,12 @@ class A { nativeSetter fun foo(a: Int, v: String) {} + nativeSetter + fun set4(a: Double, v: String): Any = 1 + + nativeSetter + fun set5(a: Double, v: String): CharSequence = "OK" + class object { nativeSetter fun set(a: String, v: Any?): Any? = null @@ -45,10 +51,13 @@ class A { fun Int.set(a: String, v: Int) {} nativeSetter - fun Int.set2(a: Number, v: String?) = "OK" + fun Int.set2(a: Number, v: String?) = "OK" nativeSetter - fun Int.set3(a: Double, v: String?) = "OK" + fun Int.set3(a: Double, v: String?) = "OK" + + nativeSetter + fun Int.set6(a: Double, v: String): Number = 1 nativeSetter fun set(): Any? = null @@ -71,10 +80,10 @@ class A { fun Int.set(a: String, v: Int) {} nativeSetter - fun Int.set2(a: Number, v: String?) = "OK" + fun Int.set2(a: Number, v: String?) = "OK" nativeSetter - fun Int.set3(a: Double, v: String?) = "OK" + fun Int.set3(a: Double, v: String?) = "OK" nativeSetter fun set(): Any? = null @@ -97,10 +106,10 @@ class A { fun Int.set(a: String, v: Int) {} nativeSetter - fun Int.set2(a: Number, v: String?) = "OK" + fun Int.set2(a: Number, v: String?) = "OK" nativeSetter - fun Int.set3(a: Double, v: String?) = "OK" + fun Int.set3(a: Double, v: String?) = "OK" nativeSetter fun set(): Any? = null diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNonNativeClass.txt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNonNativeClass.txt index 11a0244c436..b45b9918763 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNonNativeClass.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNestedDeclarationsInsideNonNativeClass.txt @@ -20,6 +20,8 @@ internal final class A { public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int kotlin.js.nativeSetter() internal final fun put(/*0*/ a: kotlin.Number, /*1*/ v: kotlin.String): kotlin.Unit kotlin.js.nativeSetter() internal final fun set(/*0*/ a: kotlin.String, /*1*/ v: kotlin.Any?): kotlin.Any? + kotlin.js.nativeSetter() internal final fun set4(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.Any + kotlin.js.nativeSetter() internal final fun set5(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.CharSequence public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String internal class object { @@ -90,6 +92,7 @@ internal final class A { kotlin.js.nativeSetter() internal final fun kotlin.Int.set(/*0*/ a: kotlin.String, /*1*/ v: kotlin.Int): kotlin.Unit kotlin.js.nativeSetter() internal final fun kotlin.Int.set2(/*0*/ a: kotlin.Number, /*1*/ v: kotlin.String?): kotlin.String kotlin.js.nativeSetter() internal final fun kotlin.Int.set3(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String?): kotlin.String + kotlin.js.nativeSetter() internal final fun kotlin.Int.set6(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.Number } internal object obj { diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNonNativeClassMembers.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNonNativeClassMembers.kt index 250438dc32e..c78bdccf915 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNonNativeClassMembers.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onNonNativeClassMembers.kt @@ -43,10 +43,10 @@ class C { fun Int.set(a: String, v: Int) {} nativeSetter - fun Int.set2(a: Number, v: String?) = "OK" + fun Int.set2(a: Number, v: String?) = "OK" nativeSetter - fun Int.set3(a: Double, v: String?) = "OK" + fun Int.set3(a: Double, v: String?) = "OK" nativeSetter fun set(): Any? = null diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onToplevelExtensionFun.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onToplevelExtensionFun.kt index a4bcbd0fe3c..20e4e44c14c 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onToplevelExtensionFun.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onToplevelExtensionFun.kt @@ -4,12 +4,21 @@ nativeSetter fun Int.set(a: String, v: Int) {} nativeSetter -fun Int.set2(a: Number, v: String?) = "OK" +fun Int.set2(a: Number, v: String?): Any? = null nativeSetter -fun Int.set3(a: Double, v: String?) = "OK" +fun Int.set3(a: Double, v: String) = "OK" -[nativeSetter] +nativeSetter +fun Int.set4(a: Double, v: String): Any = 1 + +nativeSetter +fun Int.set5(a: Double, v: String): CharSequence = "OK" + +nativeSetter +fun Int.set6(a: Double, v: String): Number = 1 + +nativeSetter fun Any.foo(a: String = "0.0", v: String = "str") = "OK" nativeSetter diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onToplevelExtensionFun.txt b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onToplevelExtensionFun.txt index 3326236cf5d..45af1658b7b 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onToplevelExtensionFun.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/nativeSetter/onToplevelExtensionFun.txt @@ -4,6 +4,9 @@ kotlin.js.nativeSetter() internal fun kotlin.Any.foo(/*0*/ a: kotlin.String = .. kotlin.js.nativeSetter() internal fun kotlin.Int.set(/*0*/ a: [ERROR : A]): kotlin.Int? kotlin.js.nativeSetter() internal fun kotlin.Int.set(/*0*/ a: kotlin.String, /*1*/ v: kotlin.Int): kotlin.Unit kotlin.js.nativeSetter() internal fun kotlin.Int.set2(): kotlin.String? -kotlin.js.nativeSetter() internal fun kotlin.Int.set2(/*0*/ a: kotlin.Number, /*1*/ v: kotlin.String?): kotlin.String +kotlin.js.nativeSetter() internal fun kotlin.Int.set2(/*0*/ a: kotlin.Number, /*1*/ v: kotlin.String?): kotlin.Any? kotlin.js.nativeSetter() internal fun kotlin.Int.set3(/*0*/ a: kotlin.Any, /*1*/ b: kotlin.Int, /*2*/ c: kotlin.Any?): kotlin.Unit -kotlin.js.nativeSetter() internal fun kotlin.Int.set3(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String?): kotlin.String +kotlin.js.nativeSetter() internal fun kotlin.Int.set3(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.String +kotlin.js.nativeSetter() internal fun kotlin.Int.set4(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.Any +kotlin.js.nativeSetter() internal fun kotlin.Int.set5(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.CharSequence +kotlin.js.nativeSetter() internal fun kotlin.Int.set6(/*0*/ a: kotlin.Double, /*1*/ v: kotlin.String): kotlin.Number diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/nativeSetter.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/nativeSetter.kt index 3505007ac94..acdb5174c2e 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/nativeSetter.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/nativeSetter.kt @@ -7,7 +7,7 @@ fun String.bar(n: Int, v: Any) {} native class C { nativeSetter - fun foo(d: Double, v: Any): String? + fun foo(d: Double, v: Any): Any nativeSetter - fun bar(d: Double, v: Any): String? = noImpl + fun bar(d: Double, v: Any): Any = noImpl } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/nativeSetter.txt b/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/nativeSetter.txt index d829c4c9850..1b22dfa8d33 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/nativeSetter.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/optionlBody/nativeSetter.txt @@ -5,9 +5,9 @@ kotlin.js.nativeSetter() internal fun kotlin.String.foo(/*0*/ n: kotlin.Int, /*1 kotlin.js.native() internal final class C { public constructor C() - kotlin.js.nativeSetter() internal final fun bar(/*0*/ d: kotlin.Double, /*1*/ v: kotlin.Any): kotlin.String? + kotlin.js.nativeSetter() internal final fun bar(/*0*/ d: kotlin.Double, /*1*/ v: kotlin.Any): kotlin.Any public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - kotlin.js.nativeSetter() internal final fun foo(/*0*/ d: kotlin.Double, /*1*/ v: kotlin.Any): kotlin.String? + kotlin.js.nativeSetter() internal final fun foo(/*0*/ d: kotlin.Double, /*1*/ v: kotlin.Any): kotlin.Any public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } diff --git a/js/js.frontend/src/org/jetbrains/k2js/resolve/KotlinJsDeclarationCheckerProvider.kt b/js/js.frontend/src/org/jetbrains/k2js/resolve/KotlinJsDeclarationCheckerProvider.kt index b3b65ead444..8527e073c7a 100644 --- a/js/js.frontend/src/org/jetbrains/k2js/resolve/KotlinJsDeclarationCheckerProvider.kt +++ b/js/js.frontend/src/org/jetbrains/k2js/resolve/KotlinJsDeclarationCheckerProvider.kt @@ -30,6 +30,7 @@ import org.jetbrains.k2js.PredefinedAnnotation import org.jetbrains.jet.lang.resolve.DescriptorUtils import org.jetbrains.k2js.translate.utils.AnnotationsUtils import org.jetbrains.jet.lang.descriptors.Visibilities +import org.jetbrains.jet.lang.types.typeUtil.isSubtypeOf public object KotlinJsDeclarationCheckerProvider : AdditionalCheckerProvider { override val annotationCheckers: List = listOf(NativeInvokeChecker(), NativeGetterChecker(), NativeSetterChecker()) @@ -76,7 +77,7 @@ private abstract class AbstractNativeIndexerChecker( if (firstParamClassDescriptor != KotlinBuiltIns.getInstance().getString() && !DescriptorUtils.isSubclass(firstParamClassDescriptor, KotlinBuiltIns.getInstance().getNumber()) ) { - diagnosticHolder.report(ErrorsJs.NATIVE_INDEXER_KEY_SHOULD_BE_STRING_OR_NUMBER.on(declaration.getValueParameters().first, indexerKind)) + diagnosticHolder.report(ErrorsJs.NATIVE_INDEXER_KEY_SHOULD_BE_STRING_OR_NUMBER.on(declaration.getValueParameters().firstOrNull(), indexerKind)) } } @@ -102,4 +103,19 @@ public class NativeGetterChecker : AbstractNativeIndexerChecker(PredefinedAnnota } } -public class NativeSetterChecker : AbstractNativeIndexerChecker(PredefinedAnnotation.NATIVE_SETTER, "setter", requiredParametersCount = 2) +public class NativeSetterChecker : AbstractNativeIndexerChecker(PredefinedAnnotation.NATIVE_SETTER, "setter", requiredParametersCount = 2) { + override fun additionalCheck(declaration: JetNamedFunction, descriptor: FunctionDescriptor, diagnosticHolder: DiagnosticSink) { + super.additionalCheck(declaration, descriptor, diagnosticHolder) + + val returnType = descriptor.getReturnType() + if (KotlinBuiltIns.isUnit(returnType)) return + + val parameters = descriptor.getValueParameters() + if (parameters.size() < 2) return + + val secondParameterType = parameters.get(1).getType() + if (secondParameterType isSubtypeOf returnType) return + + diagnosticHolder.report(ErrorsJs.NATIVE_SETTER_WRONG_RETURN_TYPE.on(declaration)) + } +} diff --git a/js/js.frontend/src/org/jetbrains/k2js/resolve/diagnostics/DefaultErrorMessagesJs.kt b/js/js.frontend/src/org/jetbrains/k2js/resolve/diagnostics/DefaultErrorMessagesJs.kt index bc0ced6af79..dbad87eaf5d 100644 --- a/js/js.frontend/src/org/jetbrains/k2js/resolve/diagnostics/DefaultErrorMessagesJs.kt +++ b/js/js.frontend/src/org/jetbrains/k2js/resolve/diagnostics/DefaultErrorMessagesJs.kt @@ -29,6 +29,7 @@ private val DIAGNOSTIC_FACTORY_TO_RENDERER by Delegates.lazy { put(ErrorsJs.NATIVE_INDEXER_KEY_SHOULD_BE_STRING_OR_NUMBER, "Native {0}''s first parameter type should be ''kotlin.String'' or subtype of ''kotlin.Number''", Renderers.STRING) put(ErrorsJs.NATIVE_INDEXER_CAN_NOT_HAVE_DEFAULT_ARGUMENTS, "Native {0}''s parameter can not have default value", Renderers.STRING) put(ErrorsJs.NATIVE_GETTER_RETURN_TYPE_SHOULD_BE_NULLABLE, "Native getter''s return type should be nullable") + put(ErrorsJs.NATIVE_SETTER_WRONG_RETURN_TYPE, "Native setter''s return type should be ''Unit'' or a supertype of the second parameter''s type") put(ErrorsJs.NATIVE_INDEXER_WRONG_PARAMETER_COUNT, "Expected {0} parameters for native {1}", Renderers.TO_STRING, Renderers.STRING) put(ErrorsJs.JSCODE_ERROR, "JavaScript: {0}", Renderers.TO_STRING, Renderers.TO_STRING) put(ErrorsJs.JSCODE_WARNING, "JavaScript: {0}", Renderers.TO_STRING, Renderers.TO_STRING) diff --git a/js/js.frontend/src/org/jetbrains/k2js/resolve/diagnostics/ErrorsJs.java b/js/js.frontend/src/org/jetbrains/k2js/resolve/diagnostics/ErrorsJs.java index 369291f02c1..c4c24b2d3d2 100644 --- a/js/js.frontend/src/org/jetbrains/k2js/resolve/diagnostics/ErrorsJs.java +++ b/js/js.frontend/src/org/jetbrains/k2js/resolve/diagnostics/ErrorsJs.java @@ -36,6 +36,7 @@ public interface ErrorsJs { DiagnosticFactory1 NATIVE_INDEXER_KEY_SHOULD_BE_STRING_OR_NUMBER = DiagnosticFactory1.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT); DiagnosticFactory1 NATIVE_INDEXER_CAN_NOT_HAVE_DEFAULT_ARGUMENTS = DiagnosticFactory1.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT); DiagnosticFactory0 NATIVE_GETTER_RETURN_TYPE_SHOULD_BE_NULLABLE = DiagnosticFactory0.create(ERROR, DECLARATION_RETURN_TYPE); + DiagnosticFactory0 NATIVE_SETTER_WRONG_RETURN_TYPE = DiagnosticFactory0.create(ERROR, DECLARATION_RETURN_TYPE); DiagnosticFactory2 NATIVE_INDEXER_WRONG_PARAMETER_COUNT = DiagnosticFactory2.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT); DiagnosticFactory2> JSCODE_ERROR = DiagnosticFactory2.create(ERROR, JsCodePositioningStrategy.INSTANCE$); DiagnosticFactory2> JSCODE_WARNING = DiagnosticFactory2.create(WARNING, JsCodePositioningStrategy.INSTANCE$);