From 17da09bf174bc71be77aafdcbafa126639f74911 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 22 Jun 2023 16:45:05 +0200 Subject: [PATCH] K2: add ConeKotlinType argument for NULL_FOR_NONNULL_TYPE --- .../analysis/api/fir/diagnostics/KtFirDataClassConverters.kt | 1 + .../kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt | 1 + .../analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 1 + .../resolve/expresssions/invoke/threeReceiversCorrect.kt | 2 +- .../fir/checkers/generator/diagnostics/FirDiagnosticsList.kt | 4 +++- .../jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt | 2 +- .../org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt | 2 +- .../expression/FirFunctionReturnTypeMismatchChecker.kt | 2 +- .../fir/analysis/diagnostics/FirErrorsDefaultMessages.kt | 2 +- .../fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt | 2 +- .../src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt | 2 +- .../kotlin/fir/resolve/calls/ResolutionDiagnostic.kt | 2 +- compiler/testData/cli/jvm/firLightTreeOff.out | 2 +- compiler/testData/cli/jvm/firLightTreeOn.out | 2 +- 14 files changed, 16 insertions(+), 11 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 2f5314cb6b8..3b2115e2bcf 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -1718,6 +1718,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.NULL_FOR_NONNULL_TYPE) { firDiagnostic -> NullForNonnullTypeImpl( + firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index c43322da9d5..e5db667f0ee 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -1234,6 +1234,7 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { interface NullForNonnullType : KtFirDiagnostic { override val diagnosticClass get() = NullForNonnullType::class + val expectedType: KtType } interface InapplicableLateinitModifier : KtFirDiagnostic { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 6238d949756..8dd466e85fd 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -1479,6 +1479,7 @@ internal class ArgumentTypeMismatchImpl( ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.ArgumentTypeMismatch internal class NullForNonnullTypeImpl( + override val expectedType: KtType, firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.NullForNonnullType diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/invoke/threeReceiversCorrect.kt b/compiler/fir/analysis-tests/testData/resolve/expresssions/invoke/threeReceiversCorrect.kt index 1df176148c3..88dc6927cac 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/invoke/threeReceiversCorrect.kt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/invoke/threeReceiversCorrect.kt @@ -3,7 +3,7 @@ class C class B class A { - val B.foo: C.() -> Unit get() = null + val B.foo: C.() -> Unit get() = ")!>null } fun with(arg: T, f: T.() -> R): R = arg.f() diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 8b87332cf7a..0bc71fd4dcd 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -531,7 +531,9 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("isMismatchDueToNullability") } - val NULL_FOR_NONNULL_TYPE by error { } + val NULL_FOR_NONNULL_TYPE by error { + parameter("expectedType") + } val INAPPLICABLE_LATEINIT_MODIFIER by error(PositioningStrategy.LATEINIT_MODIFIER) { parameter("reason") diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 37219bf9e96..da5a5c60870 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -360,7 +360,7 @@ object FirErrors { val THROWABLE_TYPE_MISMATCH by error2() val CONDITION_TYPE_MISMATCH by error2() val ARGUMENT_TYPE_MISMATCH by error3() - val NULL_FOR_NONNULL_TYPE by error0() + val NULL_FOR_NONNULL_TYPE by error1() val INAPPLICABLE_LATEINIT_MODIFIER by error1(SourceElementPositioningStrategies.LATEINIT_MODIFIER) val VARARG_OUTSIDE_PARENTHESES by error0() val NAMED_ARGUMENTS_NOT_ALLOWED by error1(SourceElementPositioningStrategies.NAME_OF_NAMED_ARGUMENT) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index 5ccf81b8b09..07368669337 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -475,7 +475,7 @@ fun checkTypeMismatch( reporter.reportOn(assignment.source, FirErrors.SETTER_PROJECTED_OUT, resolvedSymbol, context) } rValue.isNullLiteral && lValueType.nullability == ConeNullability.NOT_NULL -> { - reporter.reportOn(rValue.source, FirErrors.NULL_FOR_NONNULL_TYPE, context) + reporter.reportOn(rValue.source, FirErrors.NULL_FOR_NONNULL_TYPE, lValueType, context) } isInitializer -> { reporter.reportOn( diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirFunctionReturnTypeMismatchChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirFunctionReturnTypeMismatchChecker.kt index 1d24280f113..512a5bbe732 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirFunctionReturnTypeMismatchChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirFunctionReturnTypeMismatchChecker.kt @@ -58,7 +58,7 @@ object FirFunctionReturnTypeMismatchChecker : FirReturnExpressionChecker() { if (!isSubtypeForTypeMismatch(typeContext, subtype = returnExpressionType, supertype = functionReturnType)) { if (resultExpression.isNullLiteral && functionReturnType.nullability == ConeNullability.NOT_NULL) { - reporter.reportOn(resultExpression.source, NULL_FOR_NONNULL_TYPE, context) + reporter.reportOn(resultExpression.source, NULL_FOR_NONNULL_TYPE, functionReturnType, context) } else { val isDueToNullability = context.session.typeContext.isTypeMismatchDueToNullability(returnExpressionType, functionReturnType) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index c4d9b19d7ae..f932f33841e 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -707,7 +707,7 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { map.put(INCORRECT_CHARACTER_LITERAL, "Incorrect character literal") map.put(TOO_MANY_CHARACTERS_IN_CHARACTER_LITERAL, "Too many characters in a character literal") map.put(ILLEGAL_ESCAPE, "Illegal escape") - map.put(NULL_FOR_NONNULL_TYPE, "Null can not be a value of a non-null type") + map.put(NULL_FOR_NONNULL_TYPE, "Null can not be a value of a non-null type ''{0}''", RENDER_TYPE) // Unresolved map.put(INVISIBLE_REFERENCE, "Cannot access ''{0}'': it is {1} in {2}", SYMBOL, VISIBILITY, NAME_OF_DECLARATION_OR_FILE) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index fbc507c952e..017387ee586 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -271,7 +271,7 @@ private fun mapInapplicableCandidateError( ) is NullForNotNullType -> FirErrors.NULL_FOR_NONNULL_TYPE.createOn( - rootCause.argument.source ?: source + rootCause.argument.source ?: source, rootCause.expectedType.removeTypeVariableTypes(typeContext) ) is NonVarargSpread -> FirErrors.NON_VARARG_SPREAD.createOn(rootCause.argument.source?.getChild(KtTokens.MUL, depth = 1)!!) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt index 742f22bc2cc..b4f572b7e29 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt @@ -345,7 +345,7 @@ private fun checkApplicabilityForArgumentType( fun subtypeError(actualExpectedType: ConeKotlinType): ResolutionDiagnostic { if (argument.isNullLiteral && actualExpectedType.nullability == ConeNullability.NOT_NULL) { - return NullForNotNullType(argument) + return NullForNotNullType(argument, actualExpectedType) } fun tryGetConeTypeThatCompatibleWithKtType(type: ConeKotlinType): ConeKotlinType { diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt index 9d886f5fb36..6b02a9152e9 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt @@ -112,7 +112,7 @@ class ArgumentTypeMismatch( ) : ResolutionDiagnostic(INAPPLICABLE) class NullForNotNullType( - val argument: FirExpression + val argument: FirExpression, val expectedType: ConeKotlinType ) : ResolutionDiagnostic(INAPPLICABLE) class ManyLambdaExpressionArguments( diff --git a/compiler/testData/cli/jvm/firLightTreeOff.out b/compiler/testData/cli/jvm/firLightTreeOff.out index 5119a334a5b..fdbf44445fe 100644 --- a/compiler/testData/cli/jvm/firLightTreeOff.out +++ b/compiler/testData/cli/jvm/firLightTreeOff.out @@ -8,7 +8,7 @@ compiler/testData/cli/jvm/firLightTree.kt:3:15: error: classifier 'class System compiler/testData/cli/jvm/firLightTree.kt:3:15: error: variable expected java.lang.System = null ^ -compiler/testData/cli/jvm/firLightTree.kt:3:24: error: null can not be a value of a non-null type +compiler/testData/cli/jvm/firLightTree.kt:3:24: error: null can not be a value of a non-null type 'kotlin/Unit' java.lang.System = null ^ COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/firLightTreeOn.out b/compiler/testData/cli/jvm/firLightTreeOn.out index 5119a334a5b..fdbf44445fe 100644 --- a/compiler/testData/cli/jvm/firLightTreeOn.out +++ b/compiler/testData/cli/jvm/firLightTreeOn.out @@ -8,7 +8,7 @@ compiler/testData/cli/jvm/firLightTree.kt:3:15: error: classifier 'class System compiler/testData/cli/jvm/firLightTree.kt:3:15: error: variable expected java.lang.System = null ^ -compiler/testData/cli/jvm/firLightTree.kt:3:24: error: null can not be a value of a non-null type +compiler/testData/cli/jvm/firLightTree.kt:3:24: error: null can not be a value of a non-null type 'kotlin/Unit' java.lang.System = null ^ COMPILATION_ERROR