[FIR] Add diagnostic INAPPLICABLE_LATEINIT_MODIFIER + some builtin types

This commit is contained in:
Nick
2020-08-14 11:36:14 +03:00
parent 091e12c093
commit 7e1c2cfd36
21 changed files with 399 additions and 45 deletions
@@ -0,0 +1,38 @@
object Delegate {
operator fun getValue(instance: Any?, property: Any) : String = ""
operator fun setValue(instance: Any?, property: Any, value: String) {}
}
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var test: Int<!>
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var kest by Delegate<!>
lateinit var good: String
class A {
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val fest = "10"<!>
lateinit var mest: String
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var xest: String?<!>
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var nest: Int<!>
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var west: Char<!>
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var qest: Boolean<!>
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var aest: Short<!>
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var hest: Byte<!>
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var jest: Long<!>
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val dest: String
get() = "KEKER"<!>
}
class B<T> {
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var best: T<!>
}
class C<K : Any> {
lateinit var pest: K
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var vest: K?<!>
}
fun rest() {
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var i: Int<!>
lateinit var a: A
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var b: B<String> = B()<!>
}
@@ -0,0 +1,102 @@
FILE: inapplicableLateinitModifier.kt
public final object Delegate : R|kotlin/Any| {
private constructor(): R|Delegate| {
super<R|kotlin/Any|>()
}
public final operator fun getValue(instance: R|kotlin/Any?|, property: R|kotlin/Any|): R|kotlin/String| {
^getValue String()
}
public final operator fun setValue(instance: R|kotlin/Any?|, property: R|kotlin/Any|, value: R|kotlin/String|): R|kotlin/Unit| {
}
}
public final lateinit var test: R|kotlin/Int|
public get(): R|kotlin/Int|
public set(value: R|kotlin/Int|): R|kotlin/Unit|
public final lateinit var kest: R|kotlin/String|by Q|Delegate|
public get(): R|kotlin/String| {
^ D|/kest|.R|/Delegate.getValue|(Null(null), ::R|/kest|)
}
public set(<set-?>: R|kotlin/String|): R|kotlin/Unit| {
D|/kest|.R|/Delegate.setValue|(Null(null), ::R|/kest|, R|<local>/kest|)
}
public final lateinit var good: R|kotlin/String|
public get(): R|kotlin/String|
public set(value: R|kotlin/String|): R|kotlin/Unit|
public final class A : R|kotlin/Any| {
public constructor(): R|A| {
super<R|kotlin/Any|>()
}
public final lateinit val fest: R|kotlin/String| = String(10)
public get(): R|kotlin/String|
public final lateinit var mest: R|kotlin/String|
public get(): R|kotlin/String|
public set(value: R|kotlin/String|): R|kotlin/Unit|
public final lateinit var xest: R|kotlin/String?|
public get(): R|kotlin/String?|
public set(value: R|kotlin/String?|): R|kotlin/Unit|
public final lateinit var nest: R|kotlin/Int|
public get(): R|kotlin/Int|
public set(value: R|kotlin/Int|): R|kotlin/Unit|
public final lateinit var west: R|kotlin/Char|
public get(): R|kotlin/Char|
public set(value: R|kotlin/Char|): R|kotlin/Unit|
public final lateinit var qest: R|kotlin/Boolean|
public get(): R|kotlin/Boolean|
public set(value: R|kotlin/Boolean|): R|kotlin/Unit|
public final lateinit var aest: R|kotlin/Short|
public get(): R|kotlin/Short|
public set(value: R|kotlin/Short|): R|kotlin/Unit|
public final lateinit var hest: R|kotlin/Byte|
public get(): R|kotlin/Byte|
public set(value: R|kotlin/Byte|): R|kotlin/Unit|
public final lateinit var jest: R|kotlin/Long|
public get(): R|kotlin/Long|
public set(value: R|kotlin/Long|): R|kotlin/Unit|
public final lateinit val dest: R|kotlin/String|
public get(): R|kotlin/String| {
^ String(KEKER)
}
}
public final class B<T> : R|kotlin/Any| {
public constructor<T>(): R|B<T>| {
super<R|kotlin/Any|>()
}
public final lateinit var best: R|T|
public get(): R|T|
public set(value: R|T|): R|kotlin/Unit|
}
public final class C<K : R|kotlin/Any|> : R|kotlin/Any| {
public constructor<K : R|kotlin/Any|>(): R|C<K>| {
super<R|kotlin/Any|>()
}
public final lateinit var pest: R|K|
public get(): R|K|
public set(value: R|K|): R|kotlin/Unit|
public final lateinit var vest: R|K?|
public get(): R|K?|
public set(value: R|K?|): R|kotlin/Unit|
}
public final fun rest(): R|kotlin/Unit| {
lateinit lvar i: R|kotlin/Int|
lateinit lvar a: R|A|
lateinit lvar b: R|B<kotlin/String>| = R|/B.B|<R|kotlin/String|>()
}
@@ -15,7 +15,7 @@ class SomeClass : SomeInterface {
get() = true get() = true
set(value) {} set(value) {}
lateinit var fau: Double <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var fau: Double<!>
} }
inline class InlineClass inline class InlineClass
@@ -961,6 +961,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest {
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/explicitDelegationCallRequired.kt"); runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/explicitDelegationCallRequired.kt");
} }
@TestMetadata("inapplicableLateinitModifier.kt")
public void testInapplicableLateinitModifier() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/inapplicableLateinitModifier.kt");
}
@TestMetadata("incompatibleModifiers.kt") @TestMetadata("incompatibleModifiers.kt")
public void testIncompatibleModifiers() throws Exception { public void testIncompatibleModifiers() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.kt"); runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.kt");
@@ -961,6 +961,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/explicitDelegationCallRequired.kt"); runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/explicitDelegationCallRequired.kt");
} }
@TestMetadata("inapplicableLateinitModifier.kt")
public void testInapplicableLateinitModifier() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/inapplicableLateinitModifier.kt");
}
@TestMetadata("incompatibleModifiers.kt") @TestMetadata("incompatibleModifiers.kt")
public void testIncompatibleModifiers() throws Exception { public void testIncompatibleModifiers() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.kt"); runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.kt");
@@ -39,6 +39,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
FirInterfaceWithSuperclassChecker, FirInterfaceWithSuperclassChecker,
FirEnumClassSimpleChecker, FirEnumClassSimpleChecker,
FirSealedSupertypeChecker, FirSealedSupertypeChecker,
FirInapplicableLateinitChecker,
) )
override val regularClassCheckers: List<FirRegularClassChecker> = listOf( override val regularClassCheckers: List<FirRegularClassChecker> = listOf(
@@ -0,0 +1,79 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.ConeTypeParameterType
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.types.isNullable
object FirInapplicableLateinitChecker : FirMemberDeclarationChecker() {
var primitives: Set<ConeKotlinType>? = null
private fun getPrimitiveTypes(context: CheckerContext) = primitives ?: mutableSetOf<ConeKotlinType>().apply {
with(context.session.builtinTypes) {
add(intType.coneType)
add(booleanType.coneType)
add(charType.coneType)
add(shortType.coneType)
add(byteType.coneType)
add(longType.coneType)
add(doubleType.coneType)
add(floatType.coneType)
}
primitives = this
}
override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration !is FirProperty || !declaration.isLateInit) {
return
}
when {
declaration.isVal ->
reporter.report(declaration.source, "is allowed only on mutable properties")
declaration.initializer != null -> if (declaration.isLocal) {
reporter.report(declaration.source, "is not allowed on local variables with initializer")
} else {
reporter.report(declaration.source, "is not allowed on properties with initializer")
}
declaration.delegate != null ->
reporter.report(declaration.source, "is not allowed on delegated properties")
declaration.isNullable() ->
reporter.report(declaration.source, "is not allowed on properties of a type with nullable upper bound")
declaration.returnTypeRef.coneType in getPrimitiveTypes(context) -> if (declaration.isLocal) {
reporter.report(declaration.source, "is not allowed on local variables of primitive types")
} else {
reporter.report(declaration.source, "is not allowed on properties of primitive types")
}
declaration.hasGetter() || declaration.hasSetter() ->
reporter.report(declaration.source, "is not allowed on properties with a custom getter or setter")
}
}
private fun FirProperty.isNullable() = when (val type = returnTypeRef.coneType) {
is ConeTypeParameterType -> type.isNullable || type.lookupTag.typeParameterSymbol.fir.bounds.any { it.coneType.isNullable }
else -> type.isNullable
}
private fun FirProperty.hasGetter() = getter != null && getter?.source != null && getter?.source?.kind !is FirFakeSourceElementKind
private fun FirProperty.hasSetter() = setter != null && setter?.source != null && setter?.source?.kind !is FirFakeSourceElementKind
private fun DiagnosticReporter.report(source: FirSourceElement?, target: String) {
source?.let { report(FirErrors.INAPPLICABLE_LATEINIT_MODIFIER.on(it, target)) }
}
}
@@ -50,6 +50,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ILLEGAL_CONST_EXP
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ILLEGAL_UNDERSCORE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ILLEGAL_UNDERSCORE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_CANDIDATE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_CANDIDATE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_INFIX_MODIFIER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_INFIX_MODIFIER
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_LATEINIT_MODIFIER
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INCOMPATIBLE_MODIFIERS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INCOMPATIBLE_MODIFIERS
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INFERENCE_ERROR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INFERENCE_ERROR
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INTERFACE_WITH_SUPERCLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INTERFACE_WITH_SUPERCLASS
@@ -234,6 +235,7 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension {
// Applicability // Applicability
map.put(NONE_APPLICABLE, "None of the following functions are applicable: {0}", SYMBOLS) map.put(NONE_APPLICABLE, "None of the following functions are applicable: {0}", SYMBOLS)
map.put(INAPPLICABLE_CANDIDATE, "Inapplicable candidate(s): {0}", SYMBOL) map.put(INAPPLICABLE_CANDIDATE, "Inapplicable candidate(s): {0}", SYMBOL)
map.put(INAPPLICABLE_LATEINIT_MODIFIER, "''lateinit'' modifier {0}", TO_STRING)
// Ambiguity // Ambiguity
map.put(AMBIGUITY, "Ambiguity between candidates: {0}", SYMBOLS) map.put(AMBIGUITY, "Ambiguity between candidates: {0}", SYMBOLS)
@@ -108,6 +108,7 @@ object FirErrors {
// Applicability // Applicability
val NONE_APPLICABLE by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>() val NONE_APPLICABLE by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>()
val INAPPLICABLE_CANDIDATE by error1<FirSourceElement, PsiElement, AbstractFirBasedSymbol<*>>() val INAPPLICABLE_CANDIDATE by error1<FirSourceElement, PsiElement, AbstractFirBasedSymbol<*>>()
val INAPPLICABLE_LATEINIT_MODIFIER by error1<FirSourceElement, PsiElement, String>()
// Ambiguity // Ambiguity
val AMBIGUITY by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>() val AMBIGUITY by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>()
@@ -54,8 +54,14 @@ class BuiltinTypes {
val enumType: FirImplicitBuiltinTypeRef = FirImplicitEnumTypeRef(null) val enumType: FirImplicitBuiltinTypeRef = FirImplicitEnumTypeRef(null)
val annotationType: FirImplicitBuiltinTypeRef = FirImplicitAnnotationTypeRef(null) val annotationType: FirImplicitBuiltinTypeRef = FirImplicitAnnotationTypeRef(null)
val booleanType: FirImplicitBuiltinTypeRef = FirImplicitBooleanTypeRef(null) val booleanType: FirImplicitBuiltinTypeRef = FirImplicitBooleanTypeRef(null)
val byteType: FirImplicitBuiltinTypeRef = FirImplicitByteTypeRef(null)
val shortType: FirImplicitBuiltinTypeRef = FirImplicitShortTypeRef(null)
val intType: FirImplicitBuiltinTypeRef = FirImplicitIntTypeRef(null) val intType: FirImplicitBuiltinTypeRef = FirImplicitIntTypeRef(null)
val longType: FirImplicitBuiltinTypeRef = FirImplicitLongTypeRef(null)
val doubleType: FirImplicitBuiltinTypeRef = FirImplicitDoubleTypeRef(null)
val floatType: FirImplicitBuiltinTypeRef = FirImplicitFloatTypeRef(null)
val nothingType: FirImplicitBuiltinTypeRef = FirImplicitNothingTypeRef(null) val nothingType: FirImplicitBuiltinTypeRef = FirImplicitNothingTypeRef(null)
val nullableNothingType: FirImplicitBuiltinTypeRef = FirImplicitNullableNothingTypeRef(null) val nullableNothingType: FirImplicitBuiltinTypeRef = FirImplicitNullableNothingTypeRef(null)
val charType: FirImplicitBuiltinTypeRef = FirImplicitCharTypeRef(null)
val stringType: FirImplicitBuiltinTypeRef = FirImplicitStringTypeRef(null) val stringType: FirImplicitBuiltinTypeRef = FirImplicitStringTypeRef(null)
} }
@@ -72,10 +72,30 @@ class FirImplicitBooleanTypeRef(
source: FirSourceElement? source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Boolean) ) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Boolean)
class FirImplicitByteTypeRef(
source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Byte)
class FirImplicitShortTypeRef(
source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Short)
class FirImplicitIntTypeRef( class FirImplicitIntTypeRef(
source: FirSourceElement? source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Int) ) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Int)
class FirImplicitLongTypeRef(
source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Long)
class FirImplicitDoubleTypeRef(
source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Double)
class FirImplicitFloatTypeRef(
source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Float)
class FirImplicitNothingTypeRef( class FirImplicitNothingTypeRef(
source: FirSourceElement? source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Nothing) ) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Nothing)
@@ -84,6 +104,10 @@ class FirImplicitNullableNothingTypeRef(
source: FirSourceElement? source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Nothing, isNullable = true) ) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Nothing, isNullable = true)
class FirImplicitCharTypeRef(
source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Char)
class FirImplicitStringTypeRef( class FirImplicitStringTypeRef(
source: FirSourceElement? source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.String) ) : FirImplicitBuiltinTypeRef(source, StandardClassIds.String)
@@ -146,9 +170,15 @@ fun FirImplicitBuiltinTypeRef.withFakeSource(kind: FirFakeSourceElementKind): Fi
is FirImplicitEnumTypeRef -> FirImplicitEnumTypeRef(newSource) is FirImplicitEnumTypeRef -> FirImplicitEnumTypeRef(newSource)
is FirImplicitAnnotationTypeRef -> FirImplicitAnnotationTypeRef(newSource) is FirImplicitAnnotationTypeRef -> FirImplicitAnnotationTypeRef(newSource)
is FirImplicitBooleanTypeRef -> FirImplicitBooleanTypeRef(newSource) is FirImplicitBooleanTypeRef -> FirImplicitBooleanTypeRef(newSource)
is FirImplicitByteTypeRef -> FirImplicitByteTypeRef(newSource)
is FirImplicitShortTypeRef -> FirImplicitShortTypeRef(newSource)
is FirImplicitIntTypeRef -> FirImplicitIntTypeRef(newSource) is FirImplicitIntTypeRef -> FirImplicitIntTypeRef(newSource)
is FirImplicitLongTypeRef -> FirImplicitLongTypeRef(newSource)
is FirImplicitDoubleTypeRef -> FirImplicitDoubleTypeRef(newSource)
is FirImplicitFloatTypeRef -> FirImplicitFloatTypeRef(newSource)
is FirImplicitNothingTypeRef -> FirImplicitNothingTypeRef(newSource) is FirImplicitNothingTypeRef -> FirImplicitNothingTypeRef(newSource)
is FirImplicitNullableNothingTypeRef -> FirImplicitNullableNothingTypeRef(newSource) is FirImplicitNullableNothingTypeRef -> FirImplicitNullableNothingTypeRef(newSource)
is FirImplicitCharTypeRef -> FirImplicitCharTypeRef(newSource)
is FirImplicitStringTypeRef -> FirImplicitStringTypeRef(newSource) is FirImplicitStringTypeRef -> FirImplicitStringTypeRef(newSource)
is FirImplicitKPropertyTypeRef -> FirImplicitKPropertyTypeRef( is FirImplicitKPropertyTypeRef -> FirImplicitKPropertyTypeRef(
newSource, newSource,
@@ -0,0 +1,4 @@
$TESTDATA_DIR$/inapplicableLateinitModifier.kt
-Xuse-fir
-d
$TEMP_DIR$
@@ -0,0 +1,24 @@
object Delegate {
operator fun getValue(instance: Any?, property: Any) : String = ""
operator fun setValue(instance: Any?, property: Any, value: String) {}
}
lateinit var kest by Delegate
class A {
lateinit val fest = "10"
lateinit var mest: String
lateinit var xest: String?
lateinit var nest: Int
lateinit val dest: String
get() = "KEKER"
}
class B<T> {
lateinit var best: T
}
fun rest() {
lateinit var a: A
lateinit var b: B<String> = B()
}
@@ -0,0 +1,52 @@
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:6:1: error: 'lateinit' modifier is not allowed on properties of primitive types
lateinit var test: Int
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:7:1: error: 'lateinit' modifier is not allowed on delegated properties
lateinit var kest by Delegate
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:12:5: error: 'lateinit' modifier is allowed only on mutable properties
lateinit val fest = "10"
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:12:5: error: 'lateinit' modifier is not allowed on properties with initializer
lateinit val fest = "10"
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:14:5: error: 'lateinit' modifier is not allowed on properties of nullable types
lateinit var xest: String?
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:15:5: error: 'lateinit' modifier is not allowed on properties of primitive types
lateinit var nest: Int
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:16:5: error: 'lateinit' modifier is not allowed on properties of primitive types
lateinit var west: Char
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:17:5: error: 'lateinit' modifier is not allowed on properties of primitive types
lateinit var qest: Boolean
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:18:5: error: 'lateinit' modifier is not allowed on properties of primitive types
lateinit var aest: Short
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:19:5: error: 'lateinit' modifier is not allowed on properties of primitive types
lateinit var hest: Byte
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:20:5: error: 'lateinit' modifier is not allowed on properties of primitive types
lateinit var jest: Long
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:21:5: error: 'lateinit' modifier is allowed only on mutable properties
lateinit val dest: String
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:21:5: error: 'lateinit' modifier is not allowed on properties with a custom getter or setter
lateinit val dest: String
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:26:5: error: 'lateinit' modifier is not allowed on properties of a type with nullable upper bound
lateinit var best: T
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:31:5: error: 'lateinit' modifier is not allowed on properties of nullable types
lateinit var vest: K?
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:35:5: error: 'lateinit' modifier is not allowed on local variables of primitive types
lateinit var i: Int
^
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:37:5: error: 'lateinit' modifier is not allowed on local variables with initializer
lateinit var b: B<String> = B()
^
COMPILATION_ERROR
@@ -9,7 +9,7 @@ fun test() {
val <T : __UNRESOLVED__> a1 = "" val <T : __UNRESOLVED__> a1 = ""
val <T : String> a2 = 0 val <T : String> a2 = 0
const val <T> a3 = 0 const val <T> a3 = 0
lateinit val <T> a4 = 0 <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val <T> a4 = 0<!>
val <T> a5 by Delegate<Int>() val <T> a5 by Delegate<Int>()
val <T> a6 by <!INAPPLICABLE_CANDIDATE!>Delegate<<!UNRESOLVED_REFERENCE!>T<!>>()<!> val <T> a6 by <!INAPPLICABLE_CANDIDATE!>Delegate<<!UNRESOLVED_REFERENCE!>T<!>>()<!>
} }
@@ -9,7 +9,7 @@ fun test() {
val <T : __UNRESOLVED__> a1 = "" val <T : __UNRESOLVED__> a1 = ""
val <T : String> a2 = 0 val <T : String> a2 = 0
const val <T> a3 = 0 const val <T> a3 = 0
lateinit val <T> a4 = 0 <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val <T> a4 = 0<!>
val <T> a5 by Delegate<Int>() val <T> a5 by Delegate<Int>()
val <T> a6 by <!INAPPLICABLE_CANDIDATE!>Delegate<<!UNRESOLVED_REFERENCE!>T<!>>()<!> val <T> a6 by <!INAPPLICABLE_CANDIDATE!>Delegate<<!UNRESOLVED_REFERENCE!>T<!>>()<!>
} }
@@ -10,9 +10,9 @@ object Delegate {
fun test() { fun test() {
lateinit val test0: Any <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val test0: Any<!>
lateinit var test1: Int <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var test1: Int<!>
lateinit var test2: Any? <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var test2: Any?<!>
lateinit var test3: String = "" <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var test3: String = ""<!>
lateinit var test4 by Delegate <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var test4 by Delegate<!>
} }
@@ -8,12 +8,12 @@ class CustomDelegate {
public abstract class A<T: Any, V: String?>(lateinit var p2: String) { public abstract class A<T: Any, V: String?>(lateinit var p2: String) {
public lateinit val a: String <!INAPPLICABLE_LATEINIT_MODIFIER!>public lateinit val a: String<!>
lateinit val b: T <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val b: T<!>
private lateinit var c: CharSequence private lateinit var c: CharSequence
lateinit val d: String <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val d: String
get get<!>
public lateinit var e: String public lateinit var e: String
get get
@@ -23,22 +23,22 @@ public abstract class A<T: Any, V: String?>(lateinit var p2: String) {
lateinit var a: String lateinit var a: String
} }
lateinit var e1: V <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e1: V<!>
lateinit var e2: String? <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e2: String?<!>
lateinit var e3: Int <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e3: Int<!>
lateinit var e4: Int? <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e4: Int?<!>
lateinit var e5 = "A" <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e5 = "A"<!>
// With initializer, primitive // With initializer, primitive
lateinit var e6 = 3 <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e6 = 3<!>
lateinit var e7 by CustomDelegate() <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e7 by CustomDelegate()<!>
lateinit var e8: String <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e8: String
get() = "A" get() = "A"<!>
lateinit var e9: String <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e9: String
set(v) { field = v } set(v) { field = v }<!>
abstract lateinit var e10: String abstract lateinit var e10: String
@@ -47,7 +47,7 @@ public abstract class A<T: Any, V: String?>(lateinit var p2: String) {
lateinit var String.e12: String lateinit var String.e12: String
} }
lateinit val topLevel: String <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val topLevel: String<!>
lateinit var topLevelMutable: String lateinit var topLevelMutable: String
public interface Intf { public interface Intf {
@@ -8,12 +8,12 @@ class CustomDelegate {
public abstract class A<T: Any, V: String?>(lateinit var p2: String) { public abstract class A<T: Any, V: String?>(lateinit var p2: String) {
public lateinit val a: String <!INAPPLICABLE_LATEINIT_MODIFIER!>public lateinit val a: String<!>
lateinit val b: T <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val b: T<!>
private lateinit var c: CharSequence private lateinit var c: CharSequence
lateinit val d: String <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val d: String
get get<!>
public lateinit var e: String public lateinit var e: String
get get
@@ -23,22 +23,22 @@ public abstract class A<T: Any, V: String?>(lateinit var p2: String) {
lateinit var a: String lateinit var a: String
} }
lateinit var e1: V <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e1: V<!>
lateinit var e2: String? <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e2: String?<!>
lateinit var e3: Int <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e3: Int<!>
lateinit var e4: Int? <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e4: Int?<!>
lateinit var e5 = "A" <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e5 = "A"<!>
// With initializer, primitive // With initializer, primitive
lateinit var e6 = 3 <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e6 = 3<!>
lateinit var e7 by CustomDelegate() <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e7 by CustomDelegate()<!>
lateinit var e8: String <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e8: String
get() = "A" get() = "A"<!>
lateinit var e9: String <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e9: String
set(v) { field = v } set(v) { field = v }<!>
abstract lateinit var e10: String abstract lateinit var e10: String
@@ -47,7 +47,7 @@ public abstract class A<T: Any, V: String?>(lateinit var p2: String) {
lateinit var String.e12: String lateinit var String.e12: String
} }
lateinit val topLevel: String <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val topLevel: String<!>
lateinit var topLevelMutable: String lateinit var topLevelMutable: String
public interface Intf { public interface Intf {
@@ -7,8 +7,8 @@ object Delegate {
lateinit var testOk: String lateinit var testOk: String
lateinit val testErr0: Any <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val testErr0: Any<!>
lateinit var testErr1: Int <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var testErr1: Int<!>
lateinit var testErr2: Any? <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var testErr2: Any?<!>
lateinit var testErr3: String = "" <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var testErr3: String = ""<!>
lateinit var testErr4 by Delegate <!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var testErr4 by Delegate<!>
@@ -320,6 +320,11 @@ public class CliTestGenerated extends AbstractCliTest {
runTest("compiler/testData/cli/jvm/help.args"); runTest("compiler/testData/cli/jvm/help.args");
} }
@TestMetadata("inapplicableLateinitModifier.args")
public void testInapplicableLateinitModifier() throws Exception {
runTest("compiler/testData/cli/jvm/inapplicableLateinitModifier.args");
}
@TestMetadata("inlineCycle.args") @TestMetadata("inlineCycle.args")
public void testInlineCycle() throws Exception { public void testInlineCycle() throws Exception {
runTest("compiler/testData/cli/jvm/inlineCycle.args"); runTest("compiler/testData/cli/jvm/inlineCycle.args");