diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDeprecationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDeprecationChecker.kt index c70a02a5360..a351106fbbe 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDeprecationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDeprecationChecker.kt @@ -38,30 +38,32 @@ import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue object FirDeprecationChecker : FirBasicExpressionChecker() { - private val allowedSourceKinds = setOf( - KtRealSourceElementKind, - KtFakeSourceElementKind.DesugaredIncrementOrDecrement + private val filteredSourceKinds: Set = setOf( + KtFakeSourceElementKind.PropertyFromParameter, + KtFakeSourceElementKind.DataClassGeneratedMembers ) override fun check(expression: FirStatement, context: CheckerContext, reporter: DiagnosticReporter) { - if (!allowedSourceKinds.contains(expression.source?.kind)) return + if (expression.source?.kind in filteredSourceKinds) return if (expression is FirAnnotation) return // checked by FirDeprecatedTypeChecker if (expression.isLhsOfAssignment(context)) return val calleeReference = expression.calleeReference ?: return val resolvedReference = calleeReference.resolved ?: return val referencedSymbol = resolvedReference.resolvedSymbol + val source = resolvedReference.source ?: expression.source if (expression is FirDelegatedConstructorCall) { // Report deprecations on the constructor itself, not on the declaring class as that will be handled by FirDeprecatedTypeChecker val constructorOnlyDeprecation = referencedSymbol.getDeprecation(context.session, expression) ?: return val isTypealiasExpansion = expression.constructedTypeRef.firClassLike(context.session)?.symbol is FirTypeAliasSymbol + reportApiStatus( - resolvedReference.source, referencedSymbol, isTypealiasExpansion, + source, referencedSymbol, isTypealiasExpansion, constructorOnlyDeprecation, reporter, context ) } else { - reportApiStatusIfNeeded(resolvedReference.source, referencedSymbol, context, reporter, callSite = expression) + reportApiStatusIfNeeded(source, referencedSymbol, context, reporter, callSite = expression) } } diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt index de554b2f404..fe1eeb933f8 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt @@ -2025,7 +2025,7 @@ open class PsiRawFirBuilder( if (hasDelegate()) { fun extractDelegateExpression() = - buildOrLazyExpression(this@toFirProperty.toFirSourceElement(KtFakeSourceElementKind.WrappedDelegate)) { + buildOrLazyExpression(this@toFirProperty.delegate?.expression?.toFirSourceElement(KtFakeSourceElementKind.WrappedDelegate)) { this@toFirProperty.delegate?.expression?.let { expression -> expression.toFirExpression("Should have delegate") } ?: buildErrorExpression { diff --git a/compiler/testData/diagnostics/tests/deprecated/componentUsage.fir.kt b/compiler/testData/diagnostics/tests/deprecated/componentUsage.fir.kt deleted file mode 100644 index a5c9bb6e78e..00000000000 --- a/compiler/testData/diagnostics/tests/deprecated/componentUsage.fir.kt +++ /dev/null @@ -1,11 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE - -class Data { - @Deprecated("text") - operator fun component1(): String = throw Exception() - operator fun component2(): String = throw Exception() -} - -fun use() { - val (x, y) = Data() -} diff --git a/compiler/testData/diagnostics/tests/deprecated/componentUsage.kt b/compiler/testData/diagnostics/tests/deprecated/componentUsage.kt index 8e2ae53b4c5..2e35374d588 100644 --- a/compiler/testData/diagnostics/tests/deprecated/componentUsage.kt +++ b/compiler/testData/diagnostics/tests/deprecated/componentUsage.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE class Data { diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedConstructorProperty.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedConstructorProperty.kt index 1cd45150cf4..71ee90ab7da 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedConstructorProperty.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedConstructorProperty.kt @@ -14,3 +14,5 @@ fun use() { A("").s A(42).s } + +data class DC(@Deprecated("") val a: String) diff --git a/compiler/testData/diagnostics/tests/deprecated/iteratorUsage.fir.kt b/compiler/testData/diagnostics/tests/deprecated/iteratorUsage.fir.kt index 7f6615b6ab5..24905aeb0e0 100644 --- a/compiler/testData/diagnostics/tests/deprecated/iteratorUsage.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/iteratorUsage.fir.kt @@ -19,6 +19,6 @@ class Iter2 { } fun use() { - for (x in Iter()) {} - for (x in Iter2()) {} + for (x in Iter()) {} + for (x in Iter2()) {} } diff --git a/compiler/testData/diagnostics/tests/deprecated/propertyUsage.fir.kt b/compiler/testData/diagnostics/tests/deprecated/propertyUsage.fir.kt index 13f222ebd67..c90d5b097a2 100644 --- a/compiler/testData/diagnostics/tests/deprecated/propertyUsage.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/propertyUsage.fir.kt @@ -1,4 +1,7 @@ // !DIAGNOSTICS: -UNUSED_EXPRESSION +// IGNORE_DIAGNOSTIC_API +// IGNORE_REVERSED_RESOLVE +// ^KT-61491 import kotlin.reflect.KProperty @@ -17,8 +20,8 @@ class PropertyHolder { @Deprecated("text") var name = "String" - val valDelegate by Delegate() - var varDelegate by Delegate() + val valDelegate by Delegate() + var varDelegate by Delegate() public val test1: String = "" @Deprecated("val-getter") get diff --git a/compiler/testData/diagnostics/tests/deprecated/propertyUsage.kt b/compiler/testData/diagnostics/tests/deprecated/propertyUsage.kt index ae9233a2f37..60cccb93031 100644 --- a/compiler/testData/diagnostics/tests/deprecated/propertyUsage.kt +++ b/compiler/testData/diagnostics/tests/deprecated/propertyUsage.kt @@ -1,4 +1,7 @@ // !DIAGNOSTICS: -UNUSED_EXPRESSION +// IGNORE_DIAGNOSTIC_API +// IGNORE_REVERSED_RESOLVE +// ^KT-61491 import kotlin.reflect.KProperty diff --git a/compiler/testData/diagnostics/tests/deprecated/propertyWithInvoke.fir.kt b/compiler/testData/diagnostics/tests/deprecated/propertyWithInvoke.fir.kt deleted file mode 100644 index c5f23583e4b..00000000000 --- a/compiler/testData/diagnostics/tests/deprecated/propertyWithInvoke.fir.kt +++ /dev/null @@ -1,6 +0,0 @@ -@Deprecated("No") -val f: () -> Unit = {} - -fun test() { - f() -} diff --git a/compiler/testData/diagnostics/tests/deprecated/propertyWithInvoke.kt b/compiler/testData/diagnostics/tests/deprecated/propertyWithInvoke.kt index ab47cb7b253..3001b3c8109 100644 --- a/compiler/testData/diagnostics/tests/deprecated/propertyWithInvoke.kt +++ b/compiler/testData/diagnostics/tests/deprecated/propertyWithInvoke.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL @Deprecated("No") val f: () -> Unit = {}