[FIR] Introduce TYPE_ARGUMENTS_NOT_ALLOWED & some other type errors

This commit introduces several different things, in particular:
- check type arguments in expressions
- new TypeArgumentList node to deal with diagnostic source
- ConeDiagnostic was moved to fir:cones
- ConeIntermediateDiagnostic to use in inference (?) without reporting
- detailed diagnostics on error type
This commit is contained in:
Mikhail Glukhikh
2020-07-22 10:29:59 +03:00
parent c744dfba9c
commit 0804c6a0f3
196 changed files with 774 additions and 484 deletions
@@ -1,6 +1,6 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
class A<T : Nested, F: Inner, G: Interface> {
class A<T : <!OTHER_ERROR!>Nested<!>, F: <!OTHER_ERROR!>Inner<!>, G: <!OTHER_ERROR!>Interface<!>> {
class Nested
@@ -9,7 +9,7 @@ class A<T : Nested, F: Inner, G: Interface> {
interface Interface
}
class B<T, F, G> where T : Nested, F: Inner, G: Interface {
class B<T, F, G> where T : <!OTHER_ERROR!>Nested<!>, F: <!OTHER_ERROR!>Inner<!>, G: <!OTHER_ERROR!>Interface<!> {
class Nested
@@ -2,7 +2,7 @@
interface I<F, G, H>
class A(impl: Interface) : Nested(), Interface by impl, Inner, I<Nested, Interface, Inner> {
class A(impl: Interface) : <!OTHER_ERROR!>Nested<!>(), <!OTHER_ERROR!>Interface<!> by impl, <!OTHER_ERROR!>Inner<!>, <!OTHER_ERROR!>I<Nested, Interface, Inner><!> {
class Nested
@@ -3,7 +3,7 @@ interface I<F, G>
val aImpl: A.Interface
get() = null!!
object A : Nested(), Interface by aImpl, I<Nested, Interface> {
object A : <!OTHER_ERROR!>Nested<!>(), <!OTHER_ERROR!>Interface<!> by aImpl, <!OTHER_ERROR!>I<Nested, Interface><!> {
class Nested
@@ -9,19 +9,19 @@ interface B {
}
class X: A {
val a: A_ = <!UNRESOLVED_REFERENCE!>A_<!>()
val a: <!OTHER_ERROR, OTHER_ERROR!>A_<!> = <!UNRESOLVED_REFERENCE!>A_<!>()
val b: A.A_ = A.A_()
companion object {
val a: A_ = <!UNRESOLVED_REFERENCE!>A_<!>()
val a: <!OTHER_ERROR, OTHER_ERROR!>A_<!> = <!UNRESOLVED_REFERENCE!>A_<!>()
}
}
class Y: B {
val a: B_ = <!UNRESOLVED_REFERENCE!>B_<!>()
val a: <!OTHER_ERROR, OTHER_ERROR!>B_<!> = <!UNRESOLVED_REFERENCE!>B_<!>()
val b: B.B_ = B.B_()
companion object {
val b: B_ = <!UNRESOLVED_REFERENCE!>B_<!>()
val b: <!OTHER_ERROR, OTHER_ERROR!>B_<!> = <!UNRESOLVED_REFERENCE!>B_<!>()
}
}
@@ -7,14 +7,14 @@ open class A {
}
class C: A() {
val b: B = null!!
val b: <!OTHER_ERROR, OTHER_ERROR!>B<!> = null!!
init {
<!UNRESOLVED_REFERENCE!>B<!>()
}
object O {
val b: B = null!!
val b: <!OTHER_ERROR, OTHER_ERROR!>B<!> = null!!
init {
<!UNRESOLVED_REFERENCE!>B<!>()
@@ -22,7 +22,7 @@ class C: A() {
}
class K {
val b: B = null!!
val b: <!OTHER_ERROR, OTHER_ERROR!>B<!> = null!!
init {
<!UNRESOLVED_REFERENCE!>B<!>()
@@ -30,7 +30,7 @@ class C: A() {
}
inner class I {
val b: B = null!!
val b: <!OTHER_ERROR, OTHER_ERROR!>B<!> = null!!
init {
<!UNRESOLVED_REFERENCE!>B<!>()
@@ -23,7 +23,7 @@ public class C extends B implements A {
// FILE: 1.kt
class X: A {
val a_s: A_S = null!!
val a_s: <!OTHER_ERROR, OTHER_ERROR!>A_S<!> = null!!
init {
<!UNRESOLVED_REFERENCE!>A_S<!>()
@@ -32,7 +32,7 @@ class X: A {
}
object xD {
val a_: A_S = null!!
val a_: <!OTHER_ERROR, OTHER_ERROR!>A_S<!> = null!!
init {
<!UNRESOLVED_REFERENCE!>A_S<!>()
@@ -66,7 +66,7 @@ class Y: B() {
}
class Z: C() {
val a_s: A_S = null!!
val a_s: <!OTHER_ERROR, OTHER_ERROR!>A_S<!> = null!!
val b_: B_ = null!!
val b_s: B_S = null!!
@@ -77,7 +77,7 @@ class Z: C() {
}
object X {
val a_s: A_S = null!!
val a_s: <!OTHER_ERROR, OTHER_ERROR!>A_S<!> = null!!
val b_: B_ = null!!
val b_s: B_S = null!!
@@ -30,7 +30,7 @@ open class A<T> : J() {
foo()
bar()
val a: Int = baz()
val b: T = baz()
val b: <!OTHER_ERROR!>T<!> = baz()
}
}
@@ -39,14 +39,14 @@ open class A<T> : J() {
foo()
bar()
val a: Int = baz()
val b: T = baz()
val b: <!OTHER_ERROR!>T<!> = baz()
}
fun test() {
foo()
bar()
val a: Int = baz()
val b: T = baz()
val b: <!OTHER_ERROR!>T<!> = baz()
}
fun bar() {}
@@ -30,7 +30,7 @@ open class A<T> : J() {
foo()
bar()
val a: Int = baz()
val b: T = baz()
val b: <!OTHER_ERROR!>T<!> = baz()
}
}
@@ -39,14 +39,14 @@ open class A<T> : J() {
foo()
bar()
val a: Int = baz()
val b: T = baz()
val b: <!OTHER_ERROR!>T<!> = baz()
}
fun test() {
foo()
bar()
val a: Int = baz()
val b: T = baz()
val b: <!OTHER_ERROR!>T<!> = baz()
}
fun bar() {}
+1 -1
View File
@@ -10,7 +10,7 @@ import d
import d.Test
import b.d
class Some: Test()
class Some: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>Test<!>()
//FILE:b.kt
+1 -1
View File
@@ -4,7 +4,7 @@
package a
fun foo() {
val b : B = <!UNRESOLVED_REFERENCE!>B<!>() //only B() is unresolved, but in ": B" and "B.foo()" B should also be unresolved
val b : <!OTHER_ERROR!>B<!> = <!UNRESOLVED_REFERENCE!>B<!>() //only B() is unresolved, but in ": B" and "B.foo()" B should also be unresolved
<!UNRESOLVED_REFERENCE!>B<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
<!UNRESOLVED_REFERENCE!>P<!>.<!UNRESOLVED_REFERENCE!>foo<!>()