diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirClassLiteralChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirClassLiteralChecker.kt index ad29285e43f..7e0cf9fbc58 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirClassLiteralChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirClassLiteralChecker.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.references.toResolvedTypeParameterSymbol +import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.scopes.impl.toConeType import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol @@ -73,7 +74,7 @@ object FirClassLiteralChecker : FirGetClassCallChecker() { if (argument !is FirResolvedQualifier) return // TODO: differentiate RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS - if (argument.typeArguments.isNotEmpty() && !argument.typeRef.coneType.isAllowedInClassLiteral(context)) { + if (argument.typeArguments.isNotEmpty() && !argument.typeRef.coneType.fullyExpandedType(context.session).isAllowedInClassLiteral(context)) { val symbol = argument.symbol symbol?.lazyResolveToPhase(FirResolvePhase.TYPES) @OptIn(SymbolInternals::class) @@ -81,7 +82,9 @@ object FirClassLiteralChecker : FirGetClassCallChecker() { // Among type parameter references, only count actual type parameter while discarding [FirOuterClassTypeParameterRef] val expectedTypeArgumentSize = typeParameters?.count { it is FirTypeParameter } ?: 0 if (expectedTypeArgumentSize != argument.typeArguments.size) { - // Will be reported as WRONG_NUMBER_OF_TYPE_ARGUMENTS + if (symbol != null) { + reporter.reportOn(argument.source, FirErrors.WRONG_NUMBER_OF_TYPE_ARGUMENTS, expectedTypeArgumentSize, symbol, context) + } return } reporter.reportOn(source, FirErrors.CLASS_LITERAL_LHS_NOT_A_CLASS, context) diff --git a/compiler/testData/diagnostics/tests/classLiteral/parameterizedTypeAlias.fir.kt b/compiler/testData/diagnostics/tests/classLiteral/parameterizedTypeAlias.fir.kt index cfa4c0ba0d1..8de1880203a 100644 --- a/compiler/testData/diagnostics/tests/classLiteral/parameterizedTypeAlias.fir.kt +++ b/compiler/testData/diagnostics/tests/classLiteral/parameterizedTypeAlias.fir.kt @@ -26,7 +26,7 @@ fun test() { Some::class SomeAlias::class - SomeAlias::class + SomeAlias::class MyPair::class MyPair::class @@ -50,12 +50,12 @@ fun test() { Array<*>::class SimpleArrayAlias::class - SimpleArrayAlias::class + SimpleArrayAlias::class SimpleArrayAlias<*>::class SpecificArrayAlias::class UnusedArrayAlias::class - UnusedArrayAlias::class - UnusedArrayAlias<*>::class + UnusedArrayAlias::class + UnusedArrayAlias<*>::class }