From 4e44804c775d0397c9ad5c5703a7ff95024c09bd Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Fri, 12 Feb 2021 21:56:39 +0000 Subject: [PATCH] FIR IDE: Add quickfix for INAPPLICABLE_LATEINIT_MODIFIER. Also changed FE1.0 checker and all related fix factories to report error on the declaration instead of the lateinit modifier. This is consistent with the direction of all checkers in FIR (no reporting on modifiers). --- .../generator/diagnostics/DiagnosticData.kt | 1 + .../diagnostics/FirDiagnosticsList.kt | 2 +- .../fir/analysis/diagnostics/FirErrors.kt | 2 +- .../jetbrains/kotlin/diagnostics/Errors.java | 2 +- .../LateinitModifierApplicabilityChecker.kt | 28 ++++++------ .../kotlin/generators/tests/GenerateTests.kt | 1 + .../idea/quickfix/MainKtQuickFixRegistrar.kt | 1 + .../HighLevelQuickFixTestGenerated.java | 43 +++++++++++++++++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 2 +- .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 2 +- .../quickfix/ChangeVariableMutabilityFix.kt | 6 +-- .../kotlin/idea/quickfix/RemoveModifierFix.kt | 3 +- ...ertLateinitPropertyToNotNullDelegateFix.kt | 3 +- .../kotlin/idea/quickfix/RemoveNullableFix.kt | 3 +- .../quickfix/RemovePartsFromPropertyFix.kt | 3 +- .../lateinitOfATypeWithNullableUpperBound.kt | 2 + idea/testData/quickfix/lateinit/val.kt | 3 +- idea/testData/quickfix/lateinit/val.kt.after | 3 +- 18 files changed, 78 insertions(+), 32 deletions(-) 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