FIR: introduce delegate diagnostics

This commit adds diagnostics for the following

* DELEGATE_SPECIAL_FUNCTION_MISSING
* DELEGATE_SPECIAL_FUNCTION_AMBIGUITY
* DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE
This commit is contained in:
Tianyu Geng
2021-04-07 03:51:49 +03:00
committed by Mikhail Glukhikh
parent 454ae3b17a
commit b5caa658d6
56 changed files with 299 additions and 258 deletions
@@ -1,17 +0,0 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.reflect.KProperty
class A
class D {
val c: Int by <!UNRESOLVED_REFERENCE!>IncorrectThis<!><A>()
}
val cTopLevel: Int by <!UNRESOLVED_REFERENCE!>IncorrectThis<!><A>()
class IncorrectThis<T> {
fun <R> get(t: Any?, p: KProperty<*>): Int {
return 1
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.reflect.KProperty
@@ -12,8 +12,8 @@ class A(outer: Outer) {
var b: String by foo(getMyProperty())
var r: String by foo(outer.getContainer().getMyProperty())
var e: String by + foo(getMyProperty())
var f: String by foo(getMyProperty()) - 1
var e: String by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!>+ foo(getMyProperty())<!>
var f: String by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!>foo(getMyProperty()) - 1<!>
}
fun <A, B> foo(a: Any?) = MyProperty<A, B>()
@@ -4,10 +4,10 @@ package foo
import kotlin.reflect.KProperty
open class A {
val B.w: Int by <!ARGUMENT_TYPE_MISMATCH!>MyProperty()<!>
val B.w: Int by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!>MyProperty()<!>
}
val B.r: Int by <!ARGUMENT_TYPE_MISMATCH!>MyProperty()<!>
val B.r: Int by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!>MyProperty()<!>
val A.e: Int by MyProperty()
@@ -25,4 +25,4 @@ class C<R>() {
}
var c1: Int by C()
var c2: Int by C<Number>()
var c2: Int by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!>C<Number>()<!>
@@ -5,7 +5,7 @@ package test
import first.*
import second.*
val a12 by <!OVERLOAD_RESOLUTION_AMBIGUITY!>A<!>()
val a12 by <!DELEGATE_SPECIAL_FUNCTION_AMBIGUITY!>A()<!>
// FILE: first.kt
package first
@@ -4,8 +4,8 @@ package foo
import kotlin.reflect.KProperty
class A {
var a5: String by MyProperty1()
var b5: String by getMyProperty1()
var a5: String by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!>MyProperty1()<!>
var b5: String by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!>getMyProperty1()<!>
}
fun <A, B> getMyProperty1() = MyProperty1<A, B>()
@@ -24,8 +24,8 @@ class MyProperty1<T, R> {
// -----------------
class B {
var a5: String by MyProperty2()
var b5: String by getMyProperty2()
var a5: String by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!>MyProperty2()<!>
var b5: String by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!>getMyProperty2()<!>
}
fun <A, B> getMyProperty2() = MyProperty2<A, B>()
@@ -1,11 +0,0 @@
//KT-4640 "Trace is erased after resolution completion" exception
class ValueWrapper()
{
var backingValue: Int = 0
fun getValue() = backingValue
fun setValue(v: Int) { backingValue = v }
}
val foo by <!TOO_MANY_ARGUMENTS, TOO_MANY_ARGUMENTS!>ValueWrapper()<!>
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
//KT-4640 "Trace is erased after resolution completion" exception
class ValueWrapper()
@@ -1,3 +1,3 @@
val a: Int by <!UNRESOLVED_REFERENCE!>A<!>()
val a: Int by <!DELEGATE_SPECIAL_FUNCTION_MISSING!>A()<!>
class A
@@ -2,7 +2,7 @@
import kotlin.reflect.KProperty
var a: Int by A()
var a: Int by <!DELEGATE_SPECIAL_FUNCTION_MISSING!>A()<!>
class A {
operator fun getValue(t: Any?, p: KProperty<*>): Int {
@@ -1,9 +0,0 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
object T1 {
operator fun Int.provideDelegate(host: T1, p: Any): Long = 2
operator fun Long.getValue(receiver: String, p: Any): Double = 1.0
val String.test1 by 1
val test2 by <!ARGUMENT_TYPE_MISMATCH!>1<!>
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
object T1 {
@@ -10,5 +10,5 @@ object T2 {
operator fun <T> Foo<T>.getValue(receiver: String, p: Any?): T = TODO()
val String.test1: String by delegate()
val test2: String by <!ARGUMENT_TYPE_MISMATCH!>delegate()<!>
val test2: String by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!>delegate()<!>
}
@@ -13,7 +13,7 @@ fun wrong(arg: Wrong) {}
class Wrong
class Right {
val prop: () -> Unit by <!ARGUMENT_TYPE_MISMATCH, ARGUMENT_TYPE_MISMATCH!>::wrong<!>
val prop: () -> Unit by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!>::wrong<!>
}
fun box(): String {
@@ -4,12 +4,12 @@
import kotlin.reflect.KProperty
val a by <!UNRESOLVED_REFERENCE!>a<!>
val a by <!RECURSION_IN_IMPLICIT_TYPES!>a<!>
val b by Delegate(b)
val c by <!UNRESOLVED_REFERENCE!>d<!>
val d by <!UNRESOLVED_REFERENCE!>c<!>
val c by d
val d by <!RECURSION_IN_IMPLICIT_TYPES!>c<!>
class Delegate(i: Int) {
operator fun getValue(t: Any?, p: KProperty<*>): Int {
@@ -1,19 +0,0 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !WITH_NEW_INFERENCE
import kotlin.reflect.KProperty
class D {
var c: Int by Delegate()
}
var cTopLevel: Int by Delegate()
class A
class Delegate {
operator fun getValue(t: Any?, p: KProperty<*>): Int {
return 1
}
operator fun setValue(t: A, p: KProperty<*>, i: Int) {}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !WITH_NEW_INFERENCE
@@ -1,18 +0,0 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !WITH_NEW_INFERENCE
import kotlin.reflect.KProperty
class A {
var a: Int by <!ARGUMENT_TYPE_MISMATCH!>Delegate()<!>
}
var aTopLevel: Int by Delegate()
class Delegate {
operator fun getValue(t: Nothing?, p: KProperty<*>): Int {
return 1
}
operator fun setValue(t: Nothing?, p: KProperty<*>, a: Int) {
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !WITH_NEW_INFERENCE
@@ -1,18 +0,0 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !WITH_NEW_INFERENCE
import kotlin.reflect.KProperty
class A {
var a: Int by <!ARGUMENT_TYPE_MISMATCH!>Delegate()<!>
}
var aTopLevel: Int by <!ARGUMENT_TYPE_MISMATCH!>Delegate()<!>
class Delegate {
fun getValue(t: Nothing, p: KProperty<*>): Int {
return 1
}
fun setValue(t: Nothing, p: KProperty<*>, a: Int) {
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !WITH_NEW_INFERENCE
@@ -1,17 +0,0 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.reflect.KProperty
class A {
val c: Int by <!NONE_APPLICABLE!>Delegate<!>()
}
class Delegate {
fun getValue(t: Int, p: KProperty<*>): Int {
return 1
}
fun getValue(t: String, p: KProperty<*>): Int {
return 1
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.reflect.KProperty
@@ -1,23 +0,0 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.reflect.KProperty
class A
class B {
val b: Int by <!ARGUMENT_TYPE_MISMATCH!>Delegate<A>()<!>
}
val bTopLevel: Int by <!ARGUMENT_TYPE_MISMATCH!>Delegate<A>()<!>
class C {
val c: Int by Delegate<C>()
}
val cTopLevel: Int by Delegate<Nothing?>()
class Delegate<T> {
operator fun getValue(t: T, p: KProperty<*>): Int {
return 1
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.reflect.KProperty
@@ -1,17 +0,0 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !WITH_NEW_INFERENCE
import kotlin.reflect.KProperty
class A {
var a: Int by Delegate()
}
var aTopLevel: Int by Delegate()
class Delegate {
operator fun getValue(t: Any?, p: KProperty<*>): Int {
return 1
}
operator fun setValue(t: Any?, p: KProperty<*>, i: String) {}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !WITH_NEW_INFERENCE
@@ -1,18 +0,0 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !WITH_NEW_INFERENCE
import kotlin.reflect.KProperty
class B {
val b: Int by <!ARGUMENT_TYPE_MISMATCH!>Delegate()<!>
}
val bTopLevel: Int by <!ARGUMENT_TYPE_MISMATCH!>Delegate()<!>
class A
class Delegate {
fun getValue(t: A, p: KProperty<*>): Int {
return 1
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !WITH_NEW_INFERENCE
@@ -1,15 +0,0 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.reflect.KProperty
class A {
val a: Int by Delegate(<!NO_VALUE_FOR_PARAMETER!>)<!>
}
val aTopLevel: Int by Delegate(<!NO_VALUE_FOR_PARAMETER!>)<!>
class Delegate {
fun getValue(t: Any?, p: KProperty<*>, a: Int): Int {
return a
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.reflect.KProperty
@@ -1,17 +0,0 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.reflect.KProperty
class A {
var a: Int by Delegate()
}
var aTopLevel: Int by Delegate()
class Delegate {
operator fun getValue(t: Any?, p: KProperty<*>): Int {
return 1
}
operator fun setValue(t: Any?, p: KProperty<*>, a: Int, c: Int) {}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.reflect.KProperty