From d5933f28abf76bff729b8fad5c351c279f06b1c3 Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Wed, 1 Mar 2023 16:54:17 +0100 Subject: [PATCH] [AA] KT-56617 Optimize type parameter access for Java class symbols - Completion accesses symbol type parameters to render their names. Instead of building the whole list of type parameters, and consequently the whole FIR class, completion can now access the type parameter names directly. --- .../api/fir/symbols/KtFirPsiJavaClassSymbol.kt | 13 ++++++++++++- .../kotlin/analysis/api/symbols/markers/markers.kt | 9 ++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPsiJavaClassSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPsiJavaClassSymbol.kt index 0449be14a43..5d9e04816ce 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPsiJavaClassSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPsiJavaClassSymbol.kt @@ -97,6 +97,16 @@ internal class KtFirPsiJavaClassSymbol( psi.containingClass?.let { KtFirPsiJavaClassSymbol(it, analysisSession) } } + override val typeParameterNames: List by cached { + // The parent Java class might contribute `FirOuterClassTypeParameterRef`s to the FIR class's type parameters (see + // `FirJavaFacade.createFirJavaClass`), but since they are filtered out by `createRegularKtTypeParameters`, we do not need to + // include them in the list of type parameter names. + javaClass.typeParameters.map { it.name } + } + + val hasTypeParameters: Boolean + get() = withValidityAssertion { javaClass.typeParameters.isNotEmpty() } + override val isData: Boolean get() = withValidityAssertion { false } override val isInline: Boolean get() = withValidityAssertion { false } override val isFun: Boolean get() = withValidityAssertion { false } @@ -137,7 +147,8 @@ internal class KtFirPsiJavaClassSymbol( } override val typeParameters: List by cached { - firSymbol.createRegularKtTypeParameters(builder) + if (hasTypeParameters) firSymbol.createRegularKtTypeParameters(builder) + else emptyList() } override val annotationsList: KtAnnotationsList by cached { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/markers/markers.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/markers/markers.kt index 67814566750..321ef93f22e 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/markers/markers.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/markers/markers.kt @@ -5,9 +5,9 @@ package org.jetbrains.kotlin.analysis.api.symbols.markers +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol -import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.name.Name public interface KtPossiblyNamedSymbol : KtSymbol { @@ -20,4 +20,11 @@ public interface KtNamedSymbol : KtPossiblyNamedSymbol { public interface KtSymbolWithTypeParameters : KtSymbol { public val typeParameters: List + + /** + * The names of [typeParameters]. Using this property should be preferred if only the names of type parameters are needed, because some + * symbol implementations may avoid building the full list of type parameters. + */ + public val typeParameterNames: List + get() = withValidityAssertion { typeParameters.map { it.name } } } \ No newline at end of file