[FIR] Expand typealiases before checking type of class literal
This commit is contained in:
committed by
Space Team
parent
6c7eb0167c
commit
0f0f0d604f
+5
-2
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.references.toResolvedTypeParameterSymbol
|
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.scopes.impl.toConeType
|
||||||
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||||
@@ -73,7 +74,7 @@ object FirClassLiteralChecker : FirGetClassCallChecker() {
|
|||||||
|
|
||||||
if (argument !is FirResolvedQualifier) return
|
if (argument !is FirResolvedQualifier) return
|
||||||
// TODO: differentiate RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS
|
// 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
|
val symbol = argument.symbol
|
||||||
symbol?.lazyResolveToPhase(FirResolvePhase.TYPES)
|
symbol?.lazyResolveToPhase(FirResolvePhase.TYPES)
|
||||||
@OptIn(SymbolInternals::class)
|
@OptIn(SymbolInternals::class)
|
||||||
@@ -81,7 +82,9 @@ object FirClassLiteralChecker : FirGetClassCallChecker() {
|
|||||||
// Among type parameter references, only count actual type parameter while discarding [FirOuterClassTypeParameterRef]
|
// Among type parameter references, only count actual type parameter while discarding [FirOuterClassTypeParameterRef]
|
||||||
val expectedTypeArgumentSize = typeParameters?.count { it is FirTypeParameter } ?: 0
|
val expectedTypeArgumentSize = typeParameters?.count { it is FirTypeParameter } ?: 0
|
||||||
if (expectedTypeArgumentSize != argument.typeArguments.size) {
|
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
|
return
|
||||||
}
|
}
|
||||||
reporter.reportOn(source, FirErrors.CLASS_LITERAL_LHS_NOT_A_CLASS, context)
|
reporter.reportOn(source, FirErrors.CLASS_LITERAL_LHS_NOT_A_CLASS, context)
|
||||||
|
|||||||
+4
-4
@@ -26,7 +26,7 @@ fun test() {
|
|||||||
|
|
||||||
Some::class
|
Some::class
|
||||||
SomeAlias::class
|
SomeAlias::class
|
||||||
<!CLASS_LITERAL_LHS_NOT_A_CLASS!>SomeAlias<String>::class<!>
|
SomeAlias<String>::class
|
||||||
|
|
||||||
MyPair::class
|
MyPair::class
|
||||||
<!CLASS_LITERAL_LHS_NOT_A_CLASS!>MyPair<Int, Int>::class<!>
|
<!CLASS_LITERAL_LHS_NOT_A_CLASS!>MyPair<Int, Int>::class<!>
|
||||||
@@ -50,12 +50,12 @@ fun test() {
|
|||||||
<!CLASS_LITERAL_LHS_NOT_A_CLASS!>Array<*>::class<!>
|
<!CLASS_LITERAL_LHS_NOT_A_CLASS!>Array<*>::class<!>
|
||||||
|
|
||||||
SimpleArrayAlias::class
|
SimpleArrayAlias::class
|
||||||
<!CLASS_LITERAL_LHS_NOT_A_CLASS!>SimpleArrayAlias<Int>::class<!>
|
SimpleArrayAlias<Int>::class
|
||||||
<!CLASS_LITERAL_LHS_NOT_A_CLASS!>SimpleArrayAlias<*>::class<!>
|
<!CLASS_LITERAL_LHS_NOT_A_CLASS!>SimpleArrayAlias<*>::class<!>
|
||||||
|
|
||||||
SpecificArrayAlias::class
|
SpecificArrayAlias::class
|
||||||
|
|
||||||
UnusedArrayAlias::class
|
UnusedArrayAlias::class
|
||||||
<!CLASS_LITERAL_LHS_NOT_A_CLASS!>UnusedArrayAlias<Int>::class<!>
|
UnusedArrayAlias<Int>::class
|
||||||
<!CLASS_LITERAL_LHS_NOT_A_CLASS!>UnusedArrayAlias<*>::class<!>
|
UnusedArrayAlias<*>::class
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user