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,
|
context: CheckerContext,
|
||||||
reporter: DiagnosticReporter
|
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
|
// 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.
|
// explicit receiver. When we visit `T` (as a qualified access expression), we should not regard it as an expression here.
|
||||||
if (context.qualifiedAccessOrAnnotationCalls.size > 1 || context.getClassCalls.isNotEmpty()) return
|
val secondLast = context.qualifiedAccessOrAnnotationCalls.elementAtOrNull(context.qualifiedAccessOrAnnotationCalls.size - 2)
|
||||||
|
if (secondLast is FirQualifiedAccessExpression && secondLast.explicitReceiver == expression) return
|
||||||
|
|
||||||
val diagnostic = expression.typeRef.coneTypeParameterInQualifiedAccess ?: return
|
val diagnostic = expression.typeRef.coneTypeParameterInQualifiedAccess ?: return
|
||||||
val source = expression.source ?: return
|
val source = expression.source ?: return
|
||||||
|
|||||||
+11
@@ -16,4 +16,15 @@ fun test() {
|
|||||||
fun <T> bar() {
|
fun <T> bar() {
|
||||||
val typeParameter_as_val = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>
|
val typeParameter_as_val = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>
|
||||||
val typeParameter_as_fun = <!UNRESOLVED_REFERENCE!>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() {
|
fun <T> bar() {
|
||||||
val typeParameter_as_val = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>
|
val typeParameter_as_val = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>
|
||||||
val typeParameter_as_fun = <!RESOLUTION_TO_CLASSIFIER!>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
|
package
|
||||||
|
|
||||||
public fun </*0*/ T> bar(): kotlin.Unit
|
public fun </*0*/ T> bar(): kotlin.Unit
|
||||||
|
public fun baz(/*0*/ a: kotlin.Any): kotlin.Unit
|
||||||
public fun test(): kotlin.Unit
|
public fun test(): kotlin.Unit
|
||||||
|
|
||||||
public interface A {
|
public interface A {
|
||||||
|
|||||||
Reference in New Issue
Block a user