Compute return type for property getters more safely
Do not call `isError()` on property's type right after creation of
PropertyGetterDescriptor because the property has no getter yet (it's created
but not yet stored to the property, that happens a bit later), and `isError()`
leads to computation of the delegate type, which for delegated properties
performs some complex resolution (see `VariableTypeResolver#process`) which
relies on the fact that the property already has a getter.
Since the purpose of the original change (883e2e4d) was to support a quick fix
which would add the type to a property in an expression like "val x get() =
...", check the type (or initializer) presence in the PSI instead, this is
safer and is still suitable for the quick fix.
Also fix arguments to "wrong getter type" diagnostic: previously something
useless like "expected Int, actual Int" was reported
#KT-11809 Fixed
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
// KT-11809 Assertion error when delegated property has getter
|
||||
|
||||
class A {
|
||||
val p1 by this
|
||||
get
|
||||
|
||||
var p2 by this
|
||||
<!ACCESSOR_FOR_DELEGATED_PROPERTY!>get() = ""<!>
|
||||
|
||||
operator fun getValue(a: Any?, p: Any?) = ""
|
||||
operator fun setValue(a: Any?, p: Any?, v: Any?) {}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package
|
||||
|
||||
public final class A {
|
||||
public constructor A()
|
||||
public final val p1: kotlin.String
|
||||
public final var p2: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final operator fun getValue(/*0*/ a: kotlin.Any?, /*1*/ p: kotlin.Any?): kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public final operator fun setValue(/*0*/ a: kotlin.Any?, /*1*/ p: kotlin.Any?, /*2*/ v: kotlin.Any?): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Reference in New Issue
Block a user