From d951e957ea946727e86f28dfca484f157beb4208 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 1 Jun 2017 14:42:13 +0300 Subject: [PATCH] Support lateinit modifier on top-level properties Allow lateinit modifier on top-level properties. Modifiers 'lateinit' and 'header' are incompatible. --- .../kotlin/resolve/ModifiersChecker.kt | 5 ++++- .../tests/lateinit/modifierApplicability.kt | 4 ++-- .../differentKindsOfProperties.kt | 2 +- .../tests/properties/lateinitOnTopLevel.kt | 12 ++++++++++++ .../tests/properties/lateinitOnTopLevel.txt | 17 +++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 ++++++ 6 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/properties/lateinitOnTopLevel.kt create mode 100644 compiler/testData/diagnostics/tests/properties/lateinitOnTopLevel.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index 02de5e34193..0c44ece2ff0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -74,7 +74,7 @@ object ModifierCheckerCore { REIFIED_KEYWORD to EnumSet.of(TYPE_PARAMETER), VARARG_KEYWORD to EnumSet.of(VALUE_PARAMETER, PROPERTY_PARAMETER), COMPANION_KEYWORD to EnumSet.of(OBJECT), - LATEINIT_KEYWORD to EnumSet.of(MEMBER_PROPERTY, LOCAL_VARIABLE), + LATEINIT_KEYWORD to EnumSet.of(MEMBER_PROPERTY, TOP_LEVEL_PROPERTY, LOCAL_VARIABLE), DATA_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS), INLINE_KEYWORD to EnumSet.of(FUNCTION, PROPERTY, PROPERTY_GETTER, PROPERTY_SETTER), NOINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER), @@ -166,6 +166,9 @@ object ModifierCheckerCore { // (see the KEEP https://github.com/Kotlin/KEEP/blob/master/proposals/sealed-class-inheritance.md) result += incompatibilityRegister(SEALED_KEYWORD, INNER_KEYWORD) + // lateinit is incompatible with header + result += incompatibilityRegister(LATEINIT_KEYWORD, HEADER_KEYWORD) + return result } diff --git a/compiler/testData/diagnostics/tests/lateinit/modifierApplicability.kt b/compiler/testData/diagnostics/tests/lateinit/modifierApplicability.kt index 2370a79616d..b366d0e4054 100644 --- a/compiler/testData/diagnostics/tests/lateinit/modifierApplicability.kt +++ b/compiler/testData/diagnostics/tests/lateinit/modifierApplicability.kt @@ -46,8 +46,8 @@ public abstract class A(la lateinit var String.e12: String } -lateinit val topLevel: String -lateinit var topLevelMutable: String +lateinit val topLevel: String +lateinit var topLevelMutable: String public interface Intf { lateinit var str: String diff --git a/compiler/testData/diagnostics/tests/multiplatform/topLevelProperty/differentKindsOfProperties.kt b/compiler/testData/diagnostics/tests/multiplatform/topLevelProperty/differentKindsOfProperties.kt index af29c49d2f1..4b228abcb8e 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/topLevelProperty/differentKindsOfProperties.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/topLevelProperty/differentKindsOfProperties.kt @@ -28,7 +28,7 @@ header var customAccessorVar: String header const val constVal: Int -header lateinit var lateinitVar: String +header lateinit var lateinitVar: String header val delegated: String by Delegate object Delegate { operator fun getValue(x: Any?, y: Any?): String = "" } diff --git a/compiler/testData/diagnostics/tests/properties/lateinitOnTopLevel.kt b/compiler/testData/diagnostics/tests/properties/lateinitOnTopLevel.kt new file mode 100644 index 00000000000..754b4effd19 --- /dev/null +++ b/compiler/testData/diagnostics/tests/properties/lateinitOnTopLevel.kt @@ -0,0 +1,12 @@ +object Delegate { + operator fun getValue(instance: Any?, property: Any) : String = "" + operator fun setValue(instance: Any?, property: Any, value: String) {} +} + +lateinit var testOk: String + +lateinit val testErr0: Any +lateinit var testErr1: Int +lateinit var testErr2: Any? +lateinit var testErr3: String = "" +lateinit var testErr4 by Delegate diff --git a/compiler/testData/diagnostics/tests/properties/lateinitOnTopLevel.txt b/compiler/testData/diagnostics/tests/properties/lateinitOnTopLevel.txt new file mode 100644 index 00000000000..62155a2947c --- /dev/null +++ b/compiler/testData/diagnostics/tests/properties/lateinitOnTopLevel.txt @@ -0,0 +1,17 @@ +package + +public lateinit val testErr0: kotlin.Any +public lateinit var testErr1: kotlin.Int +public lateinit var testErr2: kotlin.Any? +public lateinit var testErr3: kotlin.String +public lateinit var testErr4: kotlin.String +public lateinit var testOk: kotlin.String + +public object Delegate { + private constructor Delegate() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final operator fun getValue(/*0*/ instance: kotlin.Any?, /*1*/ property: kotlin.Any): kotlin.String + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final operator fun setValue(/*0*/ instance: kotlin.Any?, /*1*/ property: kotlin.Any, /*2*/ value: kotlin.String): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 5f30bf47cf8..3ff89c673e6 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -16174,6 +16174,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("lateinitOnTopLevel.kt") + public void testLateinitOnTopLevel() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/properties/lateinitOnTopLevel.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/diagnostics/tests/properties/inferenceFromGetters") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)