From 69d2b94a682a0e89b292dffb369f6d69cf7c7ccf Mon Sep 17 00:00:00 2001 From: Vladimir Sukharev Date: Mon, 9 Oct 2023 18:06:26 +0200 Subject: [PATCH] [FIR] Fix Disappeared NULLABLE_TYPE_IN_CLASS_LITERAL_LHS ^KT-59970 Fixed --- .../checkers/expression/FirClassLiteralChecker.kt | 8 ++++---- .../diagnostics/tests/classLiteral/typealiases.fir.kt | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) 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 3fb13cd7db0..be40ae35c2b 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 @@ -50,10 +50,11 @@ object FirClassLiteralChecker : FirGetClassCallChecker() { // // Only the 2nd example is valid, and we want to check if token type QUEST doesn't exist at the same level as COLONCOLON. val markedNullable = source.getChild(QUEST, depth = 1) != null + val resolvedFullyExpandedType = argument.resolvedType.fullyExpandedType(context.session) val isNullable = markedNullable || (argument as? FirResolvedQualifier)?.isNullableLHSForCallableReference == true || - argument.resolvedType.isMarkedNullable || - argument.resolvedType.isNullableTypeParameter(context.session.typeContext) + resolvedFullyExpandedType.isMarkedNullable || + resolvedFullyExpandedType.isNullableTypeParameter(context.session.typeContext) if (isNullable) { if (argument.canBeDoubleColonLHSAsType) { reporter.reportOn(source, FirErrors.NULLABLE_TYPE_IN_CLASS_LITERAL_LHS, context) @@ -77,8 +78,7 @@ object FirClassLiteralChecker : FirGetClassCallChecker() { if (argument !is FirResolvedQualifier) return // TODO, KT-59835: differentiate RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS - if (argument.typeArguments.isNotEmpty() && !argument.resolvedType.fullyExpandedType(context.session) - .isAllowedInClassLiteral(context)) { + if (argument.typeArguments.isNotEmpty() && !resolvedFullyExpandedType.isAllowedInClassLiteral(context)) { val symbol = argument.symbol symbol?.lazyResolveToPhase(FirResolvePhase.TYPES) @OptIn(SymbolInternals::class) diff --git a/compiler/testData/diagnostics/tests/classLiteral/typealiases.fir.kt b/compiler/testData/diagnostics/tests/classLiteral/typealiases.fir.kt index 65512e40add..4988571835d 100644 --- a/compiler/testData/diagnostics/tests/classLiteral/typealiases.fir.kt +++ b/compiler/testData/diagnostics/tests/classLiteral/typealiases.fir.kt @@ -2,11 +2,11 @@ typealias TString = String fun f1() = TString::class typealias TNullableString = String? -fun f2() = TNullableString::class +fun f2() = TNullableString::class typealias TNullableTString = TString? typealias TTNullableTString = TNullableTString -fun f3() = TTNullableTString::class +fun f3() = TTNullableTString::class inline fun f4(b: Boolean): Any { typealias X = T