Java 8 rules for method overrides:
- report errors on implementing methods of Any in interfaces - update testData ~~~ Java 8 override restrictions: interface can't implement a method of 'Any' - update compiler sources
This commit is contained in:
+7
-4
@@ -1,12 +1,15 @@
|
||||
interface Trait {
|
||||
fun foo() = "O"
|
||||
override fun toString() = "K"
|
||||
fun bar(): String
|
||||
}
|
||||
|
||||
class SimpleClass : Trait
|
||||
class SimpleClass : Trait {
|
||||
override fun bar() = "K"
|
||||
}
|
||||
|
||||
// Delegating 'toString' doesn't work, see KT-9519
|
||||
class ComplexClass : Trait by SimpleClass() {
|
||||
override fun toString() = foo() + super.toString()
|
||||
fun qux() = foo() + bar()
|
||||
}
|
||||
|
||||
fun box() = ComplexClass().toString()
|
||||
fun box() = ComplexClass().qux()
|
||||
|
||||
@@ -8,10 +8,6 @@ interface IWithToString {
|
||||
override fun toString(): String
|
||||
}
|
||||
|
||||
interface IWithDefaultToString {
|
||||
override fun toString(): String = "I"
|
||||
}
|
||||
|
||||
class C1 : ClassWithToString(), ISomething {
|
||||
override fun toString(): String = super.toString()
|
||||
}
|
||||
@@ -20,15 +16,10 @@ class C2 : ClassWithToString(), IWithToString, ISomething {
|
||||
override fun toString(): String = super.toString()
|
||||
}
|
||||
|
||||
class C3 : IWithDefaultToString, ISomething {
|
||||
override fun toString(): String = super.toString()
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
return when {
|
||||
C1().toString() != "C" -> "Failed #1"
|
||||
C2().toString() != "C" -> "Failed #2"
|
||||
C3().toString() != "I" -> "Failed #3"
|
||||
else -> "OK"
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
interface A {
|
||||
override fun toString(): String {
|
||||
return "OK"
|
||||
}
|
||||
}
|
||||
|
||||
interface B : A
|
||||
|
||||
class C : B {
|
||||
override fun toString(): String {
|
||||
return super.toString()
|
||||
}
|
||||
}
|
||||
|
||||
fun box() = "${C()}"
|
||||
@@ -3,8 +3,8 @@ package builders
|
||||
import java.util.ArrayList
|
||||
import java.util.HashMap
|
||||
|
||||
interface Element {
|
||||
fun render(builder: StringBuilder, indent: String)
|
||||
abstract class Element {
|
||||
abstract fun render(builder: StringBuilder, indent: String)
|
||||
|
||||
override fun toString(): String {
|
||||
val builder = StringBuilder()
|
||||
@@ -13,13 +13,13 @@ interface Element {
|
||||
}
|
||||
}
|
||||
|
||||
class TextElement(val text: String) : Element {
|
||||
class TextElement(val text: String) : Element() {
|
||||
override fun render(builder: StringBuilder, indent: String) {
|
||||
builder.append("$indent$text\n")
|
||||
}
|
||||
}
|
||||
|
||||
abstract class Tag(val name: String) : Element {
|
||||
abstract class Tag(val name: String) : Element() {
|
||||
val children = ArrayList<Element>()
|
||||
val attributes = HashMap<String, String>()
|
||||
|
||||
|
||||
+4
-4
@@ -3,8 +3,8 @@ package builders
|
||||
import java.util.ArrayList
|
||||
import java.util.HashMap
|
||||
|
||||
interface Element {
|
||||
fun render(builder: StringBuilder, indent: String)
|
||||
abstract class Element {
|
||||
abstract fun render(builder: StringBuilder, indent: String)
|
||||
|
||||
override fun toString(): String {
|
||||
val builder = StringBuilder()
|
||||
@@ -13,13 +13,13 @@ interface Element {
|
||||
}
|
||||
}
|
||||
|
||||
class TextElement(val text: String) : Element {
|
||||
class TextElement(val text: String) : Element() {
|
||||
override fun render(builder: StringBuilder, indent: String) {
|
||||
builder.append("$indent$text\n")
|
||||
}
|
||||
}
|
||||
|
||||
abstract class Tag(val name: String) : Element {
|
||||
abstract class Tag(val name: String) : Element() {
|
||||
val children = ArrayList<Element>()
|
||||
val attributes = HashMap<String, String>()
|
||||
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
interface SuperTrait {
|
||||
abstract class SuperTrait {
|
||||
override fun toString(): String = "!"
|
||||
}
|
||||
|
||||
data class A(val x: Int): SuperTrait {
|
||||
data class A(val x: Int): SuperTrait() {
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
|
||||
+4
-4
@@ -49,8 +49,8 @@ fun main(args : Array<String>) {
|
||||
println(result)
|
||||
}
|
||||
|
||||
interface Element {
|
||||
fun render(builder : StringBuilder, indent : String)
|
||||
abstract class Element {
|
||||
abstract fun render(builder : StringBuilder, indent : String)
|
||||
|
||||
override fun toString() : String {
|
||||
val builder = StringBuilder()
|
||||
@@ -59,13 +59,13 @@ interface Element {
|
||||
}
|
||||
}
|
||||
|
||||
class TextElement(val text : String) : Element {
|
||||
class TextElement(val text : String) : Element() {
|
||||
override fun render(builder : StringBuilder, indent : String) {
|
||||
builder.append("$indent$text\n")
|
||||
}
|
||||
}
|
||||
|
||||
abstract class Tag(val name : String) : Element {
|
||||
abstract class Tag(val name : String) : Element() {
|
||||
val children = ArrayList<Element>()
|
||||
val attributes = HashMap<String, String>()
|
||||
|
||||
|
||||
+2
-1
@@ -84,7 +84,8 @@ package html {
|
||||
public final override /*1*/ /*fake_override*/ fun kotlin.String.plus(): kotlin.Unit
|
||||
}
|
||||
|
||||
public interface Element {
|
||||
public abstract class Element {
|
||||
public constructor Element()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public abstract fun render(/*0*/ builder: java.lang.StringBuilder, /*1*/ indent: kotlin.String): kotlin.Unit
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
interface IA {
|
||||
<!VIRTUAL_MEMBER_HIDDEN!>fun toString(): String<!> = "IB"
|
||||
|
||||
override fun equals(other: Any?): Boolean
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package
|
||||
|
||||
public interface IA {
|
||||
public abstract override /*1*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
interface IA {
|
||||
<!METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE!>override fun toString(): String = "IA"<!>
|
||||
|
||||
<!METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE!>override fun equals(other: Any?): Boolean = <!SUPERCLASS_NOT_ACCESSIBLE_FROM_TRAIT!>super<!>.equals(other)<!>
|
||||
|
||||
<!METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE!>override fun hashCode(): Int {
|
||||
return 42;
|
||||
}<!>
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package
|
||||
|
||||
public interface IA {
|
||||
public open override /*1*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
interface IC {
|
||||
fun toString(x: String): String = "IC$x"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package
|
||||
|
||||
public interface IC {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
public open fun toString(/*0*/ x: kotlin.String): kotlin.String
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
interface IA
|
||||
|
||||
interface IB : IA {
|
||||
<!METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE!>override fun toString(): String = "IB"<!>
|
||||
}
|
||||
|
||||
interface IC : IB {
|
||||
<!METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE!>override fun toString(): String = "IC"<!>
|
||||
}
|
||||
|
||||
interface ID : IC {
|
||||
<!METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE!>override fun toString(): String = "ID"<!>
|
||||
}
|
||||
+14
-9
@@ -1,19 +1,24 @@
|
||||
package
|
||||
|
||||
public interface A {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface B : A {
|
||||
public interface IA {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class C : B {
|
||||
public constructor C()
|
||||
public interface IB : IA {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface IC : IB {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface ID : IC {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun toString(): kotlin.String
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
interface ILeft {
|
||||
override fun toString(): String
|
||||
}
|
||||
|
||||
interface IRight {
|
||||
override fun toString(): String
|
||||
}
|
||||
|
||||
interface IDiamond : ILeft, IRight {
|
||||
<!METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE!>override fun toString(): String = "IDiamond"<!>
|
||||
}
|
||||
+5
-6
@@ -1,20 +1,19 @@
|
||||
package
|
||||
|
||||
public final class C : IA, IB {
|
||||
public constructor C()
|
||||
public interface IDiamond : ILeft, IRight {
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface IA {
|
||||
public interface ILeft {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun toString(): kotlin.String
|
||||
public abstract override /*1*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface IB {
|
||||
public interface IRight {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun toString(): kotlin.String
|
||||
public abstract override /*1*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
-12
@@ -1,12 +0,0 @@
|
||||
interface IA {
|
||||
override fun toString(): String = "IA"
|
||||
}
|
||||
|
||||
interface IB {
|
||||
override fun toString(): String = "IB"
|
||||
}
|
||||
|
||||
class C : IA, IB {
|
||||
override fun toString(): String =
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>toString<!>()
|
||||
}
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
interface A {
|
||||
override fun toString(): String {
|
||||
return "OK"
|
||||
}
|
||||
}
|
||||
|
||||
interface B : A
|
||||
|
||||
class C : B {
|
||||
override fun toString(): String =
|
||||
super.toString()
|
||||
}
|
||||
+1
-9
@@ -5,12 +5,4 @@ interface IWithToString {
|
||||
class A : IWithToString {
|
||||
// Should be Any#toString(), even though IWithToString defines an abstract toString.
|
||||
override fun toString(): String = super.toString()
|
||||
}
|
||||
|
||||
interface IWithImplementedToString {
|
||||
override fun toString(): String = "Heh"
|
||||
}
|
||||
|
||||
class B : IWithImplementedToString {
|
||||
override fun toString(): String = super.toString()
|
||||
}
|
||||
}
|
||||
-13
@@ -7,19 +7,6 @@ public final class A : IWithToString {
|
||||
public open override /*1*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class B : IWithImplementedToString {
|
||||
public constructor B()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface IWithImplementedToString {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface IWithToString {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
|
||||
Reference in New Issue
Block a user