From 081b7320700ec2400bba769559ec346d360ca1a7 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Tue, 5 Sep 2017 14:32:20 +0300 Subject: [PATCH] Improve diagnostics for `lateinit` properties with generic type #KT-11834 Fixed --- .../kotlin/resolve/LateinitModifierApplicabilityChecker.kt | 5 ++++- .../lateinitOfATypeWithNullableUpperBound.kt | 3 +++ .../jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 idea/testData/checker/diagnosticsMessage/lateinitOfATypeWithNullableUpperBound.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt index 5c1d0da97fa..04164a4174a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt @@ -45,9 +45,12 @@ object LateinitModifierApplicabilityChecker { trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is allowed only on mutable $variables")) } - if (TypeUtils.isNullableType(type)) { + if (type.isMarkedNullable) { trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on $variables of nullable types")) } + else if (TypeUtils.isNullableType(type)) { + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on $variables of a type with nullable upper bound")) + } if (KotlinBuiltIns.isPrimitiveType(type)) { trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on $variables of primitive types")) diff --git a/idea/testData/checker/diagnosticsMessage/lateinitOfATypeWithNullableUpperBound.kt b/idea/testData/checker/diagnosticsMessage/lateinitOfATypeWithNullableUpperBound.kt new file mode 100644 index 00000000000..fed09f7e74c --- /dev/null +++ b/idea/testData/checker/diagnosticsMessage/lateinitOfATypeWithNullableUpperBound.kt @@ -0,0 +1,3 @@ +class C() { + lateinit var item: V +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java index 9e1920fc264..53da4bb1095 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java @@ -1004,6 +1004,12 @@ public class PsiCheckerTestGenerated extends AbstractPsiCheckerTest { doTest(fileName); } + @TestMetadata("lateinitOfATypeWithNullableUpperBound.kt") + public void testLateinitOfATypeWithNullableUpperBound() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/diagnosticsMessage/lateinitOfATypeWithNullableUpperBound.kt"); + doTest(fileName); + } + @TestMetadata("nArgumentsExpectedMessage.kt") public void testNArgumentsExpectedMessage() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/diagnosticsMessage/nArgumentsExpectedMessage.kt");