[FIR IDE] LC More accurate processing for JvmSynthetic and JvmHidden annotations

This commit is contained in:
Igor Yakovlev
2020-12-08 04:03:58 +03:00
parent 3895ad375c
commit 3019f439fb
5 changed files with 29 additions and 16 deletions
@@ -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
@@ -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(
@@ -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
}
@@ -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 }
@@ -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())
}