From 42abc4a3af6aff50392611ac535dde10117e8a5b Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Fri, 24 Sep 2021 07:26:53 +0000 Subject: [PATCH] FIR: Don't use AnnotationUseSiteTarget.PROPERTY_GETTER when computing deprecation from a callable reference use site. Also fixed positioning of DEPRECATION(_ERROR) diagnostics on variable assignments. --- .../expression/FirDeprecationChecker.kt | 2 +- .../LightTreePositioningStrategies.kt | 6 ++++ .../fir/declarations/deprecationUtils.kt | 18 ++++++----- .../diagnostics/PositioningStrategies.kt | 4 +++ ...deprecatedPropertyInheritance_after.fir.kt | 6 ++-- ...eprecatedPropertyInheritance_before.fir.kt | 6 ++-- .../tests/deprecated/propertyUsage.fir.kt | 10 +++--- .../propertyUseSiteTargetedAnnotations.fir.kt | 31 ------------------- .../propertyUseSiteTargetedAnnotations.kt | 1 + .../inline/protectedCallDepecation.fir.kt | 2 +- .../tests/inline/protectedCallError.fir.kt | 2 +- .../javaProperties/Deprecated.fir.kt | 10 +++--- 12 files changed, 40 insertions(+), 58 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/deprecated/propertyUseSiteTargetedAnnotations.fir.kt 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 5c2c5e52fe8..3f08dc0b1a8 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 @@ -37,7 +37,7 @@ object FirDeprecationChecker : FirBasicExpressionChecker() { val reference = resolvable.calleeReference as? FirResolvedNamedReference ?: return val referencedSymbol = reference.resolvedSymbol - reportDeprecationIfNeeded(expression.source, referencedSymbol, expression, context, reporter) + reportDeprecationIfNeeded(reference.source, referencedSymbol, expression, context, reporter) } internal fun reportDeprecationIfNeeded( diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt index 76e043ee593..f28d4332da0 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt @@ -584,6 +584,12 @@ object LightTreePositioningStrategies { tree: FlyweightCapableTreeStructure ): List { when { + node.tokenType == KtNodeTypes.BINARY_EXPRESSION && tree.findDescendantByType(node, KtTokens.EQ) != null -> { + // Look for reference in LHS of variable assignment. + tree.findExpressionDeep(node)?.let { + return markElement(it, startOffset, endOffset, tree, node) + } + } node.tokenType == KtNodeTypes.CALL_EXPRESSION || node.tokenType == KtNodeTypes.CONSTRUCTOR_DELEGATION_CALL -> { return markElement(tree.referenceExpression(node, locateReferencedName) ?: node, startOffset, endOffset, tree, node) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt index 944970419f3..5c50768b13d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt @@ -33,14 +33,16 @@ fun FirBasedSymbol<*>.getDeprecation(callSite: FirElement?): DeprecationInfo? { val deprecationInfos = mutableListOf() when (this) { is FirPropertySymbol -> - if (callSite is FirVariableAssignment) { - deprecationInfos.addIfNotNull( - getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_SETTER, AnnotationUseSiteTarget.PROPERTY) - ) - } else { - deprecationInfos.addIfNotNull( - getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_GETTER, AnnotationUseSiteTarget.PROPERTY) - ) + when (callSite) { + is FirVariableAssignment -> + deprecationInfos.addIfNotNull( + getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_SETTER, AnnotationUseSiteTarget.PROPERTY) + ) + is FirPropertyAccessExpression -> + deprecationInfos.addIfNotNull( + getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_GETTER, AnnotationUseSiteTarget.PROPERTY) + ) + else -> deprecationInfos.addIfNotNull(getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY)) } else -> deprecationInfos.addIfNotNull(getDeprecationForCallSite()) } diff --git a/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt b/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt index 0bb9e534dae..f00cb95fa9a 100644 --- a/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt +++ b/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt @@ -896,6 +896,10 @@ object PositioningStrategies { */ class FindReferencePositioningStrategy(val locateReferencedName: Boolean) : PositioningStrategy() { override fun mark(element: PsiElement): List { + if (element is KtBinaryExpression && element.operationToken == KtTokens.EQ) { + // Look for reference in LHS of variable assignment. + element.left?.let { return mark(it) } + } var result: PsiElement = when (element) { is KtQualifiedExpression -> { when (val selectorExpression = element.selectorExpression) { diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_after.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_after.fir.kt index fa527369562..2ae2bf5793b 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_after.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_after.fir.kt @@ -96,16 +96,16 @@ fun use( diff: Diff ) { warningDeprecated.p - warningDeprecated.p = 1 + warningDeprecated.p = 1 errorDeprecated.p - errorDeprecated.p = 1 + errorDeprecated.p = 1 getterDeprecated.p getterDeprecated.p = 1 setterDeprecated.p - setterDeprecated.p = 1 + setterDeprecated.p = 1 hiddenDeprecated.p hiddenDeprecated.p = 1 diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_before.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_before.fir.kt index 530007d01e5..794afeebeb6 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_before.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_before.fir.kt @@ -96,16 +96,16 @@ fun use( diff: Diff ) { warningDeprecated.p - warningDeprecated.p = 1 + warningDeprecated.p = 1 errorDeprecated.p - errorDeprecated.p = 1 + errorDeprecated.p = 1 getterDeprecated.p getterDeprecated.p = 1 setterDeprecated.p - setterDeprecated.p = 1 + setterDeprecated.p = 1 hiddenDeprecated.p hiddenDeprecated.p = 1 diff --git a/compiler/testData/diagnostics/tests/deprecated/propertyUsage.fir.kt b/compiler/testData/diagnostics/tests/deprecated/propertyUsage.fir.kt index b9286b88a27..13f222ebd67 100644 --- a/compiler/testData/diagnostics/tests/deprecated/propertyUsage.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/propertyUsage.fir.kt @@ -37,30 +37,30 @@ class PropertyHolder { } fun PropertyHolder.extFunction() { - test2 = "ext" + test2 = "ext" test1 } fun fn() { PropertyHolder().test1 PropertyHolder().test2 - PropertyHolder().test2 = "" + PropertyHolder().test2 = "" PropertyHolder().test3 PropertyHolder().test3 = "" PropertyHolder().test4 - PropertyHolder().test4 = "" + PropertyHolder().test4 = "" val a = PropertyHolder().x val b = PropertyHolder().name - PropertyHolder().name = "value" + PropertyHolder().name = "value" val d = PropertyHolder().valDelegate PropertyHolder().varDelegate = 1 } fun literals() { - PropertyHolder::test1 + PropertyHolder::test1 PropertyHolder::name } diff --git a/compiler/testData/diagnostics/tests/deprecated/propertyUseSiteTargetedAnnotations.fir.kt b/compiler/testData/diagnostics/tests/deprecated/propertyUseSiteTargetedAnnotations.fir.kt deleted file mode 100644 index 36b16c2f919..00000000000 --- a/compiler/testData/diagnostics/tests/deprecated/propertyUseSiteTargetedAnnotations.fir.kt +++ /dev/null @@ -1,31 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION - -class PropertyHolder { - @Deprecated("") - val a1 = 1 - - @property:Deprecated("") - var a2 = "" - - @get:Deprecated("") - public val withGetter: String = "" - - @set:Deprecated("") - public var withSetter: String = "" -} - -fun fn() { - val holder = PropertyHolder() - - holder.a1 - holder.a2 - holder.withGetter - holder.withSetter = "A" -} - -fun literals() { - PropertyHolder::a1 - PropertyHolder::a2 - PropertyHolder::withGetter - PropertyHolder::withSetter -} diff --git a/compiler/testData/diagnostics/tests/deprecated/propertyUseSiteTargetedAnnotations.kt b/compiler/testData/diagnostics/tests/deprecated/propertyUseSiteTargetedAnnotations.kt index d4ddefcc765..a9def444d53 100644 --- a/compiler/testData/diagnostics/tests/deprecated/propertyUseSiteTargetedAnnotations.kt +++ b/compiler/testData/diagnostics/tests/deprecated/propertyUseSiteTargetedAnnotations.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION class PropertyHolder { diff --git a/compiler/testData/diagnostics/tests/inline/protectedCallDepecation.fir.kt b/compiler/testData/diagnostics/tests/inline/protectedCallDepecation.fir.kt index 6e31ad879f4..8e32f29b65d 100644 --- a/compiler/testData/diagnostics/tests/inline/protectedCallDepecation.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/protectedCallDepecation.fir.kt @@ -21,7 +21,7 @@ open class A { test() z zVar - zVar = "123" + zVar = "123" } internal inline fun callFromInternal() { diff --git a/compiler/testData/diagnostics/tests/inline/protectedCallError.fir.kt b/compiler/testData/diagnostics/tests/inline/protectedCallError.fir.kt index 866ccd6c970..a6044469d59 100644 --- a/compiler/testData/diagnostics/tests/inline/protectedCallError.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/protectedCallError.fir.kt @@ -21,7 +21,7 @@ open class A { test() z zVar - zVar = "123" + zVar = "123" } internal inline fun callFromInternal() { diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/Deprecated.fir.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/Deprecated.fir.kt index bbef27f225d..19314b425cd 100644 --- a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/Deprecated.fir.kt +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/Deprecated.fir.kt @@ -7,12 +7,12 @@ fun foo(javaClass: JavaClass) { javaClass.something2++ javaClass.something3 - javaClass.something3 = 1 - javaClass.something3++ + javaClass.something3 = 1 + javaClass.something3++ javaClass.something4 - javaClass.something4 = 1 - javaClass.something4++ + javaClass.something4 = 1 + javaClass.something4++ javaClass.something5 javaClass.something5 = 1 @@ -45,4 +45,4 @@ public class JavaClass { * @deprecated Ha-ha-ha */ public void setSomething5(int value) { } -} \ No newline at end of file +}