From 9b6e9e2dd19dfdd756022035825151389ce668c5 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Thu, 3 Nov 2022 16:45:25 +0100 Subject: [PATCH] [AA K2] implement symbol pointers for type parameters ^KT-54311 --- .../fir/symbols/KtFirTypeParameterSymbol.kt | 18 +++++++++-- .../pointers/KtFirMemberSymbolPointer.kt | 12 ++++--- .../KtFirTypeParameterSymbolPointer.kt | 32 +++++++++++++++++++ .../symbolByPsi/classWithTypeParams.kt | 2 +- .../symbolByPsi/functionWithTypeParams.kt | 2 +- .../testData/symbols/symbolByPsi/typeAlias.kt | 2 +- 6 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTypeParameterSymbolPointer.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt index 3df595ae397..5a2569f5e7d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt @@ -10,14 +10,17 @@ import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList 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.KtFirTypeParameterSymbolPointer +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.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession +import org.jetbrains.kotlin.fir.analysis.checkers.typeParameterSymbols import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance @@ -46,7 +49,16 @@ internal class KtFirTypeParameterSymbol( override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } - TODO("Creating symbols for library type parameters is not supported yet") + + val containingDeclarationSymbol = firSymbol.containingDeclarationSymbol + val typeParameters = containingDeclarationSymbol.typeParameterSymbols + requireNotNull(typeParameters) { "Containing declaration symbol: ${containingDeclarationSymbol::class.simpleName}" } + + KtFirTypeParameterSymbolPointer( + ownerPointer = requireOwnerPointer(), + name = name, + index = typeParameters.indexOf(firSymbol), + ) } override fun equals(other: Any?): Boolean = symbolEquals(other) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt index c62ecd91bf7..9489a85f404 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt @@ -45,15 +45,17 @@ internal abstract class KtFirMemberSymbolPointer( } context(KtAnalysisSession) -internal fun KtSymbol.requireOwnerPointer(): KtSymbolPointer { +internal inline fun KtSymbol.requireOwnerPointer(): KtSymbolPointer { val symbolWithMembers = getContainingSymbol() requireNotNull(symbolWithMembers) { "should present for member declaration" } - requireIsInstance(symbolWithMembers) + requireIsInstance(symbolWithMembers) @Suppress("UNCHECKED_CAST") - return symbolWithMembers.createPointer() as KtSymbolPointer + return symbolWithMembers.createPointer() as KtSymbolPointer } -internal fun KtFirSymbol<*>.requireOwnerPointer(): KtSymbolPointer = analyze(firResolveSession.useSiteKtModule) { - requireOwnerPointer() +internal inline fun KtFirSymbol<*>.requireOwnerPointer(): KtSymbolPointer { + return analyze(firResolveSession.useSiteKtModule) { + requireOwnerPointer() + } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTypeParameterSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTypeParameterSymbolPointer.kt new file mode 100644 index 00000000000..a101bd1730a --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTypeParameterSymbolPointer.kt @@ -0,0 +1,32 @@ +/* + * 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.utils.firSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithTypeParameters +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.fir.analysis.checkers.typeParameterSymbols +import org.jetbrains.kotlin.name.Name + +internal class KtFirTypeParameterSymbolPointer( + private val ownerPointer: KtSymbolPointer, + private val name: Name, + private val index: Int, +) : KtSymbolPointer() { + @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") + override fun restoreSymbol(analysisSession: KtAnalysisSession): KtTypeParameterSymbol? { + require(analysisSession is KtFirAnalysisSession) + val ownerSymbol = with(analysisSession) { + ownerPointer.restoreSymbol() ?: return null + } + + val firTypeParameterSymbol = ownerSymbol.firSymbol.typeParameterSymbols?.getOrNull(index)?.takeIf { it.name == name } ?: return null + return analysisSession.firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firTypeParameterSymbol) + } +} diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/classWithTypeParams.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/classWithTypeParams.kt index 7afa0bfc9d0..d3b117aa62b 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/classWithTypeParams.kt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/classWithTypeParams.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 import org.jetbrains.annotations.NotNull class A<@NotNull T, R> { } diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.kt index ffb06c60cd0..8c0ba25f61a 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.kt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.kt @@ -1,2 +1,2 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 fun foo(x: X) {} diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAlias.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAlias.kt index cc49b8cd54c..dfe82ec1fc6 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAlias.kt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAlias.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 class X private typealias Y = X