FIR IDE: get containing symbol of KtTypeParameterSymbol
As part of this change, we now also allow HL API to get containing symbol for any KtSymbols.
This commit is contained in:
committed by
Ilya Kirillov
parent
7c3754f516
commit
954926e0de
+22
-11
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
|||||||
import org.jetbrains.kotlin.analysis.api.components.KtSymbolContainingDeclarationProvider
|
import org.jetbrains.kotlin.analysis.api.components.KtSymbolContainingDeclarationProvider
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
||||||
|
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirTypeParameterSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind
|
||||||
@@ -24,9 +25,9 @@ internal class KtFirSymbolContainingDeclarationProvider(
|
|||||||
override val analysisSession: KtFirAnalysisSession,
|
override val analysisSession: KtFirAnalysisSession,
|
||||||
override val token: ValidityToken,
|
override val token: ValidityToken,
|
||||||
) : KtSymbolContainingDeclarationProvider(), KtFirAnalysisSessionComponent {
|
) : KtSymbolContainingDeclarationProvider(), KtFirAnalysisSessionComponent {
|
||||||
override fun getContainingDeclaration(symbol: KtSymbolWithKind): KtSymbolWithKind? {
|
override fun getContainingDeclaration(symbol: KtSymbol): KtSymbolWithKind? {
|
||||||
if (symbol is KtPackageSymbol) return null
|
if (symbol is KtPackageSymbol) return null
|
||||||
if (symbol.symbolKind == KtSymbolKind.TOP_LEVEL) return null
|
if (symbol is KtSymbolWithKind && symbol.symbolKind == KtSymbolKind.TOP_LEVEL) return null
|
||||||
if (symbol is KtCallableSymbol) {
|
if (symbol is KtCallableSymbol) {
|
||||||
val classId = symbol.callableIdIfNonLocal?.classId
|
val classId = symbol.callableIdIfNonLocal?.classId
|
||||||
if (classId != null) {
|
if (classId != null) {
|
||||||
@@ -35,15 +36,25 @@ internal class KtFirSymbolContainingDeclarationProvider(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return when (symbol.origin) {
|
return when (symbol) {
|
||||||
KtSymbolOrigin.SOURCE, KtSymbolOrigin.SOURCE_MEMBER_GENERATED ->
|
is KtFirTypeParameterSymbol -> {
|
||||||
getContainingDeclarationForKotlinInSourceSymbol(symbol)
|
symbol.firRef.withFir { fir ->
|
||||||
KtSymbolOrigin.LIBRARY, KtSymbolOrigin.JAVA, KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY ->
|
fir.containingDeclarationSymbol?.fir?.let { containingDeclaration ->
|
||||||
getContainingDeclarationForLibrarySymbol(symbol)
|
firSymbolBuilder.buildSymbol(containingDeclaration) as KtSymbolWithKind
|
||||||
KtSymbolOrigin.PROPERTY_BACKING_FIELD -> getContainingDeclarationForBackingFieldSymbol(symbol)
|
}
|
||||||
KtSymbolOrigin.INTERSECTION_OVERRIDE -> TODO()
|
}
|
||||||
KtSymbolOrigin.SAM_CONSTRUCTOR -> null
|
}
|
||||||
KtSymbolOrigin.DELEGATED -> TODO()
|
is KtSymbolWithKind -> when (symbol.origin) {
|
||||||
|
KtSymbolOrigin.SOURCE, KtSymbolOrigin.SOURCE_MEMBER_GENERATED ->
|
||||||
|
getContainingDeclarationForKotlinInSourceSymbol(symbol)
|
||||||
|
KtSymbolOrigin.LIBRARY, KtSymbolOrigin.JAVA, KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY ->
|
||||||
|
getContainingDeclarationForLibrarySymbol(symbol)
|
||||||
|
KtSymbolOrigin.PROPERTY_BACKING_FIELD -> getContainingDeclarationForBackingFieldSymbol(symbol)
|
||||||
|
KtSymbolOrigin.INTERSECTION_OVERRIDE -> TODO()
|
||||||
|
KtSymbolOrigin.SAM_CONSTRUCTOR -> null
|
||||||
|
KtSymbolOrigin.DELEGATED -> TODO()
|
||||||
|
}
|
||||||
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -5,10 +5,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.api.components
|
package org.jetbrains.kotlin.analysis.api.components
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind
|
||||||
|
|
||||||
public abstract class KtSymbolContainingDeclarationProvider : KtAnalysisSessionComponent() {
|
public abstract class KtSymbolContainingDeclarationProvider : KtAnalysisSessionComponent() {
|
||||||
public abstract fun getContainingDeclaration(symbol: KtSymbolWithKind): KtSymbolWithKind?
|
public abstract fun getContainingDeclaration(symbol: KtSymbol): KtSymbolWithKind?
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface KtSymbolContainingDeclarationProviderMixIn : KtAnalysisSessionMixIn {
|
public interface KtSymbolContainingDeclarationProviderMixIn : KtAnalysisSessionMixIn {
|
||||||
@@ -18,6 +19,6 @@ public interface KtSymbolContainingDeclarationProviderMixIn : KtAnalysisSessionM
|
|||||||
* for class members returns containing class
|
* for class members returns containing class
|
||||||
* for local declaration returns declaration it was declared it
|
* for local declaration returns declaration it was declared it
|
||||||
*/
|
*/
|
||||||
public fun KtSymbolWithKind.getContainingSymbol(): KtSymbolWithKind? =
|
public fun KtSymbol.getContainingSymbol(): KtSymbolWithKind? =
|
||||||
analysisSession.containingDeclarationProvider.getContainingDeclaration(this)
|
analysisSession.containingDeclarationProvider.getContainingDeclaration(this)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user