[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:
committed by
Space Team
parent
ca12cfb90d
commit
edd60cd204
+1
-1
@@ -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!!
|
||||
|
||||
+12
-4
@@ -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)
|
||||
|
||||
+4
-2
@@ -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)
|
||||
|
||||
+19
-10
@@ -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}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
-29
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user