[FIR] Don't report DEPRECATION on self-access in delegated property
#KT-60682
This commit is contained in:
committed by
Space Team
parent
411210b520
commit
21f8ba1706
+17
-1
@@ -6,7 +6,6 @@
|
|||||||
package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.KtRealSourceElementKind
|
|
||||||
import org.jetbrains.kotlin.KtSourceElement
|
import org.jetbrains.kotlin.KtSourceElement
|
||||||
import org.jetbrains.kotlin.config.KotlinCompilerVersion
|
import org.jetbrains.kotlin.config.KotlinCompilerVersion
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||||
@@ -29,6 +28,7 @@ import org.jetbrains.kotlin.fir.references.resolved
|
|||||||
import org.jetbrains.kotlin.fir.resolve.firClassLike
|
import org.jetbrains.kotlin.fir.resolve.firClassLike
|
||||||
import org.jetbrains.kotlin.fir.resolve.typeAliasForConstructor
|
import org.jetbrains.kotlin.fir.resolve.typeAliasForConstructor
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||||
@@ -51,6 +51,9 @@ object FirDeprecationChecker : FirBasicExpressionChecker() {
|
|||||||
val calleeReference = expression.calleeReference ?: return
|
val calleeReference = expression.calleeReference ?: return
|
||||||
val resolvedReference = calleeReference.resolved ?: return
|
val resolvedReference = calleeReference.resolved ?: return
|
||||||
val referencedSymbol = resolvedReference.resolvedSymbol
|
val referencedSymbol = resolvedReference.resolvedSymbol
|
||||||
|
|
||||||
|
if (expression.isDelegatedPropertySelfAccess(context, referencedSymbol)) return
|
||||||
|
|
||||||
val source = resolvedReference.source ?: expression.source
|
val source = resolvedReference.source ?: expression.source
|
||||||
|
|
||||||
if (expression is FirDelegatedConstructorCall) {
|
if (expression is FirDelegatedConstructorCall) {
|
||||||
@@ -67,6 +70,19 @@ object FirDeprecationChecker : FirBasicExpressionChecker() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Checks if this is an access to a delegated property inside the delegated property itself.
|
||||||
|
* Deprecations shouldn't be reported here. */
|
||||||
|
@OptIn(SymbolInternals::class)
|
||||||
|
private fun FirStatement.isDelegatedPropertySelfAccess(context: CheckerContext, referencedSymbol: FirBasedSymbol<*>): Boolean {
|
||||||
|
if (source?.kind != KtFakeSourceElementKind.DelegatedPropertyAccessor) return false
|
||||||
|
val containers = context.containingDeclarations
|
||||||
|
val size = containers.size
|
||||||
|
val fir = referencedSymbol.fir
|
||||||
|
|
||||||
|
return containers.getOrNull(size - 1) == fir // For `provideDelegate`, the call will be in the initializer
|
||||||
|
|| containers.getOrNull(size - 2) == fir // For `getValue`, the call will be in the accessor
|
||||||
|
}
|
||||||
|
|
||||||
internal fun reportApiStatusIfNeeded(
|
internal fun reportApiStatusIfNeeded(
|
||||||
source: KtSourceElement?,
|
source: KtSourceElement?,
|
||||||
referencedSymbol: FirBasedSymbol<*>,
|
referencedSymbol: FirBasedSymbol<*>,
|
||||||
|
|||||||
@@ -13,6 +13,15 @@ class Delegate() {
|
|||||||
operator fun setValue(instance: Any, property: KProperty<*>, value: Int) {}
|
operator fun setValue(instance: Any, property: KProperty<*>, value: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Delegate2() {
|
||||||
|
operator fun getValue(instance: Any, property: KProperty<*>) : Int = 1
|
||||||
|
operator fun setValue(instance: Any, property: KProperty<*>, value: Int) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DelegateProvider() {
|
||||||
|
operator fun provideDelegate(instance: Any, property: KProperty<*>) = Delegate2()
|
||||||
|
}
|
||||||
|
|
||||||
class PropertyHolder {
|
class PropertyHolder {
|
||||||
@Deprecated("text")
|
@Deprecated("text")
|
||||||
val x = 1
|
val x = 1
|
||||||
@@ -23,6 +32,14 @@ class PropertyHolder {
|
|||||||
val valDelegate by <!DEPRECATION!>Delegate<!>()
|
val valDelegate by <!DEPRECATION!>Delegate<!>()
|
||||||
var varDelegate by <!DEPRECATION, DEPRECATION!>Delegate<!>()
|
var varDelegate by <!DEPRECATION, DEPRECATION!>Delegate<!>()
|
||||||
|
|
||||||
|
// no deprecation caused by access to itself
|
||||||
|
@Deprecated("text")
|
||||||
|
var deprecatedDelegated by Delegate2()
|
||||||
|
|
||||||
|
// no deprecation caused by access to itself
|
||||||
|
@Deprecated("text")
|
||||||
|
val deprecatedDelegated2 by DelegateProvider()
|
||||||
|
|
||||||
public val test1: String = ""
|
public val test1: String = ""
|
||||||
@Deprecated("val-getter") get
|
@Deprecated("val-getter") get
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,15 @@ class Delegate() {
|
|||||||
operator fun setValue(instance: Any, property: KProperty<*>, value: Int) {}
|
operator fun setValue(instance: Any, property: KProperty<*>, value: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Delegate2() {
|
||||||
|
operator fun getValue(instance: Any, property: KProperty<*>) : Int = 1
|
||||||
|
operator fun setValue(instance: Any, property: KProperty<*>, value: Int) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DelegateProvider() {
|
||||||
|
operator fun provideDelegate(instance: Any, property: KProperty<*>) = Delegate2()
|
||||||
|
}
|
||||||
|
|
||||||
class PropertyHolder {
|
class PropertyHolder {
|
||||||
@Deprecated("text")
|
@Deprecated("text")
|
||||||
val x = 1
|
val x = 1
|
||||||
@@ -23,6 +32,14 @@ class PropertyHolder {
|
|||||||
val valDelegate by <!DEPRECATION!>Delegate()<!>
|
val valDelegate by <!DEPRECATION!>Delegate()<!>
|
||||||
var varDelegate by <!DEPRECATION, DEPRECATION!>Delegate()<!>
|
var varDelegate by <!DEPRECATION, DEPRECATION!>Delegate()<!>
|
||||||
|
|
||||||
|
// no deprecation caused by access to itself
|
||||||
|
@Deprecated("text")
|
||||||
|
var deprecatedDelegated by Delegate2()
|
||||||
|
|
||||||
|
// no deprecation caused by access to itself
|
||||||
|
@Deprecated("text")
|
||||||
|
val deprecatedDelegated2 by DelegateProvider()
|
||||||
|
|
||||||
public val test1: String = ""
|
public val test1: String = ""
|
||||||
@Deprecated("val-getter") get
|
@Deprecated("val-getter") get
|
||||||
|
|
||||||
|
|||||||
@@ -13,8 +13,27 @@ public final class Delegate {
|
|||||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class Delegate2 {
|
||||||
|
public constructor Delegate2()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public final operator fun getValue(/*0*/ instance: kotlin.Any, /*1*/ property: kotlin.reflect.KProperty<*>): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public final operator fun setValue(/*0*/ instance: kotlin.Any, /*1*/ property: kotlin.reflect.KProperty<*>, /*2*/ value: kotlin.Int): kotlin.Unit
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class DelegateProvider {
|
||||||
|
public constructor DelegateProvider()
|
||||||
|
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 final operator fun provideDelegate(/*0*/ instance: kotlin.Any, /*1*/ property: kotlin.reflect.KProperty<*>): Delegate2
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
public final class PropertyHolder {
|
public final class PropertyHolder {
|
||||||
public constructor PropertyHolder()
|
public constructor PropertyHolder()
|
||||||
|
@kotlin.Deprecated(message = "text") public final var deprecatedDelegated: kotlin.Int
|
||||||
|
@kotlin.Deprecated(message = "text") public final val deprecatedDelegated2: kotlin.Int
|
||||||
@kotlin.Deprecated(message = "text") public final var name: kotlin.String
|
@kotlin.Deprecated(message = "text") public final var name: kotlin.String
|
||||||
@get:kotlin.Deprecated(message = "val-getter") public final val test1: kotlin.String = ""
|
@get:kotlin.Deprecated(message = "val-getter") public final val test1: kotlin.String = ""
|
||||||
@get:kotlin.Deprecated(message = "var-getter") @set:kotlin.Deprecated(message = "var-setter") public final var test2: kotlin.String
|
@get:kotlin.Deprecated(message = "var-getter") @set:kotlin.Deprecated(message = "var-setter") public final var test2: kotlin.String
|
||||||
|
|||||||
Reference in New Issue
Block a user