[FIR] Fix false negative REDUNDANT_CALL_OF_CONVERSION_METHOD

... in presence of typealiases.

#KT-61921
This commit is contained in:
Kirill Rakhman
2023-09-14 09:48:55 +02:00
committed by Space Team
parent e788c7166a
commit 9475bc250c
3 changed files with 16 additions and 4 deletions
@@ -1,3 +1,8 @@
FILE: int.kt
public final val foo: R|kotlin/Int| = Int(1).R|kotlin/Int.toInt|()
public get(): R|kotlin/Int|
public final typealias IntAlias = R|kotlin/Int|
public final val aliased: R|IntAlias| = Int(1)
public get(): R|IntAlias|
public final val bar: R|kotlin/Int| = R|/aliased|.R|kotlin/Int.toInt|()
public get(): R|kotlin/Int|
@@ -1,2 +1,7 @@
// WITH_STDLIB
val foo = 1.<!REDUNDANT_CALL_OF_CONVERSION_METHOD!>toInt()<!>
val foo = 1.<!REDUNDANT_CALL_OF_CONVERSION_METHOD!>toInt()<!>
typealias IntAlias = Int
val aliased: IntAlias = 1
val bar = aliased.<!REDUNDANT_CALL_OF_CONVERSION_METHOD!>toInt()<!>
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.extended
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
@@ -15,6 +16,7 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.analysis.checkers.fullyExpandedClassId
import org.jetbrains.kotlin.fir.types.ConeFlexibleType
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.types.isMarkedNullable
@@ -29,12 +31,12 @@ object RedundantCallOfConversionMethod : FirQualifiedAccessExpressionChecker() {
val functionName = expression.calleeReference.name.asString()
val qualifiedType = targetClassMap[functionName] ?: return
if (expression.explicitReceiver?.isRedundant(qualifiedType) == true) {
if (expression.explicitReceiver?.isRedundant(qualifiedType, context.session) == true) {
reporter.reportOn(expression.source, FirErrors.REDUNDANT_CALL_OF_CONVERSION_METHOD, context)
}
}
private fun FirExpression.isRedundant(qualifiedClassId: ClassId): Boolean {
private fun FirExpression.isRedundant(qualifiedClassId: ClassId, session: FirSession): Boolean {
val thisType = if (this is FirConstExpression<*>) {
this.resolvedType.classId
} else {
@@ -43,7 +45,7 @@ object RedundantCallOfConversionMethod : FirQualifiedAccessExpressionChecker() {
psi?.parent !is KtSafeQualifiedExpression
&& (psi is KtSafeQualifiedExpression || resolvedType.isMarkedNullable) -> null
this.resolvedType.isMarkedNullable -> null
else -> this.resolvedType.classId
else -> this.resolvedType.fullyExpandedClassId(session)
}
}
return thisType == qualifiedClassId