[AA K2] implement symbol pointers for type parameters
^KT-54311
This commit is contained in:
committed by
Space Team
parent
7d1ac0ac97
commit
9b6e9e2dd1
+15
-3
@@ -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.KtSymbolByFirBuilder
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
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.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.KtTypeParameterSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
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.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.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.fir.symbols.impl.FirTypeParameterSymbol
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
@@ -46,7 +49,16 @@ internal class KtFirTypeParameterSymbol(
|
|||||||
|
|
||||||
override fun createPointer(): KtSymbolPointer<KtTypeParameterSymbol> = withValidityAssertion {
|
override fun createPointer(): KtSymbolPointer<KtTypeParameterSymbol> = withValidityAssertion {
|
||||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
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)
|
override fun equals(other: Any?): Boolean = symbolEquals(other)
|
||||||
|
|||||||
+7
-5
@@ -45,15 +45,17 @@ internal abstract class KtFirMemberSymbolPointer<S : KtSymbol>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
context(KtAnalysisSession)
|
context(KtAnalysisSession)
|
||||||
internal fun KtSymbol.requireOwnerPointer(): KtSymbolPointer<KtSymbolWithMembers> {
|
internal inline fun <reified T : KtSymbol> KtSymbol.requireOwnerPointer(): KtSymbolPointer<T> {
|
||||||
val symbolWithMembers = getContainingSymbol()
|
val symbolWithMembers = getContainingSymbol()
|
||||||
requireNotNull(symbolWithMembers) { "should present for member declaration" }
|
requireNotNull(symbolWithMembers) { "should present for member declaration" }
|
||||||
requireIsInstance<KtSymbolWithMembers>(symbolWithMembers)
|
requireIsInstance<T>(symbolWithMembers)
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
return symbolWithMembers.createPointer() as KtSymbolPointer<KtSymbolWithMembers>
|
return symbolWithMembers.createPointer() as KtSymbolPointer<T>
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun KtFirSymbol<*>.requireOwnerPointer(): KtSymbolPointer<KtSymbolWithMembers> = analyze(firResolveSession.useSiteKtModule) {
|
internal inline fun <reified T : KtSymbol> KtFirSymbol<*>.requireOwnerPointer(): KtSymbolPointer<T> {
|
||||||
requireOwnerPointer()
|
return analyze(firResolveSession.useSiteKtModule) {
|
||||||
|
requireOwnerPointer<T>()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+32
@@ -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<KtSymbolWithTypeParameters>,
|
||||||
|
private val name: Name,
|
||||||
|
private val index: Int,
|
||||||
|
) : KtSymbolPointer<KtTypeParameterSymbol>() {
|
||||||
|
@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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
|
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
|
||||||
import org.jetbrains.annotations.NotNull
|
import org.jetbrains.annotations.NotNull
|
||||||
class A<@NotNull T, R> {
|
class A<@NotNull T, R> {
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,2 +1,2 @@
|
|||||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
|
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
|
||||||
fun <X> foo(x: X) {}
|
fun <X> foo(x: X) {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
|
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
|
||||||
class X<T>
|
class X<T>
|
||||||
|
|
||||||
private typealias Y<Z> = X<Z>
|
private typealias Y<Z> = X<Z>
|
||||||
|
|||||||
Reference in New Issue
Block a user