Improve support of 'lateinit' modifier
- Allow 'lateinit' for inline classes which underlying type is suitable for 'lateinit' - K2: report all problems related to 'lateinit' modifier ^KT-55052: Fixed
This commit is contained in:
committed by
teamcity
parent
e0c13e5276
commit
cd6e865fb3
+9
-3
@@ -18039,9 +18039,15 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt");
|
||||
@TestMetadata("lateinitInlineClassesOff.kt")
|
||||
public void testLateinitInlineClassesOff() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClassesOn.kt")
|
||||
public void testLateinitInlineClassesOn() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOn.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
+2
-2
@@ -9,7 +9,7 @@ object Delegate {
|
||||
lateinit var good: String
|
||||
|
||||
class A {
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> val fest = "10"
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER, 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
|
||||
@@ -18,7 +18,7 @@ class A {
|
||||
<!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
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER, INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> val dest: String
|
||||
get() = "KEKER"
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -11,8 +11,8 @@ fun test() {
|
||||
}
|
||||
|
||||
// Not allowed for properties with
|
||||
// custom accessors
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var number: Number
|
||||
// custom accessors & backing fields
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER, INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var number: Number
|
||||
field = 4
|
||||
set(value) {
|
||||
field = 10
|
||||
@@ -21,7 +21,7 @@ fun test() {
|
||||
val something: Number
|
||||
<!LATEINIT_FIELD_IN_VAL_PROPERTY, LATEINIT_PROPERTY_FIELD_DECLARATION_WITH_INITIALIZER!>lateinit<!> field = 4
|
||||
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var oneMore: Number
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER, INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var oneMore: Number
|
||||
<!LATEINIT_PROPERTY_FIELD_DECLARATION_WITH_INITIALIZER!>lateinit<!> field = 4
|
||||
set(value) {
|
||||
field = 10
|
||||
|
||||
+9
-3
@@ -18039,9 +18039,15 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt");
|
||||
@TestMetadata("lateinitInlineClassesOff.kt")
|
||||
public void testLateinitInlineClassesOff() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClassesOn.kt")
|
||||
public void testLateinitInlineClassesOn() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOn.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
+9
-3
@@ -18039,9 +18039,15 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt");
|
||||
@TestMetadata("lateinitInlineClassesOff.kt")
|
||||
public void testLateinitInlineClassesOff() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClassesOn.kt")
|
||||
public void testLateinitInlineClassesOn() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOn.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -16,6 +16,8 @@ import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
|
||||
import org.jetbrains.kotlin.diagnostics.*
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.primaryConstructorSymbol
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.primaryConstructorSymbol
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||
import org.jetbrains.kotlin.fir.analysis.getChild
|
||||
import org.jetbrains.kotlin.fir.containingClassForLocalAttr
|
||||
@@ -675,3 +677,7 @@ private fun findDefaultValue(source: KtLightSourceElement): KtLightSourceElement
|
||||
)
|
||||
}
|
||||
|
||||
fun ConeKotlinType.getInlineClassUnderlyingType(session: FirSession): ConeKotlinType {
|
||||
require(this.isInlineClass(session))
|
||||
return toRegularClassSymbol(session)!!.primaryConstructorSymbol()!!.valueParameterSymbols[0].resolvedReturnTypeRef.coneType
|
||||
}
|
||||
+72
-18
@@ -6,14 +6,20 @@
|
||||
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
||||
|
||||
import org.jetbrains.kotlin.KtSourceElement
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirInlineClassDeclarationChecker.isRecursiveInlineClassType
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.getInlineClassUnderlyingType
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.isInlineClass
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.hasExplicitBackingField
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isInline
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isLateInit
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
|
||||
@@ -23,41 +29,89 @@ object FirInapplicableLateinitChecker : FirPropertyChecker() {
|
||||
return
|
||||
}
|
||||
|
||||
when {
|
||||
declaration.isVal ->
|
||||
reporter.reportError(declaration.source, "is allowed only on mutable properties", context)
|
||||
if (declaration.isVal) {
|
||||
reporter.reportError(declaration.source, "is allowed only on mutable properties", context)
|
||||
}
|
||||
|
||||
declaration.initializer != null -> if (declaration.isLocal) {
|
||||
if (declaration.initializer != null) {
|
||||
if (declaration.isLocal) {
|
||||
reporter.reportError(declaration.source, "is not allowed on local variables with initializer", context)
|
||||
} else {
|
||||
reporter.reportError(declaration.source, "is not allowed on properties with initializer", context)
|
||||
}
|
||||
}
|
||||
|
||||
declaration.delegate != null ->
|
||||
reporter.reportError(declaration.source, "is not allowed on delegated properties", context)
|
||||
if (declaration.delegate != null) {
|
||||
reporter.reportError(declaration.source, "is not allowed on delegated properties", context)
|
||||
}
|
||||
|
||||
declaration.isNullable() ->
|
||||
reporter.reportError(declaration.source, "is not allowed on properties of a type with nullable upper bound", context)
|
||||
if (declaration.isNullable()) {
|
||||
reporter.reportError(declaration.source, "is not allowed on properties of a type with nullable upper bound", context)
|
||||
}
|
||||
|
||||
declaration.returnTypeRef.coneType.isPrimitiveOrNullablePrimitive -> if (declaration.isLocal) {
|
||||
if (declaration.returnTypeRef.coneType.isPrimitive) {
|
||||
if (declaration.isLocal) {
|
||||
reporter.reportError(declaration.source, "is not allowed on local variables of primitive types", context)
|
||||
} else {
|
||||
reporter.reportError(declaration.source, "is not allowed on properties of primitive types", context)
|
||||
}
|
||||
}
|
||||
|
||||
declaration.hasExplicitBackingField ->
|
||||
reporter.reportError(declaration.source, "must be moved to the field declaration", context)
|
||||
if (declaration.hasExplicitBackingField) {
|
||||
reporter.reportError(declaration.source, "must be moved to the field declaration", context)
|
||||
}
|
||||
|
||||
declaration.hasGetter() || declaration.hasSetter() ->
|
||||
reporter.reportError(declaration.source, "is not allowed on properties with a custom getter or setter", context)
|
||||
if ((declaration.hasGetter() || declaration.hasSetter()) && declaration.delegate == null) {
|
||||
reporter.reportError(declaration.source, "is not allowed on properties with a custom getter or setter", context)
|
||||
}
|
||||
|
||||
if (declaration.returnTypeRef.coneType.isInlineClass(context.session)) {
|
||||
val declarationType = declaration.returnTypeRef.coneType
|
||||
val variables = if (declaration.isLocal) "local variables" else "properties"
|
||||
when {
|
||||
declarationType.isUnsignedType -> reporter.reportError(
|
||||
declaration.source,
|
||||
"is not allowed on $variables of unsigned types",
|
||||
context
|
||||
)
|
||||
!context.languageVersionSettings.supportsFeature(LanguageFeature.InlineLateinit) -> reporter.reportError(
|
||||
declaration.source,
|
||||
"is not allowed on $variables of inline class types",
|
||||
context
|
||||
)
|
||||
hasUnderlyingTypeForbiddenForLateinit(declarationType, context.session) -> reporter.reportError(
|
||||
declaration.source,
|
||||
"is not allowed on $variables of inline type with underlying type not suitable for lateinit declaration",
|
||||
context
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirProperty.isNullable() = when (val type = returnTypeRef.coneType) {
|
||||
is ConeTypeParameterType -> type.isNullable || type.lookupTag.typeParameterSymbol.resolvedBounds.any { it.coneType.isNullable }
|
||||
else -> type.isNullable
|
||||
private fun hasUnderlyingTypeForbiddenForLateinit(type: ConeKotlinType, session: FirSession): Boolean {
|
||||
|
||||
fun isForbiddenTypeForLateinit(type: ConeKotlinType): Boolean {
|
||||
if (type.isPrimitiveOrNullablePrimitive) return true
|
||||
if (type.hasNullableUpperBound) return true
|
||||
if (type.isInlineClass(session)) {
|
||||
return isForbiddenTypeForLateinit(type.getInlineClassUnderlyingType(session))
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// prevent infinite recursion
|
||||
if (type.isRecursiveInlineClassType(session)) return false
|
||||
return isForbiddenTypeForLateinit(type.getInlineClassUnderlyingType(session))
|
||||
}
|
||||
|
||||
private val ConeKotlinType.hasNullableUpperBound
|
||||
get() = when (this) {
|
||||
is ConeTypeParameterType -> isNullable || lookupTag.typeParameterSymbol.resolvedBounds.any { it.coneType.isNullable }
|
||||
else -> isNullable
|
||||
}
|
||||
|
||||
private fun FirProperty.isNullable() = returnTypeRef.coneType.hasNullableUpperBound
|
||||
|
||||
private fun FirProperty.hasGetter() = getter != null && getter !is FirDefaultPropertyGetter
|
||||
private fun FirProperty.hasSetter() = setter != null && setter !is FirDefaultPropertySetter
|
||||
|
||||
|
||||
+1
-1
@@ -257,7 +257,7 @@ object FirInlineClassDeclarationChecker : FirRegularClassChecker() {
|
||||
arrayElementType.isGenericArrayOfTypeParameter()
|
||||
}
|
||||
|
||||
private fun ConeKotlinType.isRecursiveInlineClassType(session: FirSession) =
|
||||
fun ConeKotlinType.isRecursiveInlineClassType(session: FirSession) =
|
||||
isRecursiveInlineClassType(hashSetOf(), session)
|
||||
|
||||
private fun ConeKotlinType.isRecursiveInlineClassType(visited: HashSet<ConeKotlinType>, session: FirSession): Boolean {
|
||||
|
||||
+6
@@ -22391,6 +22391,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt54656.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
|
||||
@@ -495,7 +495,7 @@ class DeclarationsChecker(
|
||||
for (parameter in declaration.valueParameters) {
|
||||
trace.get(PRIMARY_CONSTRUCTOR_PARAMETER, parameter)?.let {
|
||||
modifiersChecker.checkModifiersForDeclaration(parameter, it)
|
||||
LateinitModifierApplicabilityChecker.checkLateinitModifierApplicability(trace, parameter, it)
|
||||
LateinitModifierApplicabilityChecker.checkLateinitModifierApplicability(trace, parameter, it, languageVersionSettings)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -610,7 +610,7 @@ class DeclarationsChecker(
|
||||
if (containingDeclaration is ClassDescriptor) {
|
||||
checkMemberProperty(property, propertyDescriptor, containingDeclaration)
|
||||
}
|
||||
LateinitModifierApplicabilityChecker.checkLateinitModifierApplicability(trace, property, propertyDescriptor)
|
||||
LateinitModifierApplicabilityChecker.checkLateinitModifierApplicability(trace, property, propertyDescriptor, languageVersionSettings)
|
||||
checkPropertyInitializer(property, propertyDescriptor)
|
||||
checkAccessors(property, propertyDescriptor)
|
||||
checkTypeParameterConstraints(property)
|
||||
|
||||
+61
-6
@@ -18,6 +18,9 @@ package org.jetbrains.kotlin.resolve
|
||||
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.builtins.UnsignedTypes
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||
@@ -28,10 +31,18 @@ import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtParameter
|
||||
import org.jetbrains.kotlin.psi.KtProperty
|
||||
import org.jetbrains.kotlin.resolve.DeclarationsChecker.Companion.hasAccessorImplementation
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.inlineClassRepresentation
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
import org.jetbrains.kotlin.types.typeUtil.isUnsignedNumberType
|
||||
|
||||
object LateinitModifierApplicabilityChecker {
|
||||
fun checkLateinitModifierApplicability(trace: BindingTrace, ktDeclaration: KtCallableDeclaration, descriptor: VariableDescriptor) {
|
||||
fun checkLateinitModifierApplicability(
|
||||
trace: BindingTrace,
|
||||
ktDeclaration: KtCallableDeclaration,
|
||||
descriptor: VariableDescriptor,
|
||||
languageVersionSettings: LanguageVersionSettings
|
||||
) {
|
||||
if (!ktDeclaration.hasModifier(KtTokens.LATEINIT_KEYWORD)) return
|
||||
|
||||
val variables = when (descriptor) {
|
||||
@@ -47,10 +58,27 @@ object LateinitModifierApplicabilityChecker {
|
||||
}
|
||||
|
||||
if (type.isInlineClassType()) {
|
||||
if (UnsignedTypes.isUnsignedType(type)) {
|
||||
trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on $variables of unsigned types"))
|
||||
} else {
|
||||
trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on $variables of inline class types"))
|
||||
when {
|
||||
type.isUnsignedNumberType() -> trace.report(
|
||||
Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(
|
||||
ktDeclaration,
|
||||
"is not allowed on $variables of unsigned types"
|
||||
)
|
||||
)
|
||||
!languageVersionSettings.supportsFeature(LanguageFeature.InlineLateinit) ->
|
||||
trace.report(
|
||||
Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(
|
||||
ktDeclaration,
|
||||
"is not allowed on $variables of inline class types"
|
||||
)
|
||||
)
|
||||
hasUnderlyingTypeForbiddenForLateinit(type) ->
|
||||
trace.report(
|
||||
Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(
|
||||
ktDeclaration,
|
||||
"is not allowed on $variables of inline type with underlying type not suitable for lateinit declaration"
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,7 +128,12 @@ object LateinitModifierApplicabilityChecker {
|
||||
)
|
||||
)
|
||||
} else if (!isAbstract && !hasBackingField) {
|
||||
trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on properties without backing field"))
|
||||
trace.report(
|
||||
Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(
|
||||
ktDeclaration,
|
||||
"is not allowed on properties without backing field"
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,4 +142,26 @@ object LateinitModifierApplicabilityChecker {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun hasUnderlyingTypeForbiddenForLateinit(type: KotlinType): Boolean {
|
||||
|
||||
fun getUnderlyingType(type: KotlinType): KotlinType {
|
||||
return (type.constructor.declarationDescriptor as ClassDescriptor).inlineClassRepresentation!!.underlyingType
|
||||
}
|
||||
|
||||
fun isForbiddenForLateinit(type: KotlinType): Boolean {
|
||||
if (type.isMarkedNullable || TypeUtils.isNullableType(type)) return true
|
||||
if (KotlinBuiltIns.isPrimitiveType(type)) return true
|
||||
if (type.isInlineClassType()) {
|
||||
return isForbiddenForLateinit(getUnderlyingType(type))
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// prevent infinite recursion
|
||||
if (type.isRecursiveInlineOrValueClassType()) return false
|
||||
return isForbiddenForLateinit(getUnderlyingType(type))
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -150,7 +150,7 @@ class LocalVariableResolver(
|
||||
modifiersChecker.withTrace(context.trace).checkModifiersForLocalDeclaration(ktProperty, descriptor)
|
||||
identifierChecker.checkDeclaration(ktProperty, context.trace)
|
||||
|
||||
LateinitModifierApplicabilityChecker.checkLateinitModifierApplicability(context.trace, ktProperty, descriptor)
|
||||
LateinitModifierApplicabilityChecker.checkLateinitModifierApplicability(context.trace, ktProperty, descriptor, languageVersionSettings)
|
||||
}
|
||||
|
||||
private fun resolveLocalVariableDescriptor(
|
||||
|
||||
@@ -7,6 +7,9 @@ lateinit var kest by Delegate
|
||||
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:9:5: error: 'lateinit' modifier is allowed only on mutable properties
|
||||
lateinit val fest = "10"
|
||||
^
|
||||
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:9:5: error: 'lateinit' modifier is not allowed on properties with initializer
|
||||
lateinit val fest = "10"
|
||||
^
|
||||
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:11:5: error: 'lateinit' modifier is not allowed on properties of a type with nullable upper bound
|
||||
lateinit var xest: String?
|
||||
^
|
||||
@@ -16,6 +19,9 @@ compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:12:5: error: 'lateinit
|
||||
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:13:5: error: 'lateinit' modifier is allowed only on mutable properties
|
||||
lateinit val dest: String
|
||||
^
|
||||
compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:13: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:18:5: error: 'lateinit' modifier is not allowed on properties of a type with nullable upper bound
|
||||
lateinit var best: T
|
||||
^
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
// WITH_STDLIB
|
||||
// WORKS_WHEN_VALUE_CLASS
|
||||
// LANGUAGE: +ValueClasses, +InlineLateinit
|
||||
|
||||
OPTIONAL_JVM_INLINE_ANNOTATION
|
||||
value class IC1(val x: String)
|
||||
|
||||
lateinit var a: IC1
|
||||
|
||||
OPTIONAL_JVM_INLINE_ANNOTATION
|
||||
value class IC2<T : Number>(val x: T)
|
||||
|
||||
class MyClass {
|
||||
lateinit var b: IC2<Int>
|
||||
|
||||
fun isInit() = ::b.isInitialized
|
||||
}
|
||||
|
||||
OPTIONAL_JVM_INLINE_ANNOTATION
|
||||
value class IC3<T>(val x: Comparable<T>)
|
||||
|
||||
OPTIONAL_JVM_INLINE_ANNOTATION
|
||||
value class IC4(val x: IC1)
|
||||
|
||||
lateinit var c: IC4
|
||||
|
||||
inline fun <reified T> assertThrows(block: () -> Unit): Boolean {
|
||||
try {
|
||||
block.invoke()
|
||||
} catch (t: Throwable) {
|
||||
return t is T
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
if (::a.isInitialized) return "Fail 1.1"
|
||||
if (!assertThrows<UninitializedPropertyAccessException> { val t = a }) return "Fail 1.2"
|
||||
a = IC1("a")
|
||||
if (!::a.isInitialized) return "Fail 1.3"
|
||||
if (a.x != "a") return "Fail 1.4"
|
||||
|
||||
val inst = MyClass()
|
||||
if (inst.isInit()) return "Fail 2.1"
|
||||
if (!assertThrows<UninitializedPropertyAccessException> { val t = inst.b }) return "Fail 2.2"
|
||||
inst.b = IC2(42)
|
||||
if (!inst.isInit()) return "Fail 2.3"
|
||||
if (inst.b.x != 42) return "Fail 2.4"
|
||||
|
||||
lateinit var z: IC3<Double>
|
||||
if (!assertThrows<UninitializedPropertyAccessException> { val t = z }) return "Fail 3.1"
|
||||
z = IC3(5.0)
|
||||
if (z.x != 5.0) return "Fail 3.2"
|
||||
|
||||
if (::c.isInitialized) return "Fail 4.1"
|
||||
if (!assertThrows<UninitializedPropertyAccessException> { val t = c }) return "Fail 4.2"
|
||||
c = IC4(IC1("c"))
|
||||
if (!::c.isInitialized) return "Fail 4.3"
|
||||
if (c.x.x != "c") return "Fail 4.4"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
//CHECK_BYTECODE_TEXT
|
||||
// JVM_IR_TEMPLATES
|
||||
// 0 INVOKESTATIC IC1.box-impl
|
||||
// 0 INVOKESTATIC IC2.box-impl
|
||||
// 0 INVOKESTATIC IC3.box-impl
|
||||
// 0 INVOKESTATIC IC4.box-impl
|
||||
Vendored
+1
-1
@@ -8,7 +8,7 @@ fun test() {
|
||||
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T : <!UNRESOLVED_REFERENCE!>__UNRESOLVED__<!>><!> a1 = ""
|
||||
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T : <!FINAL_UPPER_BOUND!>String<!>><!> a2 = 0
|
||||
<!WRONG_MODIFIER_TARGET!>const<!> val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T><!> a3 = 0
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T><!> a4 = 0
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER, INAPPLICABLE_LATEINIT_MODIFIER, INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T><!> a4 = 0
|
||||
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T><!> a5 by Delegate<Int>()
|
||||
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING!><T><!> a6 by Delegate<<!UNRESOLVED_REFERENCE!>T<!>>()
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -8,7 +8,7 @@ fun test() {
|
||||
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : <!UNRESOLVED_REFERENCE!>__UNRESOLVED__<!>><!> a1 = ""
|
||||
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T : <!FINAL_UPPER_BOUND!>String<!>><!> a2 = 0
|
||||
<!WRONG_MODIFIER_TARGET!>const<!> val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T><!> a3 = 0
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T><!> a4 = 0
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER, INAPPLICABLE_LATEINIT_MODIFIER, INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T><!> a4 = 0
|
||||
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T><!> a5 by Delegate<Int>()
|
||||
val <!LOCAL_VARIABLE_WITH_TYPE_PARAMETERS!><T><!> a6 by Delegate<<!UNRESOLVED_REFERENCE!>T<!>>()
|
||||
}
|
||||
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
|
||||
inline class Foo(val x: Int)
|
||||
|
||||
lateinit var a: Foo
|
||||
|
||||
fun foo() {
|
||||
lateinit var b: Foo
|
||||
}
|
||||
+1
@@ -1,5 +1,6 @@
|
||||
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// FIR_IDENTICAL
|
||||
|
||||
inline class Foo(val x: Int)
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
// WITH_STDLIB
|
||||
// SKIP_TXT
|
||||
// !LANGUAGE: +InlineLateinit
|
||||
// FIR_IDENTICAL
|
||||
|
||||
@JvmInline
|
||||
value class IC1(val x: Int)
|
||||
|
||||
@JvmInline
|
||||
value class IC2(val x: IC1)
|
||||
|
||||
@JvmInline
|
||||
value class IC3(val x: String)
|
||||
|
||||
@JvmInline
|
||||
value class IC4(val x: String?)
|
||||
|
||||
@JvmInline
|
||||
value class IC5(val x: IC4)
|
||||
|
||||
@JvmInline
|
||||
value class IC6<T>(val x: T)
|
||||
|
||||
@JvmInline
|
||||
value class IC7<T : Any>(val x: T)
|
||||
|
||||
@JvmInline
|
||||
value class IC8(val x: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>IC9<!>)
|
||||
|
||||
@JvmInline
|
||||
value class IC9(val x: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>IC8<!>)
|
||||
|
||||
@JvmInline
|
||||
value class IC10(val x: IC6<String>)
|
||||
|
||||
@JvmInline
|
||||
value class IC11(val x : IC4?)
|
||||
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var a: IC1
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var b: IC2
|
||||
lateinit var c: IC3
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var d: IC4
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var e: IC6<String>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var f: IC6<*>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var g: IC5
|
||||
lateinit var h: IC7<Double>
|
||||
lateinit var i: IC7<*>
|
||||
lateinit var j: IC8
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var k : IC10
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var o : IC3?
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var m : UInt
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var n : IC11
|
||||
|
||||
class B {
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var a: IC1
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var b: IC2
|
||||
lateinit var c: IC3
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var d: IC4
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var e: IC6<String>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var f: IC6<*>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var g: IC5
|
||||
lateinit var h: IC7<Double>
|
||||
lateinit var i: IC7<*>
|
||||
lateinit var j: IC8
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var k : IC10
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var o : IC3?
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var m : UInt
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var n : IC11
|
||||
}
|
||||
|
||||
fun foo() {
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var a: IC1
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var b: IC2
|
||||
lateinit var c: IC3
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var d: IC4
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var e: IC6<String>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var f: IC6<*>
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var g: IC5
|
||||
lateinit var h: IC7<Double>
|
||||
lateinit var i: IC7<*>
|
||||
lateinit var j: IC8
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var k : IC10
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var o : IC3?
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var m : UInt
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var n : IC11
|
||||
}
|
||||
+1
-1
@@ -30,7 +30,7 @@ public abstract class A<T: Any, V: String?>(lateinit var p2: String) {
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var e5 = "A"
|
||||
|
||||
// With initializer, primitive
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var e6 = 3
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER, INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var e6 = 3
|
||||
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var e7 by CustomDelegate()
|
||||
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
|
||||
lateinit var a: UInt
|
||||
|
||||
fun foo() {
|
||||
lateinit var b: UByte
|
||||
lateinit var c: UShort
|
||||
lateinit var d: ULong
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// FIR_IDENTICAL
|
||||
|
||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var a: UInt
|
||||
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
// !SKIP_JAVAC
|
||||
// !LANGUAGE: +InlineClasses
|
||||
// ALLOW_KOTLIN_PACKAGE
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
|
||||
package kotlin.jvm
|
||||
|
||||
annotation class JvmInline
|
||||
|
||||
@JvmInline
|
||||
value class Foo(val x: Int)
|
||||
|
||||
lateinit var a: Foo
|
||||
|
||||
fun foo() {
|
||||
lateinit var b: Foo
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
// ALLOW_KOTLIN_PACKAGE
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// FIR_IDENTICAL
|
||||
|
||||
package kotlin.jvm
|
||||
|
||||
|
||||
Generated
+9
-3
@@ -18045,9 +18045,15 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt");
|
||||
@TestMetadata("lateinitInlineClassesOff.kt")
|
||||
public void testLateinitInlineClassesOff() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClassesOn.kt")
|
||||
public void testLateinitInlineClassesOn() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOn.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
+6
@@ -21569,6 +21569,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
|
||||
+6
@@ -22391,6 +22391,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt54656.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
|
||||
+5
@@ -18020,6 +18020,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||
}
|
||||
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||
}
|
||||
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||
|
||||
@@ -280,6 +280,7 @@ enum class LanguageFeature(
|
||||
CustomEqualsInInlineClasses(KOTLIN_1_9), // KT-24874
|
||||
EnhanceNullabilityOfPrimitiveArrays(KOTLIN_1_9, kind = BUG_FIX), // KT-54521
|
||||
RefineTypeCheckingOnAssignmentsToJavaFields(KOTLIN_1_9, kind = BUG_FIX), // KT-46727
|
||||
InlineLateinit(KOTLIN_1_9, kind = OTHER), // KT-23814
|
||||
|
||||
|
||||
// Disabled for indefinite time. See KT-53751
|
||||
|
||||
+6
@@ -16951,6 +16951,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
|
||||
+6
@@ -16969,6 +16969,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
|
||||
+6
@@ -16969,6 +16969,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
|
||||
+5
@@ -15025,6 +15025,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
}
|
||||
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
}
|
||||
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
|
||||
+8
@@ -16836,6 +16836,7 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
|
||||
register("compiler/testData/codegen/box/inlineClasses/kt51254.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
register("compiler/testData/codegen/box/inlineClasses/kt52913.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
register("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
register("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
register("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
register("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunctionGeneric.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
register("compiler/testData/codegen/box/inlineClasses/mangledSuperCalls.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||
@@ -18691,6 +18692,13 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lateinitInlineClasses.kt")
|
||||
public void testLateinitInlineClasses() throws Exception {
|
||||
// There is a registered source transformer for the testcase: TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()
|
||||
runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("mangledDefaultParameterFunction.kt")
|
||||
public void testMangledDefaultParameterFunction() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user