FIR: introduce not implemented checker

This commit is contained in:
Mikhail Glukhikh
2021-03-18 22:24:14 +03:00
parent 9ae41f5c07
commit 9ce8420491
50 changed files with 320 additions and 147 deletions
@@ -23,8 +23,8 @@ abstract class D {
abstract val d: @An Int
}
class E : D(), A
class F : A
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class E<!> : D(), A
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class F<!> : A
@An
interface G {
@@ -12,9 +12,9 @@ fun foo() {
x.foo()
}
object Rr : SomeTrait {}
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>object Rr<!> : SomeTrait {}
class C : SomeTrait {}
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class C<!> : SomeTrait {}
fun foo2() {
val r = object : Runnable {} //no error
@@ -1,30 +0,0 @@
//KT-559 Forbid abstract method call through super
package kt559
abstract class A {
abstract val i : Int
abstract fun foo() : Int
fun fff() {}
}
abstract class D(): A() {
override val i : Int = 34
}
class C() : D() {
fun test() {
super.i
}
}
class B() : A() {
override fun foo(): Int {
super.<!ABSTRACT_SUPER_CALL!>i<!>
super.fff() //everything is ok
return super.<!ABSTRACT_SUPER_CALL!>foo<!>()
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
//KT-559 Forbid abstract method call through super
package kt559
@@ -5,11 +5,11 @@ interface T {
val v : Int
}
open class Br(t : T) : T {
open <!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class Br<!>(t : T) : T {
}
class Br3(t : T) : Br(t) {
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class Br3<!>(t : T) : Br(t) {
}
@@ -108,7 +108,7 @@ public class A extends AImpl implements List<String> {
}
// FILE: X.kt
class X : A()
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class X<!> : A()
fun main() {
val x = X()
@@ -95,7 +95,7 @@ public class A extends AImpl implements List<String> {
}
// FILE: X.kt
class X : A()
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class X<!> : A()
fun main() {
val x = X()
@@ -11,7 +11,7 @@ public abstract class B implements A {
// FILE: C.kt
class C : B()
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class C<!> : B()
fun main() {
C().a
@@ -24,7 +24,7 @@ abstract class C {
}
}
object D : C() {
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>object D<!> : C() {
<!INCOMPATIBLE_MODIFIERS!>override<!> <!INCOMPATIBLE_MODIFIERS!>const<!> val x: Int = 9
const val inObject = 10
@@ -1,28 +0,0 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-common
// FILE: common.kt
interface Foo {
fun foo()
}
expect class ImplicitFoo : Foo
expect class ExplicitFoo : Foo {
override fun foo()
}
expect class ImplicitFooCheck : Foo
// MODULE: m2-jvm(m1-common)
// FILE: jvm.kt
actual class ImplicitFoo : Foo {
override fun foo() {}
}
actual class ExplicitFoo : Foo {
actual override fun foo() {}
}
actual class ImplicitFooCheck : Foo
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-common
// FILE: common.kt
@@ -1,6 +0,0 @@
abstract class A {
abstract fun foo(): Int
}
class B() : A() {
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
abstract class A {
abstract fun foo(): Int
}
@@ -1,6 +0,0 @@
abstract class A {
abstract val i: Int
}
class B() : A() {
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
abstract class A {
abstract val i: Int
}
@@ -1,6 +0,0 @@
abstract class A {
abstract var i: Int
}
class B() : A() {
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
abstract class A {
abstract var i: Int
}
@@ -21,21 +21,21 @@ open class MyClass() : MyTrait, MyAbstractClass() {
class MyChildClass() : MyClass() {}
class MyIllegalClass : MyTrait, MyAbstractClass() {}
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class MyIllegalClass<!> : MyTrait, MyAbstractClass() {}
class MyIllegalClass2() : MyTrait, MyAbstractClass() {
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class MyIllegalClass2<!>() : MyTrait, MyAbstractClass() {
override fun foo() {}
override val pr : Unit = Unit
override val prr : Unit = Unit
}
class MyIllegalClass3() : MyTrait, MyAbstractClass() {
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class MyIllegalClass3<!>() : MyTrait, MyAbstractClass() {
override fun bar() {}
override val pr : Unit = Unit
override val prr : Unit = Unit
}
class MyIllegalClass4() : MyTrait, MyAbstractClass() {
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class MyIllegalClass4<!>() : MyTrait, MyAbstractClass() {
fun foo() {}
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val pr : Unit<!>
override fun other() {}
@@ -1,9 +0,0 @@
abstract class A {
abstract override fun toString(): String
}
interface B
abstract class C : A(), B
class Test : C()
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
abstract class A {
abstract override fun toString(): String
}
@@ -1,14 +0,0 @@
interface A {
fun test() {
}
}
interface B : A {
override fun test()
}
interface C : A
interface D : C, B
class K : D
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
interface A {
fun test() {
}
@@ -1,10 +0,0 @@
interface Runnable {
fun run()
}
class C {
fun f() {
class MyRunnable(): Runnable {
}
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
interface Runnable {
fun run()
}
@@ -6,6 +6,6 @@ open class Q {
val x: Int = 42
}
class R : P, Q()
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class R<!> : P, Q()
val s: Q = object : Q(), P {}
@@ -22,7 +22,7 @@ abstract class A2 {
abstract fun foo()
}
class B2 : A2()
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class B2<!> : A2()
class C2 : B2() {
override fun foo() {}
}
@@ -33,7 +33,7 @@ class E : D(), B {
override fun bar(x: CharSequence?, y: List<*>?): String = ""
}
class E2 : B {
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class E2<!> : B {
override fun foo(x: Any, y: List<String?>): String = ""
}
@@ -36,6 +36,6 @@ class E1 : C.D(), B {
override fun foo(x: Any, y: Fun<Any?>) {}
}
class E2 : B {
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class E2<!> : B {
override fun foo(x: Any, y: Fun<String?>) {}
}
@@ -14,20 +14,20 @@ public interface B {
// FILE: C.kt
class C1 : A, B {
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class C1<!> : A, B {
override fun foo(x: String) {}
}
class C2 : A, B {
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class C2<!> : A, B {
override fun foo(x: String?) {}
}
interface I : A, B
class C3 : I {
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class C3<!> : I {
override fun foo(x: String) {}
}
class C4 : I {
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class C4<!> : I {
override fun foo(x: String?) {}
}
@@ -57,7 +57,7 @@ interface I {
fun foo2()
}
class X : I {
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class X<!> : I {
override fun foo1() {
}
}
@@ -10,5 +10,5 @@ class BasicRecord(val x: String)
data class BasicDataRecord(val x: String)
@JvmRecord
class BasicRecordWithSuperClass(val x: String) : Record()
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class BasicRecordWithSuperClass<!>(val x: String) : Record()