[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
|
get() = true
|
||||||
set(value) {}
|
set(value) {}
|
||||||
|
|
||||||
lateinit var fau: Double
|
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit var fau: Double<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
inline class InlineClass
|
inline class InlineClass
|
||||||
Generated
+5
@@ -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");
|
||||||
|
|||||||
+5
@@ -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");
|
||||||
|
|||||||
+1
@@ -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(
|
||||||
|
|||||||
+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.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)
|
||||||
}
|
}
|
||||||
+30
@@ -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
|
||||||
Vendored
+1
-1
@@ -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<!>>()<!>
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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<!>>()<!>
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -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<!>
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-16
@@ -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 {
|
||||||
|
|||||||
+16
-16
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user