[Spec tests] Add diag tests for abstract classes and prefix increment
This commit is contained in:
+38
@@ -0,0 +1,38 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 1 -> sentence 1
|
||||
* RELEVANT PLACES: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: check abstract classes can have abstract not implemented members
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
|
||||
abstract class Base() {
|
||||
<!ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun foo() = {}
|
||||
<!NON_ABSTRACT_FUNCTION_WITH_NO_BODY!>fun boo() : Unit<!>
|
||||
abstract val a = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>""<!>
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val b<!>
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var d<!>
|
||||
}
|
||||
|
||||
class Impl : Base() {
|
||||
override fun foo(): () -> Unit {
|
||||
TODO("not implemented")
|
||||
}
|
||||
|
||||
override val a: String
|
||||
get() = TODO("not implemented")
|
||||
|
||||
}
|
||||
|
||||
fun case1() {
|
||||
val impl = Impl()
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 1 -> sentence 2
|
||||
* RELEVANT PLACES: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 1 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: check abstract classes cannot be instantiated directly
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
abstract class Base0()
|
||||
|
||||
abstract class Base1() {
|
||||
abstract fun foo()
|
||||
}
|
||||
|
||||
abstract class Base2(var b1: Any, val a1: Any) {
|
||||
abstract fun foo()
|
||||
}
|
||||
|
||||
fun case1() {
|
||||
val b0 = <!CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS!>Base0()<!>
|
||||
val b1 = <!CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS!>Base1()<!>
|
||||
val b2 = <!CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS!>Base2(1, "1")<!>
|
||||
}
|
||||
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 1 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: check abstract classes can have abstract not implemented members
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
|
||||
abstract class Base() {
|
||||
abstract fun foo()
|
||||
|
||||
abstract val a: String
|
||||
}
|
||||
|
||||
class Impl : Base() {
|
||||
override fun foo(): Unit {
|
||||
TODO("not implemented")
|
||||
}
|
||||
|
||||
override val a: String
|
||||
get() = TODO("not implemented")
|
||||
|
||||
}
|
||||
|
||||
fun case1() {
|
||||
val impl = Impl()
|
||||
}
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
|
||||
<!REDUNDANT_MODIFIER!>open<!> abstract class Base {
|
||||
|
||||
abstract val a: Any
|
||||
abstract var b: Any
|
||||
internal abstract val c: Any
|
||||
internal abstract var d: Any
|
||||
|
||||
|
||||
abstract fun foo()
|
||||
internal abstract fun boo(): Any
|
||||
}
|
||||
|
||||
fun case1() {
|
||||
val impl = BaseImplCase2(1, "1", 1.0)
|
||||
}
|
||||
|
||||
class BaseImplCase2(
|
||||
override var a: Any, override
|
||||
<!VAR_OVERRIDDEN_BY_VAL!>val<!> b: Any, override var c: Any, override
|
||||
|
||||
<!VAR_OVERRIDDEN_BY_VAL!>val<!> d: Any = "5") : Base()
|
||||
{
|
||||
override fun foo() {}
|
||||
override internal fun boo() {}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
|
||||
fun case2() {
|
||||
val impl = ImplBaseCase2()
|
||||
}
|
||||
|
||||
class ImplBaseCase2() : Base() {
|
||||
override var a: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
override
|
||||
|
||||
<!VAR_OVERRIDDEN_BY_VAL!>val<!> b: Any
|
||||
get() = TODO()
|
||||
override var c: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
override
|
||||
|
||||
<!VAR_OVERRIDDEN_BY_VAL!>val<!> d: Any
|
||||
get() = TODO()
|
||||
|
||||
override fun foo() {}
|
||||
|
||||
override fun boo(): Any {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 3
|
||||
* NOTE: property is not implemented
|
||||
*/
|
||||
fun case3() {
|
||||
ImplBaseCase3()
|
||||
}
|
||||
|
||||
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class ImplBaseCase3<!>() : Base() {
|
||||
override var b: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
override val c: Any
|
||||
get() = TODO()
|
||||
override var d: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
|
||||
override fun foo() {
|
||||
TODO()
|
||||
}
|
||||
|
||||
override fun boo(): Any {
|
||||
TODO()
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 4
|
||||
* NOTE: function is not implemented
|
||||
*/
|
||||
|
||||
fun case4() {
|
||||
ImplBaseCase4()
|
||||
}
|
||||
|
||||
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class ImplBaseCase4<!>() : Base() {
|
||||
override var b: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
override val c: Any
|
||||
get() = TODO()
|
||||
override var d: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
|
||||
override fun foo() {}
|
||||
|
||||
override fun boo(): Any {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 5
|
||||
* NOTE: incompatible modifiers final and abstract
|
||||
*/
|
||||
<!INCOMPATIBLE_MODIFIERS!>final<!> <!INCOMPATIBLE_MODIFIERS!>abstract<!> class Case5() {}
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: Abstract classes may contain abstract members, which should be implemented in an anonymous class that inherits from that abstract type
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
private abstract class Base {
|
||||
|
||||
abstract val a: Any
|
||||
abstract var b: Any
|
||||
internal abstract val c: Any
|
||||
internal abstract var d: Any
|
||||
|
||||
|
||||
abstract fun foo()
|
||||
internal abstract fun boo(): Any
|
||||
}
|
||||
|
||||
|
||||
fun case1() {
|
||||
val impl = object : Base() {
|
||||
override var a: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
override <!VAR_OVERRIDDEN_BY_VAL!>val<!> b: Any
|
||||
get() = TODO()
|
||||
override var c: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
override <!VAR_OVERRIDDEN_BY_VAL!>val<!> d: Any
|
||||
get() = TODO()
|
||||
|
||||
override fun foo() {}
|
||||
|
||||
override fun boo(): Any {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 2
|
||||
* NOTE: property is not implemented
|
||||
*/
|
||||
fun case2() {
|
||||
val impl = <!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>object<!> : Base() {
|
||||
override var b: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
override val c: Any
|
||||
get() = TODO()
|
||||
override var d: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
|
||||
override fun foo() {
|
||||
TODO()
|
||||
}
|
||||
|
||||
override fun boo(): Any {
|
||||
TODO()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 3
|
||||
* NOTE: function is not implemented
|
||||
*/
|
||||
|
||||
fun case3() {
|
||||
val impl = <!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>object<!> : Base() {
|
||||
override var b: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
override val c: Any
|
||||
get() = TODO()
|
||||
override var d: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
|
||||
override fun foo() {}
|
||||
|
||||
override fun boo(): Any {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 3
|
||||
* DESCRIPTION: attempt to implement abstract members with invalid types
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
abstract class Base {
|
||||
abstract val a: CharSequence
|
||||
abstract var b: CharSequence
|
||||
|
||||
abstract fun foo(): CharSequence
|
||||
}
|
||||
|
||||
class Case1 : Base() {
|
||||
override fun foo(): <!RETURN_TYPE_MISMATCH_ON_OVERRIDE!>Any<!>
|
||||
{
|
||||
return ""
|
||||
}
|
||||
|
||||
override val a: <!PROPERTY_TYPE_MISMATCH_ON_OVERRIDE!>Any?<!>
|
||||
get() = TODO()
|
||||
override var b: <!VAR_TYPE_MISMATCH_ON_OVERRIDE!>String<!>
|
||||
get() = TODO()
|
||||
set(value)
|
||||
{}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 2
|
||||
*/
|
||||
|
||||
class Case2(override val a: String, override var b: <!VAR_TYPE_MISMATCH_ON_OVERRIDE!>String<!>) : Base() {
|
||||
override fun foo(): <!RETURN_TYPE_MISMATCH_ON_OVERRIDE!>CharSequence?<!> {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 3
|
||||
* NOTE: abstract nested class members are not implemented
|
||||
*/
|
||||
|
||||
class Case3 {
|
||||
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class ImplBase1<!> : MainClass.Base1() {}
|
||||
}
|
||||
|
||||
class MainClass {
|
||||
abstract class Base1() {
|
||||
abstract val a: CharSequence
|
||||
abstract var b: CharSequence
|
||||
|
||||
abstract fun foo(): CharSequence
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
// FULL_JDK
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 4
|
||||
* DESCRIPTION: Abstract classes may contain abstract members, which should be implemented in an inner class that inherits from that abstract type
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
class MainClass {
|
||||
abstract class Base1() {
|
||||
abstract val a: CharSequence
|
||||
abstract var b: CharSequence
|
||||
abstract fun foo(): CharSequence
|
||||
}
|
||||
|
||||
abstract class Base2 : Base1() {
|
||||
abstract fun boo(x: Int = 10)
|
||||
}
|
||||
|
||||
abstract class Base3(override val a: CharSequence) : Base1() {}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 1
|
||||
* NOTE: absctract class member is not implemented in inner class
|
||||
*/
|
||||
class Case1 {
|
||||
|
||||
abstract inner class ImplBase2() : MainClass.Base2() {
|
||||
override var b: CharSequence = ""
|
||||
override val a: CharSequence = ""
|
||||
override fun boo(x: Int) {}
|
||||
}
|
||||
|
||||
inner
|
||||
|
||||
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class ImplBase2_1<!> : ImplBase2() {
|
||||
override var b: CharSequence = ""
|
||||
override fun boo(x: Int) {}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 2
|
||||
* NOTE:absctract class member is not implemented in anonymos class
|
||||
*/
|
||||
class Case2() {
|
||||
abstract inner class Impl(override val a: CharSequence) : MainClass.Base3(a) {}
|
||||
|
||||
fun boo() {
|
||||
val impl = <!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>object<!> : Impl("a") {
|
||||
override fun foo(): CharSequence = "foo"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 3
|
||||
* NOTE: check abstract member cannot be accessed directly
|
||||
*/
|
||||
class Case3(override val <!REDECLARATION!>boo<!>: String) : BaseCase3() {
|
||||
override val zoo: String = super.<!ABSTRACT_SUPER_CALL!>foo<!>()
|
||||
override val <!REDECLARATION!>boo<!>: String = super.<!ABSTRACT_SUPER_CALL!>boo<!>
|
||||
override val value: String = super.<!ABSTRACT_SUPER_CALL!>zoo<!>
|
||||
val hoo: String = super.<!ABSTRACT_SUPER_CALL!>zoo<!>
|
||||
|
||||
override fun foo(): String {
|
||||
super.<!ABSTRACT_SUPER_CALL!>foo<!>()
|
||||
super.<!ABSTRACT_SUPER_CALL!>boo<!>
|
||||
super.value
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
abstract class BaseCase3{
|
||||
abstract fun foo(): String
|
||||
open val value: String get() = "value"
|
||||
abstract val boo: String
|
||||
abstract val zoo: String
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 4
|
||||
* NOTE: abstract class implements kotlin interface
|
||||
*/
|
||||
|
||||
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class Case4<!>(a: String) : BaseCase4(a) {}
|
||||
|
||||
interface InterfaceCase4 {
|
||||
fun foo(): String
|
||||
|
||||
fun boo() {
|
||||
foo()
|
||||
}
|
||||
}
|
||||
|
||||
abstract class BaseCase4(val a: String) : InterfaceCase4 {}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 5
|
||||
* NOTE: abstract class implements java interface
|
||||
*/
|
||||
|
||||
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class Case5<!>(a: String) : BaseCase5(a) {}
|
||||
|
||||
abstract class BaseCase5(val a: String) : java.util.Deque<String> {}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 6
|
||||
* NOTE: abstract class implements java abstract class
|
||||
*/
|
||||
|
||||
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class Case6<!>(a: String) : BaseCase6(a) {}
|
||||
|
||||
abstract class BaseCase6(val a: String) : java.util.AbstractCollection<String>() {}
|
||||
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
// !LANGUAGE: +NewInference +ProhibitInvisibleAbstractMethodsInSuperclasses
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
// FULL_JDK
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 5
|
||||
* DESCRIPTION: Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
|
||||
// FILE: base/BaseJava.java
|
||||
package base;
|
||||
|
||||
public abstract class BaseJava {
|
||||
|
||||
public BaseJavaCase1()
|
||||
{}
|
||||
|
||||
public BaseJavaCase1(Boolean b)
|
||||
{ foo(b); }
|
||||
|
||||
public void boo(Boolean b)
|
||||
{ foo(b); }
|
||||
|
||||
abstract void foo(Boolean b);
|
||||
}
|
||||
|
||||
// FILE: Impl.kt
|
||||
package implBase
|
||||
import base.*
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
|
||||
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER!>class Case1<!> : BaseJava() {}
|
||||
|
||||
fun case1() {
|
||||
val v = Case1()
|
||||
v.boo(true)
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 2
|
||||
*/
|
||||
abstract class AbstractClassCase2 : BaseJava() {}
|
||||
|
||||
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER!>class Case2<!> : AbstractClassCase2() {}
|
||||
|
||||
fun case2() {
|
||||
val v = Case2()
|
||||
v.boo(true)
|
||||
}
|
||||
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
// !LANGUAGE: +NewInference +ProhibitInvisibleAbstractMethodsInSuperclasses
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
// FULL_JDK
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 6
|
||||
* DESCRIPTION: Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
|
||||
// FILE: base/BaseJava.java
|
||||
package base;
|
||||
|
||||
public abstract class BaseJava {
|
||||
|
||||
public BaseJavaCase1()
|
||||
{}
|
||||
|
||||
public BaseJavaCase1(Boolean b)
|
||||
{ foo(b); }
|
||||
|
||||
public void boo(Boolean b)
|
||||
{ foo(b); }
|
||||
|
||||
abstract void foo(Boolean b);
|
||||
}
|
||||
|
||||
// FILE: Impl.kt
|
||||
package implBase
|
||||
import base.*
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
|
||||
class Case1 : BaseJava() {
|
||||
<!CANNOT_OVERRIDE_INVISIBLE_MEMBER!>override<!> fun foo(b: Boolean?) {}
|
||||
}
|
||||
|
||||
fun case1() {
|
||||
val v = Case1()
|
||||
v.boo(true)
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 2
|
||||
*/
|
||||
abstract class AbstractClassCase2 : BaseJava() {}
|
||||
|
||||
class Case2: AbstractClassCase2() {
|
||||
<!CANNOT_OVERRIDE_INVISIBLE_MEMBER!>override<!> fun foo(b: Boolean?) {}
|
||||
}
|
||||
|
||||
fun case2() {
|
||||
val v = Case2()
|
||||
v.boo(true)
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
|
||||
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER!>class Case3<!> : BaseJava() {}
|
||||
|
||||
fun case3() {
|
||||
val v = Case3()
|
||||
v.boo(true)
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 4
|
||||
*/
|
||||
abstract class AbstractClassCase4 : BaseJava() {}
|
||||
|
||||
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER!>class Case4<!> : AbstractClassCase4() {}
|
||||
|
||||
fun case4() {
|
||||
val v = Case4()
|
||||
v.boo(true)
|
||||
}
|
||||
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
// !LANGUAGE: +NewInference +ProhibitInvisibleAbstractMethodsInSuperclasses
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
// FULL_JDK
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 7
|
||||
* DESCRIPTION: Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
// MODULE: base
|
||||
// FILE: BaseKotlin.kt
|
||||
package base
|
||||
abstract class BaseKotlin() {
|
||||
|
||||
fun boo(b: Boolean?) {
|
||||
foo(b)
|
||||
}
|
||||
|
||||
internal abstract fun foo(b: Boolean?)
|
||||
}
|
||||
|
||||
|
||||
//MODULE: implBase(base)
|
||||
//FILE: Impl.kt
|
||||
|
||||
|
||||
package implBase
|
||||
import base.*
|
||||
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
|
||||
class Case1 : BaseKotlin() {
|
||||
<!CANNOT_OVERRIDE_INVISIBLE_MEMBER!>override<!> fun foo(b: Boolean?) {}
|
||||
}
|
||||
|
||||
fun case1() {
|
||||
val v = Case1()
|
||||
v.boo(true)
|
||||
|
||||
val o = object : BaseKotlin() {
|
||||
<!CANNOT_OVERRIDE_INVISIBLE_MEMBER!>override<!> fun foo(b: Boolean?) {}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 2
|
||||
*/
|
||||
abstract class AbstractClassCase2 : BaseKotlin() {}
|
||||
|
||||
class Case2: AbstractClassCase2() {
|
||||
<!CANNOT_OVERRIDE_INVISIBLE_MEMBER!>override<!> fun foo(b: Boolean?) {}
|
||||
}
|
||||
|
||||
fun case2() {
|
||||
val v = Case2()
|
||||
v.boo(true)
|
||||
|
||||
val o = object : AbstractClassCase2() {
|
||||
<!CANNOT_OVERRIDE_INVISIBLE_MEMBER!>override<!> fun foo(b: Boolean?) {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
|
||||
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER!>class Case3<!> : BaseKotlin() {}
|
||||
|
||||
fun case3() {
|
||||
val v = Case3()
|
||||
v.boo(true)
|
||||
|
||||
val o = <!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER!>object<!> : BaseKotlin() {}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 4
|
||||
*/
|
||||
abstract class AbstractClassCase4 : BaseKotlin() {}
|
||||
|
||||
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER!>class Case4<!> : AbstractClassCase4() {}
|
||||
|
||||
fun case4() {
|
||||
val v = Case4()
|
||||
v.boo(true)
|
||||
val o = <!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER!>object<!> : AbstractClassCase4() {}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
// !LANGUAGE: +NewInference +ProhibitInvisibleAbstractMethodsInSuperclasses
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
// FULL_JDK
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 2 -> sentence 1
|
||||
* RELEVANT PLACES: inheritance, overriding -> paragraph 7 -> sentence 1
|
||||
* NUMBER: 8
|
||||
* DESCRIPTION: Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
|
||||
|
||||
// MODULE: base
|
||||
// FILE: AbstractClassCase1.kt
|
||||
package base
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
abstract class AbstractClassCase1() {
|
||||
<!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>abstract<!> fun priv()
|
||||
protected abstract fun prot()
|
||||
internal abstract fun int()
|
||||
public abstract fun pub()
|
||||
|
||||
<!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>abstract<!> val priv1: String
|
||||
protected abstract val prot1: String
|
||||
internal abstract val int1: String
|
||||
public abstract val pub1: String
|
||||
}
|
||||
|
||||
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER!>class Case1<!> : AbstractClassCase1(){
|
||||
override fun prot() {}
|
||||
|
||||
override fun int() {
|
||||
prot()
|
||||
}
|
||||
|
||||
override fun pub() {}
|
||||
|
||||
override val prot1: String
|
||||
get() = ""
|
||||
override val int1: String
|
||||
get() = ""
|
||||
override val pub1: String
|
||||
get() = ""
|
||||
|
||||
}
|
||||
|
||||
fun case1(){
|
||||
val a = Case1()
|
||||
a.<!INVISIBLE_MEMBER!>priv<!>()
|
||||
a.<!INVISIBLE_MEMBER!>prot<!>()
|
||||
a.int()
|
||||
a.pub()
|
||||
|
||||
a.<!INVISIBLE_MEMBER!>priv1<!>
|
||||
a.<!INVISIBLE_MEMBER!>prot1<!>
|
||||
a.int1
|
||||
a.pub1
|
||||
}
|
||||
|
||||
//MODULE: implBase(base)
|
||||
//FILE: Impl.kt
|
||||
package implBase
|
||||
import base.*
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case2() {
|
||||
val a = Case1()
|
||||
a.<!INVISIBLE_MEMBER!>priv<!>()
|
||||
a.<!INVISIBLE_MEMBER!>prot<!>()
|
||||
a.<!INVISIBLE_MEMBER!>int<!>()
|
||||
a.pub()
|
||||
|
||||
a.<!INVISIBLE_MEMBER!>priv1<!>
|
||||
a.<!INVISIBLE_MEMBER!>prot1<!>
|
||||
a.<!INVISIBLE_MEMBER!>int1<!>
|
||||
a.pub1
|
||||
}
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
abstract class Base {
|
||||
abstract val a: Any
|
||||
abstract var b: Any
|
||||
internal abstract val c: Any
|
||||
internal abstract var d: Any
|
||||
|
||||
abstract fun foo()
|
||||
internal abstract fun boo()
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
|
||||
fun case1() {
|
||||
val base: Base = BaseImplCase1()
|
||||
val base1: BaseImplCase1 = BaseImplCase1()
|
||||
}
|
||||
|
||||
class BaseImplCase1() : Base() {
|
||||
override val a: Any
|
||||
get() = TODO()
|
||||
override var b: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
override val c: Any
|
||||
get() = TODO()
|
||||
override var d: Any
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
|
||||
override fun foo() {
|
||||
TODO()
|
||||
}
|
||||
|
||||
override fun boo() {
|
||||
TODO()
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
|
||||
fun case2() {
|
||||
val base0: Base = BaseImplCase2(1, "1", 1.2, mutableListOf({ 1 }, { 4 }, { throw Exception() }))
|
||||
val base1 = BaseImplCase2(1, "1", 1.2, mutableListOf({ 1 }, { 4 }, { throw Exception() }))
|
||||
val base: BaseImplCase2 = BaseImplCase2(1, "1", 1.2, mutableListOf({ 1 }, { 4 }, { throw Exception() }))
|
||||
|
||||
val a1: Any = base.a
|
||||
base.a = 123
|
||||
|
||||
val b1: Any = base.b
|
||||
base.b = 3
|
||||
|
||||
val c1 = base.c
|
||||
base.c = Exception ()
|
||||
|
||||
val d1 = base.d
|
||||
base.d = ""
|
||||
}
|
||||
|
||||
class BaseImplCase2(override var a: Any, override var b: Any, override var c: Any, override var d: Any = "5") : Base() {
|
||||
override fun foo() {}
|
||||
|
||||
override fun boo() {}
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-213
|
||||
* PLACE: declarations, classifier-declaration, class-declaration, abstract-classes -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class
|
||||
* HELPERS: checkType, functions
|
||||
* ISSUES: KT-27825
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
|
||||
fun case1(){
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("OtherClass.ImplBase2")!>OtherClass().zoooo()<!>
|
||||
checkSubtype<MainClass.Base2>(OtherClass().zoooo())
|
||||
}
|
||||
|
||||
class MainClass {
|
||||
abstract class Base1() {
|
||||
abstract val a: CharSequence
|
||||
abstract var b: CharSequence
|
||||
|
||||
abstract fun foo(): CharSequence
|
||||
}
|
||||
|
||||
abstract class Base2 : Base1() {
|
||||
abstract fun boo(x: Int = 10)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class OtherClass {
|
||||
|
||||
abstract inner class ImplBase2() : MainClass.Base2() {
|
||||
override var b: CharSequence
|
||||
get() = TODO()
|
||||
set(value) {}
|
||||
override val a: CharSequence = ""
|
||||
|
||||
override fun boo(x: Int) {
|
||||
TODO()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fun zoooo(): ImplBase2 {
|
||||
val k = object : ImplBase2() {
|
||||
override fun foo(): CharSequence = ""
|
||||
}
|
||||
return k
|
||||
}
|
||||
}
|
||||
+116
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"1": {
|
||||
"neg": {
|
||||
"2": [
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 1,
|
||||
"description": "check abstract classes cannot be instantiated directly",
|
||||
"unexpectedBehaviour": false
|
||||
}
|
||||
],
|
||||
"1": [
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 1,
|
||||
"description": "check abstract classes cannot be instantiated directly",
|
||||
"path": "compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-1/neg/2.1.kt",
|
||||
"unexpectedBehaviour": false
|
||||
},
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 1,
|
||||
"description": "check abstract classes can have abstract not implemented members",
|
||||
"unexpectedBehaviour": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"pos": {
|
||||
"1": [
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 1,
|
||||
"description": "check abstract classes can have abstract not implemented members",
|
||||
"unexpectedBehaviour": false
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"neg": {
|
||||
"1": [
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 1,
|
||||
"description": "check abstract classes can have abstract not implemented members",
|
||||
"path": "compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-1/neg/1.1.kt",
|
||||
"unexpectedBehaviour": false
|
||||
},
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 2,
|
||||
"description": "Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class",
|
||||
"unexpectedBehaviour": false
|
||||
},
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 1,
|
||||
"description": "Abstract classes may contain abstract members, which should be implemented in an anonymous class that inherits from that abstract type",
|
||||
"unexpectedBehaviour": false
|
||||
},
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 1,
|
||||
"description": "attempt to implement abstract members with invalid types",
|
||||
"unexpectedBehaviour": false
|
||||
},
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 2,
|
||||
"description": "Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class",
|
||||
"unexpectedBehaviour": false
|
||||
},
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 1,
|
||||
"description": "Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class",
|
||||
"unexpectedBehaviour": false
|
||||
},
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 1,
|
||||
"description": "Abstract classes may contain abstract members, which should be implemented in an inner class that inherits from that abstract type",
|
||||
"unexpectedBehaviour": false
|
||||
},
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 1,
|
||||
"description": "Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class",
|
||||
"unexpectedBehaviour": false
|
||||
},
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 2,
|
||||
"description": "Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class",
|
||||
"unexpectedBehaviour": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"pos": {
|
||||
"1": [
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 1,
|
||||
"description": "Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class",
|
||||
"unexpectedBehaviour": false
|
||||
},
|
||||
{
|
||||
"specVersion": "0.1-213",
|
||||
"casesNumber": 2,
|
||||
"description": "Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class",
|
||||
"unexpectedBehaviour": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user