[AA] improve symbol pointers for property accessors

Fe10:
* supported default setter
* support default getter
* support parameter from default setter

Fir:
* support java synthetic properties
* support parameter from default setter

^KT-54051
This commit is contained in:
Dmitrii Gridin
2022-11-17 17:09:31 +01:00
committed by Space Team
parent ca12cfb90d
commit edd60cd204
11 changed files with 129 additions and 50 deletions
@@ -88,7 +88,7 @@ internal class KtFirSymbolContainingDeclarationProvider(
KtFakeSourceElementKind.ImplicitConstructor -> return source.psi as KtDeclaration
KtFakeSourceElementKind.PropertyFromParameter -> return source.psi?.parentOfType<KtPrimaryConstructor>()!!
KtFakeSourceElementKind.DefaultAccessor -> return source.psi as KtProperty
KtFakeSourceElementKind.DefaultAccessor -> return source.psi as KtDeclaration
KtFakeSourceElementKind.ItLambdaParameter -> return source.psi as KtFunctionLiteral
KtFakeSourceElementKind.EnumInitializer -> return source.psi as KtEnumEntry
KtRealSourceElementKind -> source.psi!!
@@ -6,12 +6,13 @@
package org.jetbrains.kotlin.analysis.api.fir.symbols
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
import org.jetbrains.kotlin.analysis.api.fir.findPsi
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirPropertyAccessorSymbolPointer
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.requireOwnerPointer
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
import org.jetbrains.kotlin.analysis.api.impl.base.symbols.pointers.KtPropertyAccessorSymbolPointer
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol
@@ -57,8 +58,14 @@ internal class KtFirPropertyGetterSymbol(
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
override val receiverParameter: KtReceiverParameterSymbol? get() = withValidityAssertion { firSymbol.fir.propertySymbol.receiver(builder) }
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, firResolveSession.useSiteFirSession, token) }
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(
firSymbol,
firResolveSession.useSiteFirSession,
token,
)
}
/**
* Returns [CallableId] of the delegated Java method if the corresponding property of this setter is a synthetic Java property.
@@ -76,11 +83,12 @@ internal class KtFirPropertyGetterSymbol(
override val hasStableParameterNames: Boolean
get() = withValidityAssertion { true }
@OptIn(KtAnalysisApiInternals::class)
override fun createPointer(): KtSymbolPointer<KtPropertyGetterSymbol> = withValidityAssertion {
KtPsiBasedSymbolPointer.createForSymbolFromSource<KtPropertyGetterSymbol>(this)?.let { return it }
@Suppress("UNCHECKED_CAST")
KtFirPropertyAccessorSymbolPointer(requireOwnerPointer(), isGetter = true) as KtSymbolPointer<KtPropertyGetterSymbol>
KtPropertyAccessorSymbolPointer(requireOwnerPointer(), isGetter = true) as KtSymbolPointer<KtPropertyGetterSymbol>
}
override fun equals(other: Any?): Boolean = symbolEquals(other)
@@ -6,12 +6,13 @@
package org.jetbrains.kotlin.analysis.api.fir.symbols
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
import org.jetbrains.kotlin.analysis.api.fir.findPsi
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirPropertyAccessorSymbolPointer
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.requireOwnerPointer
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
import org.jetbrains.kotlin.analysis.api.impl.base.symbols.pointers.KtPropertyAccessorSymbolPointer
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol
@@ -99,11 +100,12 @@ internal class KtFirPropertySetterSymbol(
override val hasStableParameterNames: Boolean
get() = withValidityAssertion { true }
@OptIn(KtAnalysisApiInternals::class)
override fun createPointer(): KtSymbolPointer<KtPropertySetterSymbol> = withValidityAssertion {
KtPsiBasedSymbolPointer.createForSymbolFromSource<KtPropertySetterSymbol>(this)?.let { return it }
@Suppress("UNCHECKED_CAST")
KtFirPropertyAccessorSymbolPointer(requireOwnerPointer(), isGetter = false) as KtSymbolPointer<KtPropertySetterSymbol>
KtPropertyAccessorSymbolPointer(requireOwnerPointer(), isGetter = false) as KtSymbolPointer<KtPropertySetterSymbol>
}
override fun equals(other: Any?): Boolean = symbolEquals(other)
@@ -46,9 +46,9 @@ internal class KtFirValueParameterSymbol(
firSymbol.source?.kind == KtFakeSourceElementKind.ItLambdaParameter
}
override val isCrossinline: Boolean get() = withValidityAssertion { firSymbol.isCrossinline}
override val isCrossinline: Boolean get() = withValidityAssertion { firSymbol.isCrossinline }
override val isNoinline: Boolean get() = withValidityAssertion { firSymbol.isNoinline}
override val isNoinline: Boolean get() = withValidityAssertion { firSymbol.isNoinline }
override val returnType by cached {
val returnType = firSymbol.resolvedReturnType
@@ -64,7 +64,13 @@ internal class KtFirValueParameterSymbol(
override val hasDefaultValue: Boolean get() = withValidityAssertion { firSymbol.hasDefaultValue }
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, firResolveSession.useSiteFirSession, token) }
override val annotationsList by cached {
KtFirAnnotationListForDeclaration.create(
firSymbol,
firResolveSession.useSiteFirSession,
token,
)
}
override val generatedPrimaryConstructorProperty: KtKotlinPropertySymbol? by cached {
val propertySymbol = firSymbol.fir.correspondingProperty?.symbol ?: return@cached null
@@ -72,6 +78,7 @@ internal class KtFirValueParameterSymbol(
check(ktPropertySymbol is KtKotlinPropertySymbol) {
"Unexpected symbol for primary constructor property ${ktPropertySymbol.javaClass} for fir: ${firSymbol.fir.renderWithType()}"
}
ktPropertySymbol
}
@@ -79,14 +86,16 @@ internal class KtFirValueParameterSymbol(
KtPsiBasedSymbolPointer.createForSymbolFromSource<KtValueParameterSymbol>(this)?.let { return it }
analyze(firResolveSession.useSiteKtModule) {
val owner = getContainingSymbol() as KtFunctionLikeSymbol
val firFunction = owner.firSymbol.fir as FirFunction
when (val owner = getContainingSymbol()) {
is KtFunctionLikeSymbol ->
KtFirValueParameterSymbolPointer(
owner.createPointer(),
name,
(owner.firSymbol.fir as FirFunction).valueParameters.indexOf(firSymbol.fir),
)
KtFirValueParameterSymbolPointer(
owner.createPointer(),
name,
firFunction.valueParameters.indexOf(firSymbol.fir),
)
else -> error("${requireNotNull(owner)::class}")
}
}
}
@@ -1,29 +0,0 @@
/*
* Copyright 2010-2022 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.analysis.api.fir.symbols.pointers
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirKotlinPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyAccessorSymbol
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
internal class KtFirPropertyAccessorSymbolPointer(
private val propertySymbolPointer: KtSymbolPointer<KtKotlinPropertySymbol>,
private val isGetter: Boolean,
) : KtSymbolPointer<KtPropertyAccessorSymbol>() {
@Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol")
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtPropertyAccessorSymbol? {
require(analysisSession is KtFirAnalysisSession)
val propertySymbol = with(analysisSession) {
propertySymbolPointer.restoreSymbol()
} ?: return null
check(propertySymbol is KtFirKotlinPropertySymbol)
return if (isGetter) propertySymbol.getter else propertySymbol.setter
}
}