Fix invalid FakeJvmFieldConstant inspection for UL classes
Test MultiFileInspectionTestGenerated.testFakeJvmFieldConstant_FakeJvmFieldConstant now correctly works with ultra-light annotation classes.
This commit is contained in:
@@ -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,
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ internal class KtUltraLightEnumEntry(
|
||||
containingClass: KtLightClass,
|
||||
support: KtUltraLightSupport,
|
||||
modifiers: Set<String>
|
||||
) : KtUltraLightField(declaration, name, containingClass, support, modifiers), PsiEnumConstant {
|
||||
) : KtUltraLightFieldImpl(declaration, name, containingClass, support, modifiers), PsiEnumConstant {
|
||||
|
||||
private val enumEntry get() = declaration as KtEnumEntry
|
||||
|
||||
|
||||
@@ -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<String>
|
||||
) : KtUltraLightFieldImpl(declaration, name, containingClass, support, modifiers),
|
||||
KtLightFieldForSourceDeclarationSupport
|
||||
|
||||
internal open class KtUltraLightFieldImpl protected constructor(
|
||||
protected val declaration: KtNamedDeclaration,
|
||||
name: String,
|
||||
private val containingClass: KtLightClass,
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
@@ -48,6 +48,10 @@ interface KtLightMember<out D : PsiMember> : PsiMember, KtLightDeclaration<KtDec
|
||||
|
||||
interface KtLightField : PsiField, KtLightMember<PsiField>, PsiVariableEx
|
||||
|
||||
interface KtLightFieldForSourceDeclarationSupport : PsiField {
|
||||
val kotlinOrigin: KtDeclaration?
|
||||
}
|
||||
|
||||
interface KtLightMethod : PsiAnnotationMethod, KtLightMember<PsiMethod> {
|
||||
val isDelegated: Boolean
|
||||
get() = lightMemberOrigin?.originKind == JvmDeclarationOriginKind.DELEGATION
|
||||
|
||||
@@ -102,13 +102,14 @@ sealed class KtLightFieldImpl<D : PsiField>(
|
||||
override fun resolveMethodGenerics() = clsDelegate.resolveMethodGenerics()
|
||||
}
|
||||
|
||||
class KtLightFieldForDeclaration(origin: LightMemberOrigin?, computeDelegate: () -> PsiField, containingClass: KtLightClass, dummyDelegate: PsiField?) :
|
||||
KtLightFieldImpl<PsiField>(origin, computeDelegate, containingClass, dummyDelegate)
|
||||
class KtLightFieldForSourceDeclaration(origin: LightMemberOrigin?, computeDelegate: () -> PsiField, containingClass: KtLightClass, dummyDelegate: PsiField?) :
|
||||
KtLightFieldImpl<PsiField>(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<D : PsiField>(
|
||||
@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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user