FIR: Report missing cases of TYPE_PARAMETER_IS_NOT_AN_EXPRESSION
^KT-55699 Fixed
This commit is contained in:
committed by
Space Team
parent
e4529f38ac
commit
836c4fcefd
+7
-3
@@ -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
|
||||
|
||||
+11
@@ -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) {}
|
||||
|
||||
+11
@@ -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
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user