[FIR] Add diagnostic INAPPLICABLE_LATEINIT_MODIFIER + some builtin types
This commit is contained in:
+38
@@ -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()<!>
|
||||
}
|
||||
+102
@@ -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
|
||||
set(value) {}
|
||||
|
||||
lateinit var fau: Double
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var fau: Double<!>
|
||||
}
|
||||
|
||||
inline class InlineClass
|
||||
Generated
+5
@@ -961,6 +961,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest {
|
||||
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")
|
||||
public void testIncompatibleModifiers() throws Exception {
|
||||
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.kt");
|
||||
|
||||
+5
@@ -961,6 +961,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
|
||||
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")
|
||||
public void testIncompatibleModifiers() throws Exception {
|
||||
runTest("compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.kt");
|
||||
|
||||
+1
@@ -39,6 +39,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
|
||||
FirInterfaceWithSuperclassChecker,
|
||||
FirEnumClassSimpleChecker,
|
||||
FirSealedSupertypeChecker,
|
||||
FirInapplicableLateinitChecker,
|
||||
)
|
||||
|
||||
override val regularClassCheckers: List<FirRegularClassChecker> = listOf(
|
||||
|
||||
+79
@@ -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)) }
|
||||
}
|
||||
}
|
||||
+2
@@ -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.INAPPLICABLE_CANDIDATE
|
||||
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.INFERENCE_ERROR
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INTERFACE_WITH_SUPERCLASS
|
||||
@@ -234,6 +235,7 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension {
|
||||
// Applicability
|
||||
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_LATEINIT_MODIFIER, "''lateinit'' modifier {0}", TO_STRING)
|
||||
|
||||
// Ambiguity
|
||||
map.put(AMBIGUITY, "Ambiguity between candidates: {0}", SYMBOLS)
|
||||
|
||||
@@ -108,6 +108,7 @@ object FirErrors {
|
||||
// Applicability
|
||||
val NONE_APPLICABLE by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>()
|
||||
val INAPPLICABLE_CANDIDATE by error1<FirSourceElement, PsiElement, AbstractFirBasedSymbol<*>>()
|
||||
val INAPPLICABLE_LATEINIT_MODIFIER by error1<FirSourceElement, PsiElement, String>()
|
||||
|
||||
// Ambiguity
|
||||
val AMBIGUITY by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>()
|
||||
|
||||
@@ -54,8 +54,14 @@ class BuiltinTypes {
|
||||
val enumType: FirImplicitBuiltinTypeRef = FirImplicitEnumTypeRef(null)
|
||||
val annotationType: FirImplicitBuiltinTypeRef = FirImplicitAnnotationTypeRef(null)
|
||||
val booleanType: FirImplicitBuiltinTypeRef = FirImplicitBooleanTypeRef(null)
|
||||
val byteType: FirImplicitBuiltinTypeRef = FirImplicitByteTypeRef(null)
|
||||
val shortType: FirImplicitBuiltinTypeRef = FirImplicitShortTypeRef(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 nullableNothingType: FirImplicitBuiltinTypeRef = FirImplicitNullableNothingTypeRef(null)
|
||||
val charType: FirImplicitBuiltinTypeRef = FirImplicitCharTypeRef(null)
|
||||
val stringType: FirImplicitBuiltinTypeRef = FirImplicitStringTypeRef(null)
|
||||
}
|
||||
+30
@@ -72,10 +72,30 @@ class FirImplicitBooleanTypeRef(
|
||||
source: FirSourceElement?
|
||||
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Boolean)
|
||||
|
||||
class FirImplicitByteTypeRef(
|
||||
source: FirSourceElement?
|
||||
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Byte)
|
||||
|
||||
class FirImplicitShortTypeRef(
|
||||
source: FirSourceElement?
|
||||
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Short)
|
||||
|
||||
class FirImplicitIntTypeRef(
|
||||
source: FirSourceElement?
|
||||
) : 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(
|
||||
source: FirSourceElement?
|
||||
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Nothing)
|
||||
@@ -84,6 +104,10 @@ class FirImplicitNullableNothingTypeRef(
|
||||
source: FirSourceElement?
|
||||
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Nothing, isNullable = true)
|
||||
|
||||
class FirImplicitCharTypeRef(
|
||||
source: FirSourceElement?
|
||||
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Char)
|
||||
|
||||
class FirImplicitStringTypeRef(
|
||||
source: FirSourceElement?
|
||||
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.String)
|
||||
@@ -146,9 +170,15 @@ fun FirImplicitBuiltinTypeRef.withFakeSource(kind: FirFakeSourceElementKind): Fi
|
||||
is FirImplicitEnumTypeRef -> FirImplicitEnumTypeRef(newSource)
|
||||
is FirImplicitAnnotationTypeRef -> FirImplicitAnnotationTypeRef(newSource)
|
||||
is FirImplicitBooleanTypeRef -> FirImplicitBooleanTypeRef(newSource)
|
||||
is FirImplicitByteTypeRef -> FirImplicitByteTypeRef(newSource)
|
||||
is FirImplicitShortTypeRef -> FirImplicitShortTypeRef(newSource)
|
||||
is FirImplicitIntTypeRef -> FirImplicitIntTypeRef(newSource)
|
||||
is FirImplicitLongTypeRef -> FirImplicitLongTypeRef(newSource)
|
||||
is FirImplicitDoubleTypeRef -> FirImplicitDoubleTypeRef(newSource)
|
||||
is FirImplicitFloatTypeRef -> FirImplicitFloatTypeRef(newSource)
|
||||
is FirImplicitNothingTypeRef -> FirImplicitNothingTypeRef(newSource)
|
||||
is FirImplicitNullableNothingTypeRef -> FirImplicitNullableNothingTypeRef(newSource)
|
||||
is FirImplicitCharTypeRef -> FirImplicitCharTypeRef(newSource)
|
||||
is FirImplicitStringTypeRef -> FirImplicitStringTypeRef(newSource)
|
||||
is FirImplicitKPropertyTypeRef -> FirImplicitKPropertyTypeRef(
|
||||
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
|
||||
Vendored
+1
-1
@@ -9,7 +9,7 @@ fun test() {
|
||||
val <T : __UNRESOLVED__> a1 = ""
|
||||
val <T : String> a2 = 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> a6 by <!INAPPLICABLE_CANDIDATE!>Delegate<<!UNRESOLVED_REFERENCE!>T<!>>()<!>
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -9,7 +9,7 @@ fun test() {
|
||||
val <T : __UNRESOLVED__> a1 = ""
|
||||
val <T : String> a2 = 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> a6 by <!INAPPLICABLE_CANDIDATE!>Delegate<<!UNRESOLVED_REFERENCE!>T<!>>()<!>
|
||||
}
|
||||
|
||||
+5
-5
@@ -10,9 +10,9 @@ object Delegate {
|
||||
|
||||
|
||||
fun test() {
|
||||
lateinit val test0: Any
|
||||
lateinit var test1: Int
|
||||
lateinit var test2: Any?
|
||||
lateinit var test3: String = ""
|
||||
lateinit var test4 by Delegate
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val test0: Any<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var test1: Int<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var test2: Any?<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var test3: String = ""<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var test4 by Delegate<!>
|
||||
}
|
||||
|
||||
+16
-16
@@ -8,12 +8,12 @@ class CustomDelegate {
|
||||
|
||||
public abstract class A<T: Any, V: String?>(lateinit var p2: String) {
|
||||
|
||||
public lateinit val a: String
|
||||
lateinit val b: T
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>public lateinit val a: String<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val b: T<!>
|
||||
private lateinit var c: CharSequence
|
||||
|
||||
lateinit val d: String
|
||||
get
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val d: String
|
||||
get<!>
|
||||
|
||||
public lateinit var e: String
|
||||
get
|
||||
@@ -23,22 +23,22 @@ public abstract class A<T: Any, V: String?>(lateinit var p2: String) {
|
||||
lateinit var a: String
|
||||
}
|
||||
|
||||
lateinit var e1: V
|
||||
lateinit var e2: String?
|
||||
lateinit var e3: Int
|
||||
lateinit var e4: Int?
|
||||
lateinit var e5 = "A"
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e1: V<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e2: String?<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e3: Int<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e4: Int?<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e5 = "A"<!>
|
||||
|
||||
// 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
|
||||
get() = "A"
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e8: String
|
||||
get() = "A"<!>
|
||||
|
||||
lateinit var e9: String
|
||||
set(v) { field = v }
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e9: String
|
||||
set(v) { field = v }<!>
|
||||
|
||||
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 val topLevel: String
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val topLevel: String<!>
|
||||
lateinit var topLevelMutable: String
|
||||
|
||||
public interface Intf {
|
||||
|
||||
+16
-16
@@ -8,12 +8,12 @@ class CustomDelegate {
|
||||
|
||||
public abstract class A<T: Any, V: String?>(lateinit var p2: String) {
|
||||
|
||||
public lateinit val a: String
|
||||
lateinit val b: T
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>public lateinit val a: String<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val b: T<!>
|
||||
private lateinit var c: CharSequence
|
||||
|
||||
lateinit val d: String
|
||||
get
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val d: String
|
||||
get<!>
|
||||
|
||||
public lateinit var e: String
|
||||
get
|
||||
@@ -23,22 +23,22 @@ public abstract class A<T: Any, V: String?>(lateinit var p2: String) {
|
||||
lateinit var a: String
|
||||
}
|
||||
|
||||
lateinit var e1: V
|
||||
lateinit var e2: String?
|
||||
lateinit var e3: Int
|
||||
lateinit var e4: Int?
|
||||
lateinit var e5 = "A"
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e1: V<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e2: String?<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e3: Int<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e4: Int?<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e5 = "A"<!>
|
||||
|
||||
// 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
|
||||
get() = "A"
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e8: String
|
||||
get() = "A"<!>
|
||||
|
||||
lateinit var e9: String
|
||||
set(v) { field = v }
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var e9: String
|
||||
set(v) { field = v }<!>
|
||||
|
||||
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 val topLevel: String
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val topLevel: String<!>
|
||||
lateinit var topLevelMutable: String
|
||||
|
||||
public interface Intf {
|
||||
|
||||
@@ -7,8 +7,8 @@ object Delegate {
|
||||
|
||||
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
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit val testErr0: Any<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var testErr1: Int<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var testErr2: Any?<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var testErr3: String = ""<!>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var testErr4 by Delegate<!>
|
||||
|
||||
@@ -320,6 +320,11 @@ public class CliTestGenerated extends AbstractCliTest {
|
||||
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")
|
||||
public void testInlineCycle() throws Exception {
|
||||
runTest("compiler/testData/cli/jvm/inlineCycle.args");
|
||||
|
||||
Reference in New Issue
Block a user