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