[SLC] fix PsiJavaCodeReferenceElement contract violation
We should provide valid getReferenceName as it is used in many places (e.g. from com.intellij.psi.impl.PsiImplUtil.findAnnotation) ^KT-61605 Fixed ^KT-64605 Fixed
This commit is contained in:
committed by
Space Team
parent
b33798d65a
commit
50dd94502b
+25
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.light.classes.symbol.annotations
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides additional information for [SymbolLightPsiJavaCodeReferenceElementBase][org.jetbrains.kotlin.light.classes.symbol.codeReferences.SymbolLightPsiJavaCodeReferenceElementBase]
|
||||||
|
* to reach better API coverage of [com.intellij.psi.PsiReference]
|
||||||
|
*
|
||||||
|
* @see org.jetbrains.kotlin.light.classes.symbol.codeReferences.SymbolLightPsiJavaCodeReferenceElementBase
|
||||||
|
* @see ReferenceInformationHolder
|
||||||
|
*/
|
||||||
|
internal interface ReferenceInformationProvider {
|
||||||
|
/**
|
||||||
|
* @see com.intellij.psi.PsiQualifiedReference.getReferenceName
|
||||||
|
*/
|
||||||
|
val referenceName: String?
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ReferenceInformationProvider
|
||||||
|
*/
|
||||||
|
internal class ReferenceInformationHolder(override val referenceName: String?) : ReferenceInformationProvider
|
||||||
+6
-3
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -34,10 +34,13 @@ internal abstract class SymbolLightAbstractAnnotation(parent: PsiElement) :
|
|||||||
val reference = (kotlinOrigin as? KtAnnotationEntry)?.typeReference?.reference
|
val reference = (kotlinOrigin as? KtAnnotationEntry)?.typeReference?.reference
|
||||||
?: (kotlinOrigin?.calleeExpression?.nameReference)?.references?.firstOrNull()
|
?: (kotlinOrigin?.calleeExpression?.nameReference)?.references?.firstOrNull()
|
||||||
|
|
||||||
if (reference != null) SymbolLightPsiJavaCodeReferenceElementWithReference(ktElement, reference)
|
val provider = createReferenceInformationProvider()
|
||||||
else SymbolLightPsiJavaCodeReferenceElementWithNoReference(ktElement)
|
if (reference != null) SymbolLightPsiJavaCodeReferenceElementWithReference(ktElement, reference, provider)
|
||||||
|
else SymbolLightPsiJavaCodeReferenceElementWithNoReference(ktElement, provider)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract fun createReferenceInformationProvider(): ReferenceInformationProvider
|
||||||
|
|
||||||
override fun getNameReferenceElement(): PsiJavaCodeReferenceElement = _nameReferenceElement
|
override fun getNameReferenceElement(): PsiJavaCodeReferenceElement = _nameReferenceElement
|
||||||
|
|
||||||
override fun delete() {
|
override fun delete() {
|
||||||
|
|||||||
+5
-1
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -17,6 +17,10 @@ internal open class SymbolLightJavaAnnotation(
|
|||||||
owner: PsiModifierList,
|
owner: PsiModifierList,
|
||||||
private val argumentsComputer: SymbolLightJavaAnnotation.() -> List<KtNamedAnnotationValue>,
|
private val argumentsComputer: SymbolLightJavaAnnotation.() -> List<KtNamedAnnotationValue>,
|
||||||
) : SymbolLightAbstractAnnotation(owner) {
|
) : SymbolLightAbstractAnnotation(owner) {
|
||||||
|
override fun createReferenceInformationProvider(): ReferenceInformationProvider = ReferenceInformationHolder(
|
||||||
|
referenceName = javaQualifier.substringAfterLast('.'),
|
||||||
|
)
|
||||||
|
|
||||||
override val kotlinOrigin: KtCallElement? get() = originalLightAnnotation.kotlinOrigin
|
override val kotlinOrigin: KtCallElement? get() = originalLightAnnotation.kotlinOrigin
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean = other === this ||
|
override fun equals(other: Any?): Boolean = other === this ||
|
||||||
|
|||||||
+5
-1
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -28,6 +28,10 @@ internal class SymbolLightLazyAnnotation(
|
|||||||
|
|
||||||
private val fqName: FqName = classId.asSingleFqName()
|
private val fqName: FqName = classId.asSingleFqName()
|
||||||
|
|
||||||
|
override fun createReferenceInformationProvider(): ReferenceInformationProvider = ReferenceInformationHolder(
|
||||||
|
referenceName = classId.shortClassName.asString(),
|
||||||
|
)
|
||||||
|
|
||||||
val annotationApplicationWithArgumentsInfo: Lazy<KtAnnotationApplicationWithArgumentsInfo> =
|
val annotationApplicationWithArgumentsInfo: Lazy<KtAnnotationApplicationWithArgumentsInfo> =
|
||||||
(annotationApplication as? KtAnnotationApplicationWithArgumentsInfo)?.let(::lazyOf) ?: lazyPub {
|
(annotationApplication as? KtAnnotationApplicationWithArgumentsInfo)?.let(::lazyOf) ?: lazyPub {
|
||||||
val applications = annotationsProvider[classId]
|
val applications = annotationsProvider[classId]
|
||||||
|
|||||||
+4
-1
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -17,6 +17,9 @@ internal class SymbolLightSimpleAnnotation(
|
|||||||
private val arguments: List<KtNamedAnnotationValue> = listOf(),
|
private val arguments: List<KtNamedAnnotationValue> = listOf(),
|
||||||
override val kotlinOrigin: KtCallElement? = null,
|
override val kotlinOrigin: KtCallElement? = null,
|
||||||
) : SymbolLightAbstractAnnotation(parent) {
|
) : SymbolLightAbstractAnnotation(parent) {
|
||||||
|
override fun createReferenceInformationProvider(): ReferenceInformationProvider = ReferenceInformationHolder(
|
||||||
|
referenceName = fqName?.substringAfterLast('.'),
|
||||||
|
)
|
||||||
|
|
||||||
override fun getQualifiedName(): String? = fqName
|
override fun getQualifiedName(): String? = fqName
|
||||||
|
|
||||||
|
|||||||
+8
-3
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub
|
|||||||
import org.jetbrains.kotlin.asJava.elements.KtLightField
|
import org.jetbrains.kotlin.asJava.elements.KtLightField
|
||||||
import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier
|
import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier
|
||||||
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
|
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
|
||||||
|
import org.jetbrains.kotlin.light.classes.symbol.annotations.ReferenceInformationHolder
|
||||||
import org.jetbrains.kotlin.light.classes.symbol.cachedValue
|
import org.jetbrains.kotlin.light.classes.symbol.cachedValue
|
||||||
import org.jetbrains.kotlin.light.classes.symbol.codeReferences.SymbolLightPsiJavaCodeReferenceElementWithNoReference
|
import org.jetbrains.kotlin.light.classes.symbol.codeReferences.SymbolLightPsiJavaCodeReferenceElementWithNoReference
|
||||||
import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForEnumEntry
|
import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForEnumEntry
|
||||||
@@ -29,8 +30,12 @@ internal class SymbolLightClassForEnumEntry(
|
|||||||
) : SymbolLightClassBase(ktModule, enumConstant.manager), PsiEnumConstantInitializer {
|
) : SymbolLightClassBase(ktModule, enumConstant.manager), PsiEnumConstantInitializer {
|
||||||
override fun getBaseClassType(): PsiClassType = enumConstant.type as PsiClassType //???TODO
|
override fun getBaseClassType(): PsiClassType = enumConstant.type as PsiClassType //???TODO
|
||||||
|
|
||||||
override fun getBaseClassReference(): PsiJavaCodeReferenceElement =
|
override fun getBaseClassReference(): PsiJavaCodeReferenceElement = SymbolLightPsiJavaCodeReferenceElementWithNoReference(
|
||||||
SymbolLightPsiJavaCodeReferenceElementWithNoReference(enumConstant) //???TODO
|
enumConstant,
|
||||||
|
ReferenceInformationHolder(
|
||||||
|
referenceName = enumConstant.name,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
override fun getArgumentList(): PsiExpressionList? = null
|
override fun getArgumentList(): PsiExpressionList? = null
|
||||||
|
|
||||||
|
|||||||
+10
-6
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -7,11 +7,12 @@ package org.jetbrains.kotlin.light.classes.symbol.codeReferences
|
|||||||
|
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
import com.intellij.psi.scope.PsiScopeProcessor
|
import com.intellij.psi.scope.PsiScopeProcessor
|
||||||
|
import org.jetbrains.kotlin.light.classes.symbol.annotations.ReferenceInformationProvider
|
||||||
|
|
||||||
internal abstract class SymbolLightPsiJavaCodeReferenceElementBase(private val ktElement: PsiElement) :
|
internal sealed class SymbolLightPsiJavaCodeReferenceElementBase(
|
||||||
PsiElement by ktElement,
|
private val ktElement: PsiElement,
|
||||||
PsiJavaCodeReferenceElement {
|
private val referenceInformationProvider: ReferenceInformationProvider,
|
||||||
|
) : PsiElement by ktElement, PsiJavaCodeReferenceElement {
|
||||||
override fun multiResolve(incompleteCode: Boolean): Array<JavaResolveResult> = JavaResolveResult.EMPTY_ARRAY
|
override fun multiResolve(incompleteCode: Boolean): Array<JavaResolveResult> = JavaResolveResult.EMPTY_ARRAY
|
||||||
|
|
||||||
override fun processVariants(processor: PsiScopeProcessor) {}
|
override fun processVariants(processor: PsiScopeProcessor) {}
|
||||||
@@ -20,7 +21,10 @@ internal abstract class SymbolLightPsiJavaCodeReferenceElementBase(private val k
|
|||||||
|
|
||||||
override fun getQualifier(): PsiElement? = null
|
override fun getQualifier(): PsiElement? = null
|
||||||
|
|
||||||
override fun getReferenceName(): String? = null
|
/**
|
||||||
|
* @see com.intellij.psi.impl.PsiImplUtil.findAnnotation
|
||||||
|
*/
|
||||||
|
override fun getReferenceName(): String? = referenceInformationProvider.referenceName
|
||||||
|
|
||||||
override fun getReferenceNameElement(): PsiElement? = null
|
override fun getReferenceNameElement(): PsiElement? = null
|
||||||
|
|
||||||
|
|||||||
+6
-4
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -9,10 +9,12 @@ import com.intellij.openapi.util.TextRange
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiReference
|
import com.intellij.psi.PsiReference
|
||||||
import com.intellij.util.IncorrectOperationException
|
import com.intellij.util.IncorrectOperationException
|
||||||
|
import org.jetbrains.kotlin.light.classes.symbol.annotations.ReferenceInformationProvider
|
||||||
|
|
||||||
internal class SymbolLightPsiJavaCodeReferenceElementWithNoReference(private val ktElement: PsiElement) :
|
internal class SymbolLightPsiJavaCodeReferenceElementWithNoReference(
|
||||||
SymbolLightPsiJavaCodeReferenceElementBase(ktElement),
|
private val ktElement: PsiElement,
|
||||||
PsiReference {
|
referenceInformationProvider: ReferenceInformationProvider,
|
||||||
|
) : SymbolLightPsiJavaCodeReferenceElementBase(ktElement, referenceInformationProvider), PsiReference {
|
||||||
|
|
||||||
override fun getElement(): PsiElement = ktElement
|
override fun getElement(): PsiElement = ktElement
|
||||||
|
|
||||||
|
|||||||
+14
-4
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -7,10 +7,20 @@ package org.jetbrains.kotlin.light.classes.symbol.codeReferences
|
|||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiReference
|
import com.intellij.psi.PsiReference
|
||||||
|
import org.jetbrains.kotlin.light.classes.symbol.annotations.ReferenceInformationProvider
|
||||||
|
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
||||||
|
|
||||||
internal class SymbolLightPsiJavaCodeReferenceElementWithReference(private val ktElement: PsiElement, reference: PsiReference) :
|
internal class SymbolLightPsiJavaCodeReferenceElementWithReference(
|
||||||
SymbolLightPsiJavaCodeReferenceElementBase(ktElement),
|
private val ktElement: PsiElement,
|
||||||
|
private val reference: PsiReference,
|
||||||
|
referenceInformationProvider: ReferenceInformationProvider,
|
||||||
|
) : SymbolLightPsiJavaCodeReferenceElementBase(ktElement, referenceInformationProvider),
|
||||||
PsiReference by reference {
|
PsiReference by reference {
|
||||||
|
|
||||||
override fun getElement(): PsiElement = ktElement
|
override fun getElement(): PsiElement = ktElement
|
||||||
}
|
|
||||||
|
private val nameExpression: KtSimpleNameExpression? get() = reference.element as? KtSimpleNameExpression
|
||||||
|
|
||||||
|
override fun getReferenceName(): String? = super.getReferenceName() ?: nameExpression?.getReferencedName()
|
||||||
|
override fun getReferenceNameElement(): PsiElement? = nameExpression?.getReferencedNameElement()
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user