diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt index e880838ec49..bc38ea0e3f8 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt @@ -42,6 +42,7 @@ enum class PositioningStrategy(private val strategy: String) { WHEN_EXPRESSION("WHEN_EXPRESSION"), IF_EXPRESSION("IF_EXPRESSION"), VARIANCE_MODIFIER("VARIANCE_MODIFIER"), + LATEINIT_MODIFIER("LATEINIT_MODIFIER"), ; diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 97d3ce9e651..139fa2ae2a9 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -156,7 +156,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList { val INAPPLICABLE_CANDIDATE by error { parameter>("candidate") } - val INAPPLICABLE_LATEINIT_MODIFIER by error { + val INAPPLICABLE_LATEINIT_MODIFIER by error(PositioningStrategy.LATEINIT_MODIFIER) { parameter("reason") } } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 43d304be839..6ef8930b030 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -140,7 +140,7 @@ object FirErrors { // Applicability val NONE_APPLICABLE by error1>>() val INAPPLICABLE_CANDIDATE by error1>() - val INAPPLICABLE_LATEINIT_MODIFIER by error1() + val INAPPLICABLE_LATEINIT_MODIFIER by error1(SourceElementPositioningStrategies.LATEINIT_MODIFIER) // Ambiguity val AMBIGUITY by error1>>() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 57e046bbc90..cb864463d37 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -590,7 +590,7 @@ public interface Errors { DiagnosticFactory0 PRIVATE_PROPERTY_IN_INTERFACE = DiagnosticFactory0.create(ERROR, PRIVATE_MODIFIER); DiagnosticFactory0 BACKING_FIELD_IN_INTERFACE = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); - DiagnosticFactory1 INAPPLICABLE_LATEINIT_MODIFIER = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 INAPPLICABLE_LATEINIT_MODIFIER = DiagnosticFactory1.create(ERROR, LATEINIT_MODIFIER); DiagnosticFactory0 LATEINIT_INTRINSIC_CALL_ON_NON_LITERAL = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 LATEINIT_INTRINSIC_CALL_ON_NON_LATEINIT = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 LATEINIT_INTRINSIC_CALL_IN_INLINE_FUNCTION = DiagnosticFactory0.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt index 0fdcfeab2fd..d566252e9a0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt @@ -32,7 +32,7 @@ import org.jetbrains.kotlin.types.TypeUtils object LateinitModifierApplicabilityChecker { fun checkLateinitModifierApplicability(trace: BindingTrace, ktDeclaration: KtCallableDeclaration, descriptor: VariableDescriptor) { - val modifier = ktDeclaration.modifierList?.getModifier(KtTokens.LATEINIT_KEYWORD) ?: return + if (!ktDeclaration.hasModifier(KtTokens.LATEINIT_KEYWORD)) return val variables = when (descriptor) { is PropertyDescriptor -> "properties" @@ -43,37 +43,37 @@ object LateinitModifierApplicabilityChecker { val type = descriptor.type if (!descriptor.isVar) { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is allowed only on mutable $variables")) + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is allowed only on mutable $variables")) } if (type.isInlineClassType()) { if (UnsignedTypes.isUnsignedType(type)) { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on $variables of unsigned types")) + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on $variables of unsigned types")) } else { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on $variables of inline class types")) + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on $variables of inline class types")) } } if (type.isMarkedNullable) { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on $variables of nullable types")) + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on $variables of nullable types")) } else if (TypeUtils.isNullableType(type)) { trace.report( Errors.INAPPLICABLE_LATEINIT_MODIFIER.on( - modifier, + ktDeclaration, "is not allowed on $variables of a type with nullable upper bound" ) ) } if (KotlinBuiltIns.isPrimitiveType(type)) { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on $variables of primitive types")) + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on $variables of primitive types")) } if (ktDeclaration is KtProperty) { if (ktDeclaration.hasDelegateExpression()) { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on delegated properties")) + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on delegated properties")) } else if (ktDeclaration.hasInitializer()) { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on $variables with initializer")) + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on $variables with initializer")) } } @@ -84,28 +84,28 @@ object LateinitModifierApplicabilityChecker { val hasBackingField = trace.bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, descriptor) ?: false if (ktDeclaration is KtParameter) { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on primary constructor parameters")) + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on primary constructor parameters")) } if (isAbstract) { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on abstract properties")) + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on abstract properties")) } if (!hasDelegateExpressionOrInitializer) { if (hasAccessorImplementation) { trace.report( Errors.INAPPLICABLE_LATEINIT_MODIFIER.on( - modifier, + ktDeclaration, "is not allowed on properties with a custom getter or setter" ) ) } else if (!isAbstract && !hasBackingField) { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on properties without backing field")) + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on properties without backing field")) } } if (descriptor.extensionReceiverParameter != null) { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on extension properties")) + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on extension properties")) } } } diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 4739fc48607..bebe4e05a3a 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -1104,6 +1104,7 @@ fun main(args: Array) { testClass { val pattern = "^([\\w\\-_]+)\\.kt$" + model("quickfix/lateinit", pattern = pattern, filenameStartsLowerCase = true) model("quickfix/modifiers", pattern = pattern, filenameStartsLowerCase = true, recursive = false) model("quickfix/override/typeMismatchOnOverride", pattern = pattern, filenameStartsLowerCase = true, recursive = false) model("quickfix/variables/changeMutability", pattern = pattern, filenameStartsLowerCase = true, recursive = false) diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt index 34f90742c3b..10ac75dd750 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt @@ -37,6 +37,7 @@ class MainKtQuickFixRegistrar : KtQuickFixRegistrar() { private val mutability = KtQuickFixesListBuilder.registerPsiQuickFix { registerPsiQuickFix(ChangeVariableMutabilityFix.VAR_OVERRIDDEN_BY_VAL_FACTORY) + registerPsiQuickFix(ChangeVariableMutabilityFix.LATEINIT_VAL_FACTORY) } override val list: KtQuickFixesList = KtQuickFixesList.createCombined( diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java index 8422bcc0ff0..1cf3e270516 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java +++ b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java @@ -19,6 +19,49 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @RunWith(JUnit3RunnerWithInners.class) public class HighLevelQuickFixTestGenerated extends AbstractHighLevelQuickFixTest { + @TestMetadata("idea/testData/quickfix/lateinit") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Lateinit extends AbstractHighLevelQuickFixTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInLateinit() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/quickfix/lateinit"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), null, true); + } + + @TestMetadata("nullable.kt") + public void testNullable() throws Exception { + runTest("idea/testData/quickfix/lateinit/nullable.kt"); + } + + @TestMetadata("val.kt") + public void testVal() throws Exception { + runTest("idea/testData/quickfix/lateinit/val.kt"); + } + + @TestMetadata("withGetter.kt") + public void testWithGetter() throws Exception { + runTest("idea/testData/quickfix/lateinit/withGetter.kt"); + } + + @TestMetadata("withGetterSetter.kt") + public void testWithGetterSetter() throws Exception { + runTest("idea/testData/quickfix/lateinit/withGetterSetter.kt"); + } + + @TestMetadata("withInitializer.kt") + public void testWithInitializer() throws Exception { + runTest("idea/testData/quickfix/lateinit/withInitializer.kt"); + } + + @TestMetadata("withSetter.kt") + public void testWithSetter() throws Exception { + runTest("idea/testData/quickfix/lateinit/withSetter.kt"); + } + } + @TestMetadata("idea/testData/quickfix/modifiers") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 1a7aca65037..5c3d07e9d6b 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -372,7 +372,7 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val candidate: KtSymbol } - abstract class InapplicableLateinitModifier : KtFirDiagnostic() { + abstract class InapplicableLateinitModifier : KtFirDiagnostic() { override val diagnosticClass get() = InapplicableLateinitModifier::class abstract val reason: String } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 15b225a8cd3..d930ad9ee43 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -596,7 +596,7 @@ internal class InapplicableLateinitModifierImpl( override val reason: String, firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, -) : KtFirDiagnostic.InapplicableLateinitModifier(), KtAbstractFirDiagnostic { +) : KtFirDiagnostic.InapplicableLateinitModifier(), KtAbstractFirDiagnostic { override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt index c03c529824a..a40ffb4fa6a 100644 --- a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt @@ -64,9 +64,9 @@ class ChangeVariableMutabilityFix( listOf(ChangeVariableMutabilityFix(psiElement, false)) } - val LATEINIT_VAL_FACTORY: QuickFixesPsiBasedFactory = - quickFixesPsiBasedFactory { psiElement: PsiElement -> - val property = psiElement.getStrictParentOfType() ?: return@quickFixesPsiBasedFactory emptyList() + val LATEINIT_VAL_FACTORY: QuickFixesPsiBasedFactory = + quickFixesPsiBasedFactory { psiElement: KtModifierListOwner -> + val property = psiElement as? KtProperty ?: return@quickFixesPsiBasedFactory emptyList() if (property.valOrVarKeyword.text != "val") { emptyList() } else { diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt index da1ed5968b7..21d1c90a84b 100644 --- a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt @@ -121,8 +121,7 @@ class RemoveModifierFix( fun createRemoveLateinitFactory(): QuickFixesPsiBasedFactory { return quickFixesPsiBasedFactory { psiElement: PsiElement -> - val modifierList = psiElement.parent as? KtDeclarationModifierList ?: return@quickFixesPsiBasedFactory emptyList() - val property = modifierList.parent as? KtProperty ?: return@quickFixesPsiBasedFactory emptyList() + val property = psiElement as? KtProperty ?: return@quickFixesPsiBasedFactory emptyList() if (!property.hasModifier(KtTokens.LATEINIT_KEYWORD)) return@quickFixesPsiBasedFactory emptyList() listOf(RemoveModifierFix(property, KtTokens.LATEINIT_KEYWORD, isRedundant = false)) } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertLateinitPropertyToNotNullDelegateFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertLateinitPropertyToNotNullDelegateFix.kt index 9777abe886a..d68c693fc39 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertLateinitPropertyToNotNullDelegateFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ConvertLateinitPropertyToNotNullDelegateFix.kt @@ -40,8 +40,7 @@ class ConvertLateinitPropertyToNotNullDelegateFix( companion object : KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { - val modifierList = diagnostic.psiElement.parent as? KtDeclarationModifierList ?: return null - val property = modifierList.parent as? KtProperty ?: return null + val property = diagnostic.psiElement as? KtProperty ?: return null if (!property.hasModifier(KtTokens.LATEINIT_KEYWORD) || !property.isVar || property.hasInitializer()) return null val typeReference = property.typeReference ?: return null val type = property.analyze(BodyResolveMode.PARTIAL)[BindingContext.TYPE, typeReference] ?: return null diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveNullableFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveNullableFix.kt index 5f1410130ba..1e089db92f9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveNullableFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveNullableFix.kt @@ -58,8 +58,7 @@ class RemoveNullableFix( object LATEINIT_FACTORY : KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { - val lateinitElement = Errors.INAPPLICABLE_LATEINIT_MODIFIER.cast(diagnostic).psiElement - val property = lateinitElement.getStrictParentOfType() ?: return null + val property = Errors.INAPPLICABLE_LATEINIT_MODIFIER.cast(diagnostic).psiElement as? KtProperty ?: return null val typeReference = property.typeReference ?: return null val typeElement = (typeReference.typeElement ?: return null) as? KtNullableType ?: return null if (typeElement.innerType == null) return null diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemovePartsFromPropertyFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemovePartsFromPropertyFix.kt index f63ee42f68b..22ae0ca6739 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemovePartsFromPropertyFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemovePartsFromPropertyFix.kt @@ -118,8 +118,7 @@ open class RemovePartsFromPropertyFix( object LateInitFactory : KotlinSingleIntentionActionFactory() { public override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { - val element = Errors.INAPPLICABLE_LATEINIT_MODIFIER.cast(diagnostic).psiElement - val property = PsiTreeUtil.getParentOfType(element, KtProperty::class.java) ?: return null + val property = Errors.INAPPLICABLE_LATEINIT_MODIFIER.cast(diagnostic).psiElement as? KtProperty ?: return null val hasInitializer = property.hasInitializer() val hasGetter = property.getter?.bodyExpression != null val hasSetter = property.setter?.bodyExpression != null diff --git a/idea/testData/checker/diagnosticsMessage/lateinitOfATypeWithNullableUpperBound.kt b/idea/testData/checker/diagnosticsMessage/lateinitOfATypeWithNullableUpperBound.kt index fed09f7e74c..bfbf3840fb1 100644 --- a/idea/testData/checker/diagnosticsMessage/lateinitOfATypeWithNullableUpperBound.kt +++ b/idea/testData/checker/diagnosticsMessage/lateinitOfATypeWithNullableUpperBound.kt @@ -1,3 +1,5 @@ +// FIR_COMPARISON + class C() { lateinit var item: V } \ No newline at end of file diff --git a/idea/testData/quickfix/lateinit/val.kt b/idea/testData/quickfix/lateinit/val.kt index dfa0119c891..07ea795d46d 100644 --- a/idea/testData/quickfix/lateinit/val.kt +++ b/idea/testData/quickfix/lateinit/val.kt @@ -2,4 +2,5 @@ class A() { lateinit val foo: String -} \ No newline at end of file +} +/* FIR_COMPARISON */ \ No newline at end of file diff --git a/idea/testData/quickfix/lateinit/val.kt.after b/idea/testData/quickfix/lateinit/val.kt.after index 10f4bff685f..be37d2414fd 100644 --- a/idea/testData/quickfix/lateinit/val.kt.after +++ b/idea/testData/quickfix/lateinit/val.kt.after @@ -2,4 +2,5 @@ class A() { lateinit var foo: String -} \ No newline at end of file +} +/* FIR_COMPARISON */ \ No newline at end of file