[FIR IDE] LC More accurate processing for JvmSynthetic and JvmHidden annotations
This commit is contained in:
+3
-1
@@ -10,7 +10,9 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
|
||||
|
||||
sealed class KtPropertyAccessorSymbol : KtCallableSymbol(),
|
||||
KtSymbolWithModality<KtCommonSymbolModality>,
|
||||
KtSymbolWithVisibility {
|
||||
KtSymbolWithVisibility,
|
||||
KtAnnotatedSymbol {
|
||||
|
||||
abstract val isDefault: Boolean
|
||||
abstract val isInline: Boolean
|
||||
abstract val isOverride: Boolean
|
||||
|
||||
+7
-6
@@ -16,11 +16,12 @@ import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.mapAnnotationParameters
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertySymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotatedSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSimpleConstantValue
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
|
||||
internal fun KtAnnotatedSymbol.hasJvmSyntheticAnnotation(annotationUseSiteTarget: AnnotationUseSiteTarget?): Boolean =
|
||||
internal fun KtAnnotatedSymbol.hasJvmSyntheticAnnotation(annotationUseSiteTarget: AnnotationUseSiteTarget? = null): Boolean =
|
||||
hasAnnotation("kotlin/jvm/JvmSynthetic", annotationUseSiteTarget)
|
||||
|
||||
internal fun KtAnnotatedSymbol.getJvmNameFromAnnotation(annotationUseSiteTarget: AnnotationUseSiteTarget? = null): String? {
|
||||
@@ -35,15 +36,14 @@ internal fun KtAnnotatedSymbol.getJvmNameFromAnnotation(annotationUseSiteTarget:
|
||||
}
|
||||
}
|
||||
|
||||
internal fun KtAnnotatedSymbol.isHiddenByDeprecation(annotationUseSiteTarget: AnnotationUseSiteTarget?): Boolean {
|
||||
internal fun KtAnnotatedSymbol.isHiddenByDeprecation(annotationUseSiteTarget: AnnotationUseSiteTarget? = null): Boolean {
|
||||
require(this is KtFirSymbol<*>)
|
||||
|
||||
return this.firRef.withFir(FirResolvePhase.TYPES) {
|
||||
if (it !is FirAnnotatedDeclaration) return@withFir false
|
||||
|
||||
val deprecatedAnnotationCall = it.annotations.firstOrNull { annotationCall ->
|
||||
val siteTarget = annotationCall.useSiteTarget
|
||||
(siteTarget == null || siteTarget == annotationUseSiteTarget) &&
|
||||
annotationCall.useSiteTarget == annotationUseSiteTarget &&
|
||||
annotationCall.classId?.asString() == "kotlin/Deprecated"
|
||||
} ?: return@withFir false
|
||||
|
||||
@@ -56,6 +56,8 @@ internal fun KtAnnotatedSymbol.isHiddenByDeprecation(annotationUseSiteTarget: An
|
||||
}
|
||||
}
|
||||
|
||||
internal fun KtAnnotatedSymbol.isHiddenOrSynthetic(annotationUseSiteTarget: AnnotationUseSiteTarget? = null) =
|
||||
isHiddenByDeprecation(annotationUseSiteTarget) || hasJvmSyntheticAnnotation(annotationUseSiteTarget)
|
||||
|
||||
internal fun KtAnnotatedSymbol.hasJvmFieldAnnotation(): Boolean =
|
||||
hasAnnotation("kotlin/jvm/JvmField", null)
|
||||
@@ -77,8 +79,7 @@ internal fun KtAnnotatedSymbol.hasInlineOnlyAnnotation(): Boolean =
|
||||
|
||||
internal fun KtAnnotatedSymbol.hasAnnotation(classIdString: String, annotationUseSiteTarget: AnnotationUseSiteTarget?): Boolean =
|
||||
annotations.any {
|
||||
val siteTarget = it.useSiteTarget
|
||||
(siteTarget == null || siteTarget == annotationUseSiteTarget) && it.classId?.asString() == classIdString
|
||||
it.useSiteTarget == annotationUseSiteTarget && it.classId?.asString() == classIdString
|
||||
}
|
||||
|
||||
internal fun KtAnnotatedSymbol.computeAnnotations(
|
||||
|
||||
+9
-9
@@ -104,14 +104,10 @@ internal fun FirLightClassBase.createMethods(
|
||||
) {
|
||||
for (declaration in declarations) {
|
||||
|
||||
if (declaration is KtFunctionSymbol && declaration.isInline) continue
|
||||
|
||||
if (declaration is KtAnnotatedSymbol && declaration.hasJvmSyntheticAnnotation(annotationUseSiteTarget = null)) continue
|
||||
|
||||
if (declaration is KtAnnotatedSymbol && declaration.isHiddenByDeprecation(annotationUseSiteTarget = null)) continue
|
||||
|
||||
when (declaration) {
|
||||
is KtFunctionSymbol -> {
|
||||
if (declaration.isInline || declaration.isHiddenOrSynthetic()) continue
|
||||
|
||||
var methodIndex = METHOD_INDEX_BASE
|
||||
result.add(
|
||||
FirLightSimpleMethodForSymbol(
|
||||
@@ -147,6 +143,7 @@ internal fun FirLightClassBase.createMethods(
|
||||
}
|
||||
}
|
||||
is KtConstructorSymbol -> {
|
||||
if (declaration.isHiddenOrSynthetic()) continue
|
||||
result.add(
|
||||
FirLightConstructorForSymbol(
|
||||
constructorSymbol = declaration,
|
||||
@@ -164,8 +161,9 @@ internal fun FirLightClassBase.createMethods(
|
||||
fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean {
|
||||
if (isInline) return false
|
||||
if (!hasBody && visibility == KtSymbolVisibility.PRIVATE) return false
|
||||
return !declaration.hasJvmSyntheticAnnotation(siteTarget)
|
||||
&& !declaration.isHiddenByDeprecation(siteTarget)
|
||||
if (declaration.isHiddenOrSynthetic(siteTarget)) return false
|
||||
if (isHiddenOrSynthetic()) return false
|
||||
return true
|
||||
}
|
||||
|
||||
val getter = declaration.getter?.takeIf {
|
||||
@@ -212,13 +210,15 @@ internal fun FirLightClassBase.createField(
|
||||
takePropertyVisibility: Boolean,
|
||||
result: MutableList<KtLightField>
|
||||
) {
|
||||
|
||||
fun hasBackingField(property: KtPropertySymbol): Boolean = when (property) {
|
||||
is KtSyntheticJavaPropertySymbol -> true
|
||||
is KtKotlinPropertySymbol -> when {
|
||||
property.modality == KtCommonSymbolModality.ABSTRACT -> false
|
||||
property.isHiddenOrSynthetic() -> false
|
||||
property.isLateInit -> true
|
||||
//IS PARAMETER -> true
|
||||
!property.hasGetter && !property.hasSetter -> true
|
||||
property.getter == null && property.setter == null -> true
|
||||
property.hasJvmSyntheticAnnotation(AnnotationUseSiteTarget.FIELD) -> false
|
||||
else -> property.hasBackingField
|
||||
}
|
||||
|
||||
+5
@@ -13,9 +13,11 @@ import org.jetbrains.kotlin.idea.fir.findPsi
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtParameterSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertyGetterSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility
|
||||
@@ -52,6 +54,9 @@ internal class KtFirPropertyGetterSymbol(
|
||||
override val type: KtType by firRef.withFirAndCache { builder.buildKtType(it.returnTypeRef) }
|
||||
override val modality: KtCommonSymbolModality get() = firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() }
|
||||
override val visibility: KtSymbolVisibility get() = firRef.withFir(FirResolvePhase.STATUS) { it.visibility.getSymbolVisibility() }
|
||||
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
|
||||
convertAnnotation(it)
|
||||
}
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtPropertyGetterSymbol> {
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||
|
||||
+5
@@ -13,9 +13,11 @@ import org.jetbrains.kotlin.idea.fir.findPsi
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertySetterSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSetterParameterSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility
|
||||
@@ -43,6 +45,9 @@ internal class KtFirPropertySetterSymbol(
|
||||
|
||||
override val modality: KtCommonSymbolModality get() = firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() }
|
||||
override val visibility: KtSymbolVisibility get() = firRef.withFir(FirResolvePhase.STATUS) { it.visibility.getSymbolVisibility() }
|
||||
override val annotations: List<KtAnnotationCall> by firRef.withFirAndCache(FirResolvePhase.TYPES) {
|
||||
convertAnnotation(it)
|
||||
}
|
||||
override val parameter: KtSetterParameterSymbol by firRef.withFirAndCache { fir ->
|
||||
builder.buildFirSetterParameter(fir.valueParameters.single())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user