From 3019f439fbe00020fdc0a352b0106d4fcee13fb4 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Tue, 8 Dec 2020 04:03:58 +0300 Subject: [PATCH] [FIR IDE] LC More accurate processing for JvmSynthetic and JvmHidden annotations --- .../api/symbols/KtPropertyAccessorSymbol.kt | 4 +++- .../asJava/annotations/annotationsUtils.kt | 13 +++++++------ .../idea/asJava/classes/firLightClassUtils.kt | 18 +++++++++--------- .../fir/symbols/KtFirPropertyGetterSymbol.kt | 5 +++++ .../fir/symbols/KtFirPropertySetterSymbol.kt | 5 +++++ 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtPropertyAccessorSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtPropertyAccessorSymbol.kt index f3c0dbfcf73..1436b587b21 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtPropertyAccessorSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtPropertyAccessorSymbol.kt @@ -10,7 +10,9 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer sealed class KtPropertyAccessorSymbol : KtCallableSymbol(), KtSymbolWithModality, - KtSymbolWithVisibility { + KtSymbolWithVisibility, + KtAnnotatedSymbol { + abstract val isDefault: Boolean abstract val isInline: Boolean abstract val isOverride: Boolean diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/annotations/annotationsUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/annotations/annotationsUtils.kt index 37407e233d7..1042171a89e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/annotations/annotationsUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/annotations/annotationsUtils.kt @@ -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( diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt index a3cfb594314..55328f2947a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt @@ -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 ) { + 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 } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt index 6e462353a26..193eb71817b 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt @@ -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 by firRef.withFirAndCache(FirResolvePhase.TYPES) { + convertAnnotation(it) + } override fun createPointer(): KtSymbolPointer { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt index 067ccff9f76..0e4a239656c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt @@ -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 by firRef.withFirAndCache(FirResolvePhase.TYPES) { + convertAnnotation(it) + } override val parameter: KtSetterParameterSymbol by firRef.withFirAndCache { fir -> builder.buildFirSetterParameter(fir.valueParameters.single()) }