[FIR JS] Implement FirJsExternalChecker

The JsAllowValueClassesInExternals feature is enabled explicitly,
because otherwise it's enabled
implicitly depending on the backend. See:
org/jetbrains/kotlin/test/builders/LanguageVersionSettingsBuilder.kt:90

A property may have a fake source return kind, while its accessor
has a real source kind. In this case we can't "just copy"
the property return type down to the accessor.
This commit is contained in:
Nikolay Lunyak
2023-01-04 16:42:00 +02:00
committed by Space Team
parent 7b8f5f9980
commit a20e29e8b7
54 changed files with 758 additions and 456 deletions
@@ -1,5 +0,0 @@
external class A {
init {
definedExternally
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
external class A {
<!EXTERNAL_ANONYMOUS_INITIALIZER!>init {
definedExternally
@@ -1,30 +0,0 @@
external fun foo(): Int = definedExternally
external fun bar(): Unit {
definedExternally
}
external fun baz(): Int = 23
external fun f(x: Int, y: String = definedExternally): Unit
external fun g(x: Int, y: String = ""): Unit
external var a: Int
get() = definedExternally
set(value) {
definedExternally
}
external val b: Int
get() = 23
external val c: Int = definedExternally
external val d: Int = 23
external class C {
fun foo(): Int = definedExternally
fun bar(): Int = 23
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
external fun foo(): Int = definedExternally
external fun bar(): Unit {
@@ -27,4 +28,4 @@ external class C {
fun foo(): Int = definedExternally
fun bar(): Int = <!WRONG_BODY_OF_EXTERNAL_DECLARATION!>23<!>
}
}
@@ -1,17 +1,17 @@
// !DIAGNOSTICS: -DEBUG_INFO_MISSING_UNRESOLVED
external open class Base(x: Int) {
constructor(x: String) : this(23)
constructor(x: String) : <!EXTERNAL_DELEGATED_CONSTRUCTOR_CALL!>this<!>(23)
constructor(x: String, y: String) : this("")
constructor(x: String, y: String) : <!EXTERNAL_DELEGATED_CONSTRUCTOR_CALL!>this<!>("")
}
external open class Derived1() : Base(23) {
constructor(x: Byte) : super(23)
external open class Derived1() : <!EXTERNAL_DELEGATED_CONSTRUCTOR_CALL!>Base(23)<!> {
constructor(x: Byte) : <!EXTERNAL_DELEGATED_CONSTRUCTOR_CALL!>super<!>(23)
constructor(x: String) : super("")
constructor(x: String) : <!EXTERNAL_DELEGATED_CONSTRUCTOR_CALL!>super<!>("")
constructor(x: String, y: String) : super("")
constructor(x: String, y: String) : <!EXTERNAL_DELEGATED_CONSTRUCTOR_CALL!>super<!>("")
}
external open class Derived2() : Base("")
external open class Derived2() : <!EXTERNAL_DELEGATED_CONSTRUCTOR_CALL!>Base("")<!>
@@ -9,10 +9,10 @@ class Delegate {
operator fun setValue(thisRef: Any?, property: Any, value: String) {}
}
external class A : I by O {
val prop by Delegate()
external class A : <!EXTERNAL_DELEGATION!>I<!> by O {
val prop by <!EXTERNAL_DELEGATION!>Delegate()<!>
var mutableProp by Delegate()
var mutableProp by <!EXTERNAL_DELEGATION!>Delegate()<!>
}
external val topLevelProp by Delegate()
external val topLevelProp by <!EXTERNAL_DELEGATION!>Delegate()<!>
@@ -1,7 +1,7 @@
external enum class E {
X,
Y {
<!EXTERNAL_ENUM_ENTRY_WITH_BODY!>Y {
fun foo()
},
Z {}
},<!>
<!EXTERNAL_ENUM_ENTRY_WITH_BODY!>Z {}<!>
}
@@ -1,10 +0,0 @@
class A
external fun A.foo(): Unit = definedExternally
external var A.bar: String
get() = definedExternally
set(value) = definedExternally
external val A.baz: String
get() = definedExternally
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
class A
<!WRONG_EXTERNAL_DECLARATION!>external fun A.foo(): Unit<!> = definedExternally
@@ -1,25 +0,0 @@
external fun foo(f: Int.() -> Int)
external fun bar(vararg f: Int.() -> Int)
external fun baz(): Int.() -> Int
external val prop: Int.() -> Int
external var prop2: Int.() -> Int
external val propGet
get(): Int.() -> Int = definedExternally
external var propSet
get(): Int.() -> Int = definedExternally
set(v: Int.() -> Int) = definedExternally
external class A(f: Int.() -> Int)
external data class B(
val a: Int.() -> Int,
var b: Int.() -> Int
) {
val c: Int.() -> Int
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
external fun foo(<!EXTENSION_FUNCTION_IN_EXTERNAL_DECLARATION!>f: Int.() -> Int<!>)
external fun bar(<!EXTENSION_FUNCTION_IN_EXTERNAL_DECLARATION!>vararg f: Int.() -> Int<!>)
@@ -1,3 +0,0 @@
external fun interface I {
fun f()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
external fun interface <!WRONG_EXTERNAL_DECLARATION!>I<!> {
fun f()
}
@@ -1,11 +0,0 @@
external interface I {
interface J
class C
object O
enum class E
companion object
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
external interface I {
interface J
@@ -1,19 +0,0 @@
open class A
interface I
external open class B
external class C : A
external class D : B, I
external interface K : I
external enum class E {
X
}
external enum class F : I {
X
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
open class A
interface I
@@ -1,19 +0,0 @@
// !DIAGNOSTICS: -NOTHING_TO_INLINE
inline external fun foo(): Unit
inline external val bar: Int
get() = definedExternally
external val baz: Int
inline get() = definedExternally
external class A {
inline fun foo(): Unit
inline val bar: Int
get() = definedExternally
val baz: Int
inline get() = definedExternally
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -NOTHING_TO_INLINE
<!INLINE_EXTERNAL_DECLARATION!>inline external fun foo(): Unit<!>
@@ -1,9 +0,0 @@
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
external inline class C(val a: Int) {
fun foo()
}
<!WRONG_MODIFIER_TARGET!>inline<!> external enum class E {
A
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
external inline class <!WRONG_EXTERNAL_DECLARATION!>C(<!EXTERNAL_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER!>val a: Int<!>)<!> {
@@ -1,64 +0,0 @@
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
// FILE: uint.kt
package kotlin
inline class UInt(private val i: Int)
// FILE: test.kt
inline class SomeIC(val a: Int)
external val l: SomeIC
external val ll
get(): SomeIC = definedExternally
external var r: SomeIC
external var rr: SomeIC
get() = definedExternally
set(v: SomeIC) { definedExternally }
external fun foo(): SomeIC
external fun foo(c: SomeIC): SomeIC
external fun foo(a: Int, c: SomeIC): SomeIC
external fun foo(a: Int, <!FORBIDDEN_VARARG_PARAMETER_TYPE!>vararg<!> args: SomeIC)
external fun foo(a: Int, ui: UInt, vararg args: UInt)
external class CC(
a: SomeIC,
val b: SomeIC,
var c: SomeIC
) {
val l: SomeIC
var r: SomeIC
fun foo(): SomeIC
fun foo(c: SomeIC): SomeIC
fun foo(a: Int, c: SomeIC): SomeIC
class N(
a: SomeIC,
val b: SomeIC,
var c: SomeIC
) {
val l: SomeIC
var r: SomeIC
fun foo(): SomeIC
fun foo(c: SomeIC): SomeIC
fun foo(a: Int, c: SomeIC): SomeIC
}
}
external interface EI {
val l: SomeIC
var r: SomeIC
fun foo(): SomeIC
fun foo(c: SomeIC): SomeIC
fun foo(a: Int, c: SomeIC): SomeIC
}
@@ -1,4 +1,5 @@
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
// FIR_IDENTICAL
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, -JsAllowValueClassesInExternals
// FILE: uint.kt
@@ -1,65 +0,0 @@
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, +JsAllowValueClassesInExternals
// !DIAGNOSTICS: +INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING
// FILE: uint.kt
package kotlin
inline class UInt(private val i: Int)
// FILE: test.kt
inline class SomeIC(val a: Int)
external val l: SomeIC
external val ll
get(): SomeIC = definedExternally
external var r: SomeIC
external var rr: SomeIC
get() = definedExternally
set(v: SomeIC) { definedExternally }
external fun foo(): SomeIC
external fun foo(c: SomeIC): SomeIC
external fun foo(a: Int, c: SomeIC): SomeIC
external fun foo(a: Int, <!FORBIDDEN_VARARG_PARAMETER_TYPE!>vararg<!> args: SomeIC)
external fun foo(a: Int, ui: UInt, vararg args: UInt)
external class CC(
a: SomeIC,
val b: SomeIC,
var c: SomeIC
) {
val l: SomeIC
var r: SomeIC
fun foo(): SomeIC
fun foo(c: SomeIC): SomeIC
fun foo(a: Int, c: SomeIC): SomeIC
class N(
a: SomeIC,
val b: SomeIC,
var c: SomeIC
) {
val l: SomeIC
var r: SomeIC
fun foo(): SomeIC
fun foo(c: SomeIC): SomeIC
fun foo(a: Int, c: SomeIC): SomeIC
}
}
external interface EI {
val l: SomeIC
var r: SomeIC
fun foo(): SomeIC
fun foo(c: SomeIC): SomeIC
fun foo(a: Int, c: SomeIC): SomeIC
}
@@ -1,4 +1,6 @@
// FIR_IDENTICAL
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, +JsAllowValueClassesInExternals
// !DIAGNOSTICS: +INLINE_CLASS_IN_EXTERNAL_DECLARATION_WARNING
// FILE: uint.kt
@@ -1,9 +0,0 @@
external class C {
inner class Inner
}
external enum class E {
X;
inner class Inner
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
external class C {
inner class <!WRONG_EXTERNAL_DECLARATION!>Inner<!>
}
@@ -6,4 +7,4 @@ external enum class E {
X;
inner class <!WRONG_EXTERNAL_DECLARATION!>Inner<!>
}
}
@@ -1,41 +0,0 @@
object O
class TopLevel {
external class A
class B
fun foo() = 23
external fun bar(): Int
val x = "a"
external val y: String
val O.u: String get() = "O.u"
}
external class TopLevelNative {
external class A
class B
fun foo(): Int = definedExternally
external fun bar(): Int
val x: String = definedExternally
external val y: String
}
fun topLevelFun() {
external class A
class B
fun foo() = 23
external fun bar(): Int
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
object O
class TopLevel {
@@ -39,4 +40,3 @@ fun topLevelFun() {
<!NESTED_EXTERNAL_DECLARATION!>external fun bar(): Int<!>
}
@@ -1,21 +0,0 @@
external interface I {
fun foo(): Unit = definedExternally
val a: Int?
get() = definedExternally
var b: String?
get() = definedExternally
set(value) = definedExternally
val c: Int
get() = definedExternally
var d: String
get() = definedExternally
set(value) = definedExternally
var e: dynamic
get() = definedExternally
set(value) = definedExternally
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
external interface I {
<!NON_ABSTRACT_MEMBER_OF_EXTERNAL_INTERFACE!>fun foo(): Unit<!> = definedExternally
@@ -1,68 +0,0 @@
// !DIAGNOSTICS: -NOTHING_TO_INLINE
// TODO: should we disable NOTHING_TO_INLINE in JS backend?
// TODO: uncomment declarations in case we decide to implement KT-14031
external class C {
private fun a(): Int
private val b: String
private var c: Float
private var d: Float
get
set
var e: Float
get
private set
/*
private inline fun inline_a(): Int = 23
private inline val inline_prop: Int
get() = 42
*/
}
external object O {
private fun a(): Int
private val b: String
private var c: Float
private var d: Float
get
set
/*
private inline fun inline_a(): Int = 23
private inline val inline_prop: Int
get() = 42
*/
}
external class Outer {
class Inner {
private fun a(): Int
private val b: String
private var c: Float
private var d: Float
get
set
/*
private inline fun inline_a(): Int = 23
private inline val inline_prop: Int
get() = 42
*/
}
private class PrivateInner
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -NOTHING_TO_INLINE
// TODO: should we disable NOTHING_TO_INLINE in JS backend?
// TODO: uncomment declarations in case we decide to implement KT-14031
@@ -1 +0,0 @@
external class C(x: Int, val y: String)
@@ -1 +1,2 @@
// FIR_IDENTICAL
external class C(x: Int, <!EXTERNAL_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER!>val y: String<!>)
@@ -1,21 +0,0 @@
external annotation class A(val x: Int)
val x: Int
external get() = definedExternally
class B
val B.x: Int
external get() = definedExternally
class C {
val a: Int
external get() = definedExternally
}
external class D {
val a: Int
external get() = definedExternally
}
external data class E(val x: Int)
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
external annotation class <!WRONG_EXTERNAL_DECLARATION!>A(val x: Int)<!>
val x: Int