FIR: Report missing cases of TYPE_PARAMETER_IS_NOT_AN_EXPRESSION

^KT-55699 Fixed
This commit is contained in:
Kirill Rakhman
2023-01-27 12:16:55 +01:00
committed by Space Team
parent e4529f38ac
commit 836c4fcefd
4 changed files with 30 additions and 3 deletions
@@ -27,10 +27,14 @@ object FirTypeParameterInQualifiedAccessChecker : FirQualifiedAccessExpressionCh
context: CheckerContext,
reporter: DiagnosticReporter
) {
// Make sure the current qualified access is not part of another qualified access or class literals.
// Ignore T::class where our expression is T
if (context.getClassCalls.lastOrNull()?.argument == expression) return
// Make sure the current expression is not the receiver of a qualified access expression.
// E.g., for `T::toString`, which is a callable reference (a subtype of qualified access), type parameter T is checked once as an
// explicit receiver (or LHS). When we visit `T` (as a qualified access), we should not regard it as an expression here.
if (context.qualifiedAccessOrAnnotationCalls.size > 1 || context.getClassCalls.isNotEmpty()) return
// explicit receiver. When we visit `T` (as a qualified access expression), we should not regard it as an expression here.
val secondLast = context.qualifiedAccessOrAnnotationCalls.elementAtOrNull(context.qualifiedAccessOrAnnotationCalls.size - 2)
if (secondLast is FirQualifiedAccessExpression && secondLast.explicitReceiver == expression) return
val diagnostic = expression.typeRef.coneTypeParameterInQualifiedAccess ?: return
val source = expression.source ?: return
@@ -16,4 +16,15 @@ fun test() {
fun <T> bar() {
val typeParameter_as_val = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>
val typeParameter_as_fun = <!UNRESOLVED_REFERENCE!>T<!>()
baz(<!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>)
baz("$<!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>")
1 <!OVERLOAD_RESOLUTION_AMBIGUITY!>+<!> <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>
B::class.equals(<!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>)
T = ""
}
fun baz(a: Any) {}
@@ -16,4 +16,15 @@ fun test() {
fun <T> bar() {
val typeParameter_as_val = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>
val typeParameter_as_fun = <!RESOLUTION_TO_CLASSIFIER!>T<!>()
baz(<!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>)
baz("$<!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>")
1 + <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>
B::class.equals(<!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>)
<!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!> = ""
}
fun baz(a: Any) {}
@@ -1,6 +1,7 @@
package
public fun </*0*/ T> bar(): kotlin.Unit
public fun baz(/*0*/ a: kotlin.Any): kotlin.Unit
public fun test(): kotlin.Unit
public interface A {