From 0602a6da720613b029a4d11562f34e9348113ced Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Wed, 3 Jul 2019 16:09:28 +0300 Subject: [PATCH] Fix invalid FakeJvmFieldConstant inspection for UL classes Test MultiFileInspectionTestGenerated.testFakeJvmFieldConstant_FakeJvmFieldConstant now correctly works with ultra-light annotation classes. --- .../kotlin/asJava/classes/ultraLightClass.kt | 4 ++-- .../kotlin/asJava/classes/ultraLightEnumEntry.kt | 2 +- .../kotlin/asJava/classes/ultraLightField.kt | 16 +++++++++++----- .../asJava/classes/ultraLightMembersCreator.kt | 2 +- .../kotlin/asJava/elements/KtLightElements.kt | 4 ++++ .../kotlin/asJava/elements/KtLightFieldImpl.kt | 9 +++++---- .../FakeJvmFieldConstantInspection.kt | 5 +++-- .../idea/quickfix/CommonIntentionActionsTest.kt | 4 ++-- 8 files changed, 29 insertions(+), 17 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt index c0b345390b1..f3c3847ff7b 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt @@ -175,7 +175,7 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor this.classOrObject.companionObjects.firstOrNull()?.let { companion -> result.add( - KtUltraLightField( + KtUltraLightFieldForSourceDeclaration( companion, membersBuilder.generateUniqueFieldName(companion.name.orEmpty(), usedNames), this, @@ -211,7 +211,7 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor if (isNamedObject()) { result.add( - KtUltraLightField( + KtUltraLightFieldForSourceDeclaration( this.classOrObject, JvmAbi.INSTANCE_FIELD, this, diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightEnumEntry.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightEnumEntry.kt index 3ec76fdda92..526533753d2 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightEnumEntry.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightEnumEntry.kt @@ -14,7 +14,7 @@ internal class KtUltraLightEnumEntry( containingClass: KtLightClass, support: KtUltraLightSupport, modifiers: Set -) : KtUltraLightField(declaration, name, containingClass, support, modifiers), PsiEnumConstant { +) : KtUltraLightFieldImpl(declaration, name, containingClass, support, modifiers), PsiEnumConstant { private val enumEntry get() = declaration as KtEnumEntry diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightField.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightField.kt index e764a8546ab..248d69f05e3 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightField.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightField.kt @@ -12,10 +12,7 @@ import com.intellij.psi.util.TypeConversionUtil import org.jetbrains.annotations.NonNls import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration -import org.jetbrains.kotlin.asJava.elements.KtLightElement -import org.jetbrains.kotlin.asJava.elements.KtLightField -import org.jetbrains.kotlin.asJava.elements.KtLightSimpleModifierList -import org.jetbrains.kotlin.asJava.elements.KtUltraLightSimpleModifierList +import org.jetbrains.kotlin.asJava.elements.* import org.jetbrains.kotlin.codegen.PropertyCodegen import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor @@ -54,7 +51,16 @@ private class KtUltraLightSimpleModifierListField( override fun copy() = KtUltraLightSimpleModifierListField(support, declaration, owner, modifiers) } -internal open class KtUltraLightField( +internal class KtUltraLightFieldForSourceDeclaration( + declaration: KtNamedDeclaration, + name: String, + containingClass: KtLightClass, + support: KtUltraLightSupport, + modifiers: Set +) : KtUltraLightFieldImpl(declaration, name, containingClass, support, modifiers), + KtLightFieldForSourceDeclarationSupport + +internal open class KtUltraLightFieldImpl protected constructor( protected val declaration: KtNamedDeclaration, name: String, private val containingClass: KtLightClass, diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMembersCreator.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMembersCreator.kt index be5c219c404..71f3cff38b5 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMembersCreator.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMembersCreator.kt @@ -91,7 +91,7 @@ internal class UltraLightMembersCreator( modifiers.add(PsiModifier.STATIC) } - return KtUltraLightField(variable, fieldName, containingClass, support, modifiers) + return KtUltraLightFieldForSourceDeclaration(variable, fieldName, containingClass, support, modifiers) } private fun hasBackingField(property: KtProperty): Boolean { diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightElements.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightElements.kt index fa25ef06b5f..9bd703c4709 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightElements.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightElements.kt @@ -48,6 +48,10 @@ interface KtLightMember : PsiMember, KtLightDeclaration, PsiVariableEx +interface KtLightFieldForSourceDeclarationSupport : PsiField { + val kotlinOrigin: KtDeclaration? +} + interface KtLightMethod : PsiAnnotationMethod, KtLightMember { val isDelegated: Boolean get() = lightMemberOrigin?.originKind == JvmDeclarationOriginKind.DELEGATION diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightFieldImpl.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightFieldImpl.kt index 0ba552e8d6f..9b086fa5e94 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightFieldImpl.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightFieldImpl.kt @@ -102,13 +102,14 @@ sealed class KtLightFieldImpl( override fun resolveMethodGenerics() = clsDelegate.resolveMethodGenerics() } - class KtLightFieldForDeclaration(origin: LightMemberOrigin?, computeDelegate: () -> PsiField, containingClass: KtLightClass, dummyDelegate: PsiField?) : - KtLightFieldImpl(origin, computeDelegate, containingClass, dummyDelegate) + class KtLightFieldForSourceDeclaration(origin: LightMemberOrigin?, computeDelegate: () -> PsiField, containingClass: KtLightClass, dummyDelegate: PsiField?) : + KtLightFieldImpl(origin, computeDelegate, containingClass, dummyDelegate), + KtLightFieldForSourceDeclarationSupport companion object Factory { fun create(origin: LightMemberOrigin?, delegate: PsiField, containingClass: KtLightClass): KtLightField = when (delegate) { is PsiEnumConstant -> KtLightEnumConstant(origin, { delegate }, containingClass, null) - else -> KtLightFieldForDeclaration(origin, { delegate }, containingClass, null) + else -> KtLightFieldForSourceDeclaration(origin, { delegate }, containingClass, null) } fun lazy( @@ -121,7 +122,7 @@ sealed class KtLightFieldImpl( @Suppress("UNCHECKED_CAST") return KtLightEnumConstant(origin, computeRealDelegate as () -> PsiEnumConstant, containingClass, dummyDelegate) } - return KtLightFieldForDeclaration(origin, computeRealDelegate, containingClass, dummyDelegate) + return KtLightFieldForSourceDeclaration(origin, computeRealDelegate, containingClass, dummyDelegate) } fun fromClsFields(delegateClass: PsiClass, containingClass: KtLightClass) = delegateClass.fields.map { diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/FakeJvmFieldConstantInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/FakeJvmFieldConstantInspection.kt index 6c149027800..ad4b75655b5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/FakeJvmFieldConstantInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/FakeJvmFieldConstantInspection.kt @@ -21,7 +21,7 @@ import com.intellij.codeInspection.LocalQuickFix import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.ProblemsHolder import com.intellij.psi.* -import org.jetbrains.kotlin.asJava.elements.KtLightFieldImpl.KtLightFieldForDeclaration +import org.jetbrains.kotlin.asJava.elements.KtLightFieldForSourceDeclarationSupport import org.jetbrains.kotlin.idea.inspections.MayBeConstantInspection.Status.* import org.jetbrains.kotlin.idea.quickfix.AddConstModifierFix import org.jetbrains.kotlin.psi.KtProperty @@ -80,7 +80,8 @@ class FakeJvmFieldConstantInspection : AbstractKotlinInspection() { holder: ProblemsHolder, additionalTypeCheck: (PsiType) -> Boolean = { true } ) { - val resolvedLightField = (valueExpression as? PsiReference)?.resolve() as? KtLightFieldForDeclaration ?: return + val resolvedLightField = (valueExpression as? PsiReference)?.resolve() as? KtLightFieldForSourceDeclarationSupport + ?: return val resolvedProperty = resolvedLightField.kotlinOrigin as? KtProperty ?: return with(MayBeConstantInspection) { if (resolvedProperty.annotationEntries.isEmpty()) return diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/CommonIntentionActionsTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/CommonIntentionActionsTest.kt index b193492f854..20bbf1f2ae0 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/CommonIntentionActionsTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/CommonIntentionActionsTest.kt @@ -284,7 +284,7 @@ class CommonIntentionActionsTest : LightPlatformCodeInsightFixtureTestCase() { TestCase.assertEquals( "KtUltraLightMethodForSourceDeclaration -> org.jetbrains.annotations.NotNull," + - " KtUltraLightField -> pkg.myannotation.JavaAnnotation, org.jetbrains.annotations.NotNull", + " KtUltraLightFieldForSourceDeclaration -> pkg.myannotation.JavaAnnotation, org.jetbrains.annotations.NotNull", annotationsString(myFixture.findElementByText("bar", KtModifierListOwner::class.java)) ) } @@ -336,7 +336,7 @@ class CommonIntentionActionsTest : LightPlatformCodeInsightFixtureTestCase() { TestCase.assertEquals( "KtUltraLightMethodForSourceDeclaration -> org.jetbrains.annotations.NotNull," + - " KtUltraLightField -> pkg.myannotation.JavaAnnotation, org.jetbrains.annotations.NotNull", + " KtUltraLightFieldForSourceDeclaration -> pkg.myannotation.JavaAnnotation, org.jetbrains.annotations.NotNull", annotationsString(myFixture.findElementByText("bar", KtModifierListOwner::class.java)) ) }