FIR: Adjust testData for spec tests: declarations
This commit is contained in:
+37
@@ -0,0 +1,37 @@
|
|||||||
|
// !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
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 1
|
||||||
|
|
||||||
|
abstract class Base() {
|
||||||
|
abstract fun foo() = {}
|
||||||
|
fun boo() : Unit
|
||||||
|
abstract val a = ""
|
||||||
|
val b
|
||||||
|
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()
|
||||||
|
}
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
// !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
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 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 = Base0()
|
||||||
|
val b1 = Base1()
|
||||||
|
val b2 = Base2(1, "1")
|
||||||
|
}
|
||||||
+128
@@ -0,0 +1,128 @@
|
|||||||
|
// !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
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 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
|
||||||
|
val b: Any, override var c: Any, override
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
val b: Any
|
||||||
|
get() = TODO()
|
||||||
|
override var c: Any
|
||||||
|
get() = TODO()
|
||||||
|
set(value) {}
|
||||||
|
override
|
||||||
|
|
||||||
|
val d: Any
|
||||||
|
get() = TODO()
|
||||||
|
|
||||||
|
override fun foo() {}
|
||||||
|
|
||||||
|
override fun boo(): Any {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TESTCASE NUMBER: 3
|
||||||
|
* NOTE: property is not implemented
|
||||||
|
*/
|
||||||
|
fun case3() {
|
||||||
|
ImplBaseCase3()
|
||||||
|
}
|
||||||
|
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
|
||||||
|
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() {}
|
||||||
+62
@@ -0,0 +1,62 @@
|
|||||||
|
// !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: 10
|
||||||
|
* 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
|
||||||
|
class Case1() : BaseCase1(), InterfaceCase1 {}
|
||||||
|
|
||||||
|
abstract class BaseCase1() {
|
||||||
|
abstract fun foo(): String
|
||||||
|
abstract val a: String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface InterfaceCase1 {
|
||||||
|
fun foo() = "foo"
|
||||||
|
val a: String
|
||||||
|
get() = "a"
|
||||||
|
}
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 2
|
||||||
|
class Case2Outer {
|
||||||
|
val v = "v"
|
||||||
|
|
||||||
|
abstract class Case2Base() {
|
||||||
|
abstract fun foo(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
inner
|
||||||
|
class A() : Case2Base() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 3
|
||||||
|
fun case3() {
|
||||||
|
object : CaseOuter.CaseBase() {}.outerFoo()
|
||||||
|
}
|
||||||
|
|
||||||
|
class B() : CaseOuter.CaseBase() {}
|
||||||
|
|
||||||
|
sealed class CaseOuter {
|
||||||
|
val v = "v"
|
||||||
|
abstract fun outerFoo();
|
||||||
|
|
||||||
|
abstract class CaseBase() : CaseOuter() {
|
||||||
|
abstract fun foo(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
class A() : CaseBase() {
|
||||||
|
}
|
||||||
|
}
|
||||||
+99
@@ -0,0 +1,99 @@
|
|||||||
|
// !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
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 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 val b: Any
|
||||||
|
get() = TODO()
|
||||||
|
override var c: Any
|
||||||
|
get() = TODO()
|
||||||
|
set(value) {}
|
||||||
|
override 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 = 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 = 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+64
@@ -0,0 +1,64 @@
|
|||||||
|
// !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
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 1
|
||||||
|
abstract class Base {
|
||||||
|
abstract val a: CharSequence
|
||||||
|
abstract var b: CharSequence
|
||||||
|
|
||||||
|
abstract fun foo(): CharSequence
|
||||||
|
}
|
||||||
|
|
||||||
|
class Case1 : Base() {
|
||||||
|
override fun foo(): Any
|
||||||
|
{
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
override val a: Any?
|
||||||
|
get() = TODO()
|
||||||
|
override var b: String
|
||||||
|
get() = TODO()
|
||||||
|
set(value)
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TESTCASE NUMBER: 2
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Case2(override val a: String, override var b: String) : Base() {
|
||||||
|
override fun foo(): CharSequence? {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TESTCASE NUMBER: 3
|
||||||
|
* NOTE: abstract nested class members are not implemented
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Case3 {
|
||||||
|
class ImplBase1 : MainClass.Base1() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
class MainClass {
|
||||||
|
abstract class Base1() {
|
||||||
|
abstract val a: CharSequence
|
||||||
|
abstract var b: CharSequence
|
||||||
|
|
||||||
|
abstract fun foo(): CharSequence
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+120
@@ -0,0 +1,120 @@
|
|||||||
|
// !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
|
||||||
|
*/
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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 = object : Impl("a") {
|
||||||
|
override fun foo(): CharSequence = "foo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TESTCASE NUMBER: 3
|
||||||
|
* NOTE: check abstract member cannot be accessed directly
|
||||||
|
*/
|
||||||
|
class Case3(override val boo: String) : BaseCase3() {
|
||||||
|
override val zoo: String = super.foo()
|
||||||
|
override val boo: String = super.boo
|
||||||
|
override val value: String = super.zoo
|
||||||
|
val hoo: String = super.zoo
|
||||||
|
|
||||||
|
override fun foo(): String {
|
||||||
|
super.foo()
|
||||||
|
super.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
|
||||||
|
*/
|
||||||
|
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Case6(a: String) : BaseCase6(a) {}
|
||||||
|
|
||||||
|
abstract class BaseCase6(val a: String) : java.util.AbstractCollection<String>() {}
|
||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
// !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
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// 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() {}
|
||||||
|
|
||||||
|
fun case1() {
|
||||||
|
val v = Case1()
|
||||||
|
v.boo(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TESTCASE NUMBER: 2
|
||||||
|
*/
|
||||||
|
abstract class AbstractClassCase2 : BaseJava() {}
|
||||||
|
|
||||||
|
class Case2 : AbstractClassCase2() {}
|
||||||
|
|
||||||
|
fun case2() {
|
||||||
|
val v = Case2()
|
||||||
|
v.boo(true)
|
||||||
|
}
|
||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
// !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() {
|
||||||
|
override fun foo(b: Boolean?) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun case1() {
|
||||||
|
val v = Case1()
|
||||||
|
v.boo(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TESTCASE NUMBER: 2
|
||||||
|
*/
|
||||||
|
abstract class AbstractClassCase2 : BaseJava() {}
|
||||||
|
|
||||||
|
class Case2: AbstractClassCase2() {
|
||||||
|
override fun foo(b: Boolean?) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun case2() {
|
||||||
|
val v = Case2()
|
||||||
|
v.boo(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 3
|
||||||
|
|
||||||
|
class Case3 : BaseJava() {}
|
||||||
|
|
||||||
|
fun case3() {
|
||||||
|
val v = Case3()
|
||||||
|
v.boo(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TESTCASE NUMBER: 4
|
||||||
|
*/
|
||||||
|
abstract class AbstractClassCase4 : BaseJava() {}
|
||||||
|
|
||||||
|
class Case4 : AbstractClassCase4() {}
|
||||||
|
|
||||||
|
fun case4() {
|
||||||
|
val v = Case4()
|
||||||
|
v.boo(true)
|
||||||
|
}
|
||||||
+93
@@ -0,0 +1,93 @@
|
|||||||
|
// !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() {
|
||||||
|
override fun foo(b: Boolean?) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun case1() {
|
||||||
|
val v = Case1()
|
||||||
|
v.boo(true)
|
||||||
|
|
||||||
|
val o = object : BaseKotlin() {
|
||||||
|
override fun foo(b: Boolean?) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TESTCASE NUMBER: 2
|
||||||
|
*/
|
||||||
|
abstract class AbstractClassCase2 : BaseKotlin() {}
|
||||||
|
|
||||||
|
class Case2: AbstractClassCase2() {
|
||||||
|
override fun foo(b: Boolean?) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun case2() {
|
||||||
|
val v = Case2()
|
||||||
|
v.boo(true)
|
||||||
|
|
||||||
|
val o = object : AbstractClassCase2() {
|
||||||
|
override fun foo(b: Boolean?) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 3
|
||||||
|
|
||||||
|
class Case3 : BaseKotlin() {}
|
||||||
|
|
||||||
|
fun case3() {
|
||||||
|
val v = Case3()
|
||||||
|
v.boo(true)
|
||||||
|
|
||||||
|
val o = object : BaseKotlin() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TESTCASE NUMBER: 4
|
||||||
|
*/
|
||||||
|
abstract class AbstractClassCase4 : BaseKotlin() {}
|
||||||
|
|
||||||
|
class Case4 : AbstractClassCase4() {}
|
||||||
|
|
||||||
|
fun case4() {
|
||||||
|
val v = Case4()
|
||||||
|
v.boo(true)
|
||||||
|
val o = 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
|
||||||
|
}
|
||||||
|
|
||||||
|
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.<!INAPPLICABLE_CANDIDATE!>priv<!>()
|
||||||
|
a.prot()
|
||||||
|
a.int()
|
||||||
|
a.pub()
|
||||||
|
|
||||||
|
a.<!INAPPLICABLE_CANDIDATE!>priv1<!>
|
||||||
|
a.prot1
|
||||||
|
a.int1
|
||||||
|
a.pub1
|
||||||
|
}
|
||||||
|
|
||||||
|
//MODULE: implBase(base)
|
||||||
|
//FILE: Impl.kt
|
||||||
|
package implBase
|
||||||
|
import base.*
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 2
|
||||||
|
fun case2() {
|
||||||
|
val a = Case1()
|
||||||
|
a.<!INAPPLICABLE_CANDIDATE!>priv<!>()
|
||||||
|
a.prot()
|
||||||
|
a.int()
|
||||||
|
a.pub()
|
||||||
|
|
||||||
|
a.<!INAPPLICABLE_CANDIDATE!>priv1<!>
|
||||||
|
a.prot1
|
||||||
|
a.int1
|
||||||
|
a.pub1
|
||||||
|
}
|
||||||
+76
@@ -0,0 +1,76 @@
|
|||||||
|
// !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: 9
|
||||||
|
* DESCRIPTION: Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class
|
||||||
|
* ISSUES: KT-27825, KT-35325
|
||||||
|
*/
|
||||||
|
|
||||||
|
// MODULE: libModule
|
||||||
|
// FILE: libModule/BaseJava1.java
|
||||||
|
package libModule;
|
||||||
|
|
||||||
|
public abstract class BaseJava1 {
|
||||||
|
/*package-private*/ abstract void boojava();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// FILE: BaseKotlin1.kt
|
||||||
|
package libModule
|
||||||
|
|
||||||
|
public abstract class BaseKotlin1 {
|
||||||
|
internal abstract fun bookotlin()
|
||||||
|
}
|
||||||
|
|
||||||
|
// MODULE: mainModule(libModule)
|
||||||
|
// FILE: JavaClassWithAbstractKotlinClass.java
|
||||||
|
package mainModule
|
||||||
|
import libModule.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TESTCASE NUMBER: 1
|
||||||
|
* UNEXPECTED BEHAVIOUR
|
||||||
|
* ISSUES: KT-35325
|
||||||
|
*/
|
||||||
|
public class JavaClassWithAbstractKotlinClass {
|
||||||
|
|
||||||
|
public void zoo()
|
||||||
|
{
|
||||||
|
//todo: INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER should be expected
|
||||||
|
BaseKotlin1 baseKotlin = new BaseKotlin1() {};
|
||||||
|
|
||||||
|
BaseKotlin1 baseKotlin = new BaseKotlinImpl();
|
||||||
|
baseKotlin.bookotlin$libModule(); //highlight Error: usage of Kotlin internal declaration from different module
|
||||||
|
|
||||||
|
BaseKotlinImpl baseKotlinImpl = new BaseKotlinImpl();
|
||||||
|
baseKotlinImpl.bookotlin$libModule(); //there is no any Error, but should be
|
||||||
|
}
|
||||||
|
|
||||||
|
class BaseKotlinImpl extends BaseKotlin1 {
|
||||||
|
@Override
|
||||||
|
public void bookotlin$libModule() {
|
||||||
|
System.out.println("wefrgth");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: KotlinClassWithAbstractJavaClass.kt
|
||||||
|
package mainModule
|
||||||
|
import libModule.*
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 2
|
||||||
|
class KotlinClassWithAbstractJavaClass() {
|
||||||
|
fun foo() {
|
||||||
|
val baseJava1 = object : BaseJava1() {}
|
||||||
|
val baseKotlin = object : BaseKotlin1() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
+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(){
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
+124
@@ -0,0 +1,124 @@
|
|||||||
|
// !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: 3
|
||||||
|
* DESCRIPTION: Abstract classes may contain one or more abstract members, which should be implemented in a subtype of this abstract class
|
||||||
|
* HELPERS: checkType, functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 1
|
||||||
|
// NOTE: attempt to implement inner abstract class as anonymous class
|
||||||
|
open class MainCase1() {
|
||||||
|
private val priv = "privet"
|
||||||
|
|
||||||
|
val implVal = object : MainCase1.InnerAbstractBase() {
|
||||||
|
override fun foo(s: String) {
|
||||||
|
println("object {$s}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract inner class InnerAbstractBase() {
|
||||||
|
protected abstract fun foo(s: String)
|
||||||
|
fun boo() {
|
||||||
|
foo(priv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun case1() {
|
||||||
|
val main = MainCase1()
|
||||||
|
main.implVal.boo()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 2
|
||||||
|
//NOTE: attempt to implement inner abstract class in init block
|
||||||
|
fun case2() {
|
||||||
|
val main = MainCase2()
|
||||||
|
main.impl.boo()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
open class MainCase2() {
|
||||||
|
private val priv = "privet"
|
||||||
|
|
||||||
|
abstract inner class InnerAbstractBase() {
|
||||||
|
protected abstract fun foo(s: String)
|
||||||
|
fun boo() {
|
||||||
|
foo(priv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var impl: InnerAbstractBase
|
||||||
|
|
||||||
|
init {
|
||||||
|
impl = object : MainCase2.InnerAbstractBase() {
|
||||||
|
override fun foo(s: String) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//TESTCASE NUMBER: 3
|
||||||
|
// NOTE: attempt to inherit inner abstract class as another inner class
|
||||||
|
fun case3() {
|
||||||
|
val main = MainCase3()
|
||||||
|
main.ImplInnerAbstractBase().boo()
|
||||||
|
}
|
||||||
|
|
||||||
|
open class MainCase3() {
|
||||||
|
private val priv = "privet"
|
||||||
|
|
||||||
|
abstract inner class InnerAbstractBase() {
|
||||||
|
protected abstract fun foo(s: String)
|
||||||
|
fun boo() {
|
||||||
|
foo(priv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class ImplInnerAbstractBase : MainCase3.InnerAbstractBase() {
|
||||||
|
override fun foo(s: String) {
|
||||||
|
println("ImplInnerAbstractBase {$s}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// TESTCASE NUMBER: 4
|
||||||
|
// NOTE: attempt to inherit inner abstract class in a outer class function
|
||||||
|
fun case4() {
|
||||||
|
val main = MainCase4()
|
||||||
|
main.zoo().boo()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
open class MainCase4() {
|
||||||
|
private val priv = "privet"
|
||||||
|
|
||||||
|
abstract inner class InnerAbstractBase() {
|
||||||
|
protected abstract fun foo(s: String)
|
||||||
|
fun boo() {
|
||||||
|
foo(priv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun zoo(): MainCase4.InnerAbstractBase {
|
||||||
|
class ImplInnerAbstractBaseZoo : MainCase4.InnerAbstractBase() {
|
||||||
|
override fun foo(s: String) {
|
||||||
|
println("zoo fun: {$s}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ImplInnerAbstractBaseZoo()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user