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.
This commit is contained in:
Mark Punzalan
2021-09-24 07:26:53 +00:00
committed by TeamCityServer
parent b8ed46066e
commit 42abc4a3af
12 changed files with 40 additions and 58 deletions
@@ -37,7 +37,7 @@ object FirDeprecationChecker : FirBasicExpressionChecker() {
val reference = resolvable.calleeReference as? FirResolvedNamedReference ?: return val reference = resolvable.calleeReference as? FirResolvedNamedReference ?: return
val referencedSymbol = reference.resolvedSymbol val referencedSymbol = reference.resolvedSymbol
reportDeprecationIfNeeded(expression.source, referencedSymbol, expression, context, reporter) reportDeprecationIfNeeded(reference.source, referencedSymbol, expression, context, reporter)
} }
internal fun reportDeprecationIfNeeded( internal fun reportDeprecationIfNeeded(
@@ -584,6 +584,12 @@ object LightTreePositioningStrategies {
tree: FlyweightCapableTreeStructure<LighterASTNode> tree: FlyweightCapableTreeStructure<LighterASTNode>
): List<TextRange> { ): List<TextRange> {
when { 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 -> { node.tokenType == KtNodeTypes.CALL_EXPRESSION || node.tokenType == KtNodeTypes.CONSTRUCTOR_DELEGATION_CALL -> {
return markElement(tree.referenceExpression(node, locateReferencedName) ?: node, startOffset, endOffset, tree, node) return markElement(tree.referenceExpression(node, locateReferencedName) ?: node, startOffset, endOffset, tree, node)
} }
@@ -33,14 +33,16 @@ fun FirBasedSymbol<*>.getDeprecation(callSite: FirElement?): DeprecationInfo? {
val deprecationInfos = mutableListOf<DeprecationInfo>() val deprecationInfos = mutableListOf<DeprecationInfo>()
when (this) { when (this) {
is FirPropertySymbol -> is FirPropertySymbol ->
if (callSite is FirVariableAssignment) { when (callSite) {
deprecationInfos.addIfNotNull( is FirVariableAssignment ->
getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_SETTER, AnnotationUseSiteTarget.PROPERTY) deprecationInfos.addIfNotNull(
) getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_SETTER, AnnotationUseSiteTarget.PROPERTY)
} else { )
deprecationInfos.addIfNotNull( is FirPropertyAccessExpression ->
getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_GETTER, AnnotationUseSiteTarget.PROPERTY) deprecationInfos.addIfNotNull(
) getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_GETTER, AnnotationUseSiteTarget.PROPERTY)
)
else -> deprecationInfos.addIfNotNull(getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY))
} }
else -> deprecationInfos.addIfNotNull(getDeprecationForCallSite()) else -> deprecationInfos.addIfNotNull(getDeprecationForCallSite())
} }
@@ -896,6 +896,10 @@ object PositioningStrategies {
*/ */
class FindReferencePositioningStrategy(val locateReferencedName: Boolean) : PositioningStrategy<PsiElement>() { class FindReferencePositioningStrategy(val locateReferencedName: Boolean) : PositioningStrategy<PsiElement>() {
override fun mark(element: PsiElement): List<TextRange> { override fun mark(element: PsiElement): List<TextRange> {
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) { var result: PsiElement = when (element) {
is KtQualifiedExpression -> { is KtQualifiedExpression -> {
when (val selectorExpression = element.selectorExpression) { when (val selectorExpression = element.selectorExpression) {
@@ -96,16 +96,16 @@ fun use(
diff: Diff diff: Diff
) { ) {
warningDeprecated.<!DEPRECATION!>p<!> warningDeprecated.<!DEPRECATION!>p<!>
warningDeprecated.p <!DEPRECATION!>=<!> 1 warningDeprecated.<!DEPRECATION!>p<!> = 1
errorDeprecated.<!DEPRECATION_ERROR!>p<!> errorDeprecated.<!DEPRECATION_ERROR!>p<!>
errorDeprecated.p <!DEPRECATION_ERROR!>=<!> 1 errorDeprecated.<!DEPRECATION_ERROR!>p<!> = 1
getterDeprecated.<!DEPRECATION!>p<!> getterDeprecated.<!DEPRECATION!>p<!>
getterDeprecated.p = 1 getterDeprecated.p = 1
setterDeprecated.p setterDeprecated.p
setterDeprecated.p <!DEPRECATION!>=<!> 1 setterDeprecated.<!DEPRECATION!>p<!> = 1
hiddenDeprecated.<!UNRESOLVED_REFERENCE!>p<!> hiddenDeprecated.<!UNRESOLVED_REFERENCE!>p<!>
hiddenDeprecated.<!UNRESOLVED_REFERENCE!>p<!> = 1 hiddenDeprecated.<!UNRESOLVED_REFERENCE!>p<!> = 1
@@ -96,16 +96,16 @@ fun use(
diff: Diff diff: Diff
) { ) {
warningDeprecated.<!DEPRECATION!>p<!> warningDeprecated.<!DEPRECATION!>p<!>
warningDeprecated.p <!DEPRECATION!>=<!> 1 warningDeprecated.<!DEPRECATION!>p<!> = 1
errorDeprecated.<!DEPRECATION_ERROR!>p<!> errorDeprecated.<!DEPRECATION_ERROR!>p<!>
errorDeprecated.p <!DEPRECATION_ERROR!>=<!> 1 errorDeprecated.<!DEPRECATION_ERROR!>p<!> = 1
getterDeprecated.<!DEPRECATION!>p<!> getterDeprecated.<!DEPRECATION!>p<!>
getterDeprecated.p = 1 getterDeprecated.p = 1
setterDeprecated.p setterDeprecated.p
setterDeprecated.p <!DEPRECATION!>=<!> 1 setterDeprecated.<!DEPRECATION!>p<!> = 1
hiddenDeprecated.<!UNRESOLVED_REFERENCE!>p<!> hiddenDeprecated.<!UNRESOLVED_REFERENCE!>p<!>
hiddenDeprecated.<!UNRESOLVED_REFERENCE!>p<!> = 1 hiddenDeprecated.<!UNRESOLVED_REFERENCE!>p<!> = 1
@@ -37,30 +37,30 @@ class PropertyHolder {
} }
fun PropertyHolder.extFunction() { fun PropertyHolder.extFunction() {
test2 <!DEPRECATION!>=<!> "ext" <!DEPRECATION!>test2<!> = "ext"
<!DEPRECATION!>test1<!> <!DEPRECATION!>test1<!>
} }
fun fn() { fun fn() {
PropertyHolder().<!DEPRECATION!>test1<!> PropertyHolder().<!DEPRECATION!>test1<!>
PropertyHolder().<!DEPRECATION!>test2<!> PropertyHolder().<!DEPRECATION!>test2<!>
PropertyHolder().test2 <!DEPRECATION!>=<!> "" PropertyHolder().<!DEPRECATION!>test2<!> = ""
PropertyHolder().<!DEPRECATION!>test3<!> PropertyHolder().<!DEPRECATION!>test3<!>
PropertyHolder().test3 = "" PropertyHolder().test3 = ""
PropertyHolder().test4 PropertyHolder().test4
PropertyHolder().test4 <!DEPRECATION!>=<!> "" PropertyHolder().<!DEPRECATION!>test4<!> = ""
val a = PropertyHolder().<!DEPRECATION!>x<!> val a = PropertyHolder().<!DEPRECATION!>x<!>
val b = PropertyHolder().<!DEPRECATION!>name<!> val b = PropertyHolder().<!DEPRECATION!>name<!>
PropertyHolder().name <!DEPRECATION!>=<!> "value" PropertyHolder().<!DEPRECATION!>name<!> = "value"
val d = PropertyHolder().valDelegate val d = PropertyHolder().valDelegate
PropertyHolder().varDelegate = 1 PropertyHolder().varDelegate = 1
} }
fun literals() { fun literals() {
PropertyHolder::<!DEPRECATION!>test1<!> PropertyHolder::test1
PropertyHolder::<!DEPRECATION!>name<!> PropertyHolder::<!DEPRECATION!>name<!>
} }
@@ -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.<!DEPRECATION!>a1<!>
holder.<!DEPRECATION!>a2<!>
holder.<!DEPRECATION!>withGetter<!>
holder.withSetter <!DEPRECATION!>=<!> "A"
}
fun literals() {
PropertyHolder::<!DEPRECATION!>a1<!>
PropertyHolder::<!DEPRECATION!>a2<!>
PropertyHolder::<!DEPRECATION!>withGetter<!>
PropertyHolder::withSetter
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_EXPRESSION // !DIAGNOSTICS: -UNUSED_EXPRESSION
class PropertyHolder { class PropertyHolder {
@@ -21,7 +21,7 @@ open class A {
<!PROTECTED_CALL_FROM_PUBLIC_INLINE!>test<!>() <!PROTECTED_CALL_FROM_PUBLIC_INLINE!>test<!>()
<!PROTECTED_CALL_FROM_PUBLIC_INLINE!>z<!> <!PROTECTED_CALL_FROM_PUBLIC_INLINE!>z<!>
zVar zVar
zVar <!PROTECTED_CALL_FROM_PUBLIC_INLINE!>=<!> "123" <!PROTECTED_CALL_FROM_PUBLIC_INLINE!>zVar<!> = "123"
} }
internal inline fun callFromInternal() { internal inline fun callFromInternal() {
@@ -21,7 +21,7 @@ open class A {
<!PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR!>test<!>() <!PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR!>test<!>()
<!PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR!>z<!> <!PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR!>z<!>
zVar zVar
zVar <!PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR!>=<!> "123" <!PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR!>zVar<!> = "123"
} }
internal inline fun callFromInternal() { internal inline fun callFromInternal() {
@@ -7,12 +7,12 @@ fun foo(javaClass: JavaClass) {
javaClass.<!DEPRECATION!>something2<!>++ javaClass.<!DEPRECATION!>something2<!>++
javaClass.something3 javaClass.something3
javaClass.something3 <!DEPRECATION!>=<!> 1 javaClass.<!DEPRECATION!>something3<!> = 1
javaClass.something3<!DEPRECATION!>++<!> javaClass.<!DEPRECATION!>something3<!>++
javaClass.<!DEPRECATION!>something4<!> javaClass.<!DEPRECATION!>something4<!>
javaClass.something4 <!DEPRECATION!>=<!> 1 javaClass.<!DEPRECATION!>something4<!> = 1
javaClass.<!DEPRECATION!>something4<!><!DEPRECATION!>++<!> javaClass.<!DEPRECATION, DEPRECATION!>something4<!>++
javaClass.something5 javaClass.something5
javaClass.something5 = 1 javaClass.something5 = 1
@@ -45,4 +45,4 @@ public class JavaClass {
* @deprecated Ha-ha-ha * @deprecated Ha-ha-ha
*/ */
public void setSomething5(int value) { } public void setSomething5(int value) { }
} }