[kotlin fir] fix creating symbol not in analysis scope
^KTIJ-21504 fixed
This commit is contained in:
+1
-1
@@ -49,7 +49,7 @@ interface Fe10AnalysisFacade {
|
|||||||
|
|
||||||
class Fe10AnalysisContext(
|
class Fe10AnalysisContext(
|
||||||
facade: Fe10AnalysisFacade,
|
facade: Fe10AnalysisFacade,
|
||||||
contextElement: KtElement,
|
val contextElement: KtElement,
|
||||||
val token: ValidityToken
|
val token: ValidityToken
|
||||||
) : Fe10AnalysisFacade by facade {
|
) : Fe10AnalysisFacade by facade {
|
||||||
val resolveSession: ResolveSession = getResolveSession(contextElement)
|
val resolveSession: ResolveSession = getResolveSession(contextElement)
|
||||||
|
|||||||
+15
-4
@@ -8,15 +8,24 @@ package org.jetbrains.kotlin.analysis.api.descriptors
|
|||||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.analysis.api.components.*
|
import org.jetbrains.kotlin.analysis.api.components.*
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.components.*
|
import org.jetbrains.kotlin.analysis.api.descriptors.components.*
|
||||||
|
import org.jetbrains.kotlin.analysis.api.impl.base.components.KtAnalysisScopeProviderImpl
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider
|
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider
|
||||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
@Suppress("LeakingThis")
|
@Suppress("LeakingThis")
|
||||||
class KtFe10AnalysisSession(val analysisContext: Fe10AnalysisContext) : KtAnalysisSession(analysisContext.token) {
|
class KtFe10AnalysisSession(
|
||||||
constructor(contextElement: KtElement, token: ValidityToken) :
|
val analysisContext: Fe10AnalysisContext,
|
||||||
this(Fe10AnalysisContext(Fe10AnalysisFacade.getInstance(contextElement.project), contextElement, token))
|
override val useSiteModule: KtModule
|
||||||
|
) : KtAnalysisSession(analysisContext.token) {
|
||||||
|
constructor(contextElement: KtElement, token: ValidityToken) : this(
|
||||||
|
Fe10AnalysisContext(Fe10AnalysisFacade.getInstance(contextElement.project), contextElement, token),
|
||||||
|
contextElement.getKtModule()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
override val smartCastProviderImpl: KtSmartCastProvider = KtFe10SmartCastProvider(this)
|
override val smartCastProviderImpl: KtSmartCastProvider = KtFe10SmartCastProvider(this)
|
||||||
override val diagnosticProviderImpl: KtDiagnosticProvider = KtFe10DiagnosticProvider(this)
|
override val diagnosticProviderImpl: KtDiagnosticProvider = KtFe10DiagnosticProvider(this)
|
||||||
@@ -25,7 +34,8 @@ class KtFe10AnalysisSession(val analysisContext: Fe10AnalysisContext) : KtAnalys
|
|||||||
override val symbolProviderImpl: KtSymbolProvider = KtFe10SymbolProvider(this)
|
override val symbolProviderImpl: KtSymbolProvider = KtFe10SymbolProvider(this)
|
||||||
override val callResolverImpl: KtCallResolver = KtFe10CallResolver(this)
|
override val callResolverImpl: KtCallResolver = KtFe10CallResolver(this)
|
||||||
override val completionCandidateCheckerImpl: KtCompletionCandidateChecker = KtFe10CompletionCandidateChecker(this)
|
override val completionCandidateCheckerImpl: KtCompletionCandidateChecker = KtFe10CompletionCandidateChecker(this)
|
||||||
override val symbolDeclarationOverridesProviderImpl: KtSymbolDeclarationOverridesProvider = KtFe10SymbolDeclarationOverridesProvider(this)
|
override val symbolDeclarationOverridesProviderImpl: KtSymbolDeclarationOverridesProvider =
|
||||||
|
KtFe10SymbolDeclarationOverridesProvider(this)
|
||||||
override val referenceShortenerImpl: KtReferenceShortener = KtFe10ReferenceShortener(this)
|
override val referenceShortenerImpl: KtReferenceShortener = KtFe10ReferenceShortener(this)
|
||||||
override val symbolDeclarationRendererProviderImpl: KtSymbolDeclarationRendererProvider = KtFe10SymbolDeclarationRendererProvider(this)
|
override val symbolDeclarationRendererProviderImpl: KtSymbolDeclarationRendererProvider = KtFe10SymbolDeclarationRendererProvider(this)
|
||||||
override val expressionTypeProviderImpl: KtExpressionTypeProvider = KtFe10ExpressionTypeProvider(this)
|
override val expressionTypeProviderImpl: KtExpressionTypeProvider = KtFe10ExpressionTypeProvider(this)
|
||||||
@@ -43,6 +53,7 @@ class KtFe10AnalysisSession(val analysisContext: Fe10AnalysisContext) : KtAnalys
|
|||||||
override val importOptimizerImpl: KtImportOptimizer = KtFe10ImportOptimizer(this)
|
override val importOptimizerImpl: KtImportOptimizer = KtFe10ImportOptimizer(this)
|
||||||
override val jvmTypeMapperImpl: KtJvmTypeMapper = KtFe10JvmTypeMapper(this)
|
override val jvmTypeMapperImpl: KtJvmTypeMapper = KtFe10JvmTypeMapper(this)
|
||||||
override val symbolInfoProviderImpl: KtSymbolInfoProvider = KtFe10SymbolInfoProvider(this)
|
override val symbolInfoProviderImpl: KtSymbolInfoProvider = KtFe10SymbolInfoProvider(this)
|
||||||
|
override val analysisScopeProviderImpl: KtAnalysisScopeProvider = KtAnalysisScopeProviderImpl(this, token)
|
||||||
|
|
||||||
override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession {
|
override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession {
|
||||||
return KtFe10AnalysisSession(elementToReanalyze, token)
|
return KtFe10AnalysisSession(elementToReanalyze, token)
|
||||||
|
|||||||
+2
-1
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProvider
|
|||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityTokenFactory
|
import org.jetbrains.kotlin.analysis.api.tokens.ValidityTokenFactory
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import java.lang.UnsupportedOperationException
|
import java.lang.UnsupportedOperationException
|
||||||
|
|
||||||
@@ -24,7 +25,7 @@ class KtFe10AnalysisSessionProvider : KtAnalysisSessionProvider() {
|
|||||||
@InvalidWayOfUsingAnalysisSession
|
@InvalidWayOfUsingAnalysisSession
|
||||||
override fun getAnalysisSessionBySymbol(contextSymbol: KtSymbol): KtAnalysisSession {
|
override fun getAnalysisSessionBySymbol(contextSymbol: KtSymbol): KtAnalysisSession {
|
||||||
if (contextSymbol is KtFe10Symbol) {
|
if (contextSymbol is KtFe10Symbol) {
|
||||||
return KtFe10AnalysisSession(contextSymbol.analysisContext)
|
return KtFe10AnalysisSession(contextSymbol.analysisContext, contextSymbol.analysisContext.contextElement.getKtModule())
|
||||||
} else {
|
} else {
|
||||||
val contextElement = contextSymbol.psi
|
val contextElement = contextSymbol.psi
|
||||||
if (contextElement is KtElement) {
|
if (contextElement is KtElement) {
|
||||||
|
|||||||
+6
@@ -13,9 +13,11 @@ import org.jetbrains.kotlin.analysis.api.fir.components.*
|
|||||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirOverrideInfoProvider
|
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirOverrideInfoProvider
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbolProvider
|
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbolProvider
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.utils.threadLocal
|
import org.jetbrains.kotlin.analysis.api.fir.utils.threadLocal
|
||||||
|
import org.jetbrains.kotlin.analysis.api.impl.base.components.KtAnalysisScopeProviderImpl
|
||||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirModuleResolveState
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirModuleResolveState
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.moduleData
|
import org.jetbrains.kotlin.fir.moduleData
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
@@ -34,6 +36,8 @@ private constructor(
|
|||||||
private val mode: AnalysisSessionMode,
|
private val mode: AnalysisSessionMode,
|
||||||
) : KtAnalysisSession(token) {
|
) : KtAnalysisSession(token) {
|
||||||
|
|
||||||
|
override val useSiteModule: KtModule get() = firResolveState.module
|
||||||
|
|
||||||
private enum class AnalysisSessionMode {
|
private enum class AnalysisSessionMode {
|
||||||
REGULAR,
|
REGULAR,
|
||||||
DEPENDENT_COPY
|
DEPENDENT_COPY
|
||||||
@@ -92,6 +96,8 @@ private constructor(
|
|||||||
|
|
||||||
override val typesCreatorImpl: KtTypeCreator = KtFirTypeCreator(this, token)
|
override val typesCreatorImpl: KtTypeCreator = KtFirTypeCreator(this, token)
|
||||||
|
|
||||||
|
override val analysisScopeProviderImpl: KtAnalysisScopeProvider = KtAnalysisScopeProviderImpl(this, token)
|
||||||
|
|
||||||
override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession {
|
override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession {
|
||||||
check(mode == AnalysisSessionMode.REGULAR) {
|
check(mode == AnalysisSessionMode.REGULAR) {
|
||||||
"Cannot create context-dependent copy of KtAnalysis session from a context dependent one"
|
"Cannot create context-dependent copy of KtAnalysis session from a context dependent one"
|
||||||
|
|||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* 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.impl.base.components
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
|
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||||
|
import org.jetbrains.kotlin.analysis.api.components.KtAnalysisScopeProvider
|
||||||
|
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.allDirectDependencies
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.contains
|
||||||
|
|
||||||
|
class KtAnalysisScopeProviderImpl(
|
||||||
|
override val analysisSession: KtAnalysisSession,
|
||||||
|
override val token: ValidityToken
|
||||||
|
) : KtAnalysisScopeProvider() {
|
||||||
|
|
||||||
|
private val allModules = analysisSession.useSiteModule.collectAllDependenciesWithSelf()
|
||||||
|
private val analysisScope = GlobalSearchScope.union(allModules.map { it.contentScope })
|
||||||
|
|
||||||
|
override fun getAnalysisScope(): GlobalSearchScope = analysisScope
|
||||||
|
|
||||||
|
override fun canBeAnalysed(psi: PsiElement): Boolean {
|
||||||
|
return analysisScope.contains(psi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun KtModule.collectAllDependenciesWithSelf(): List<KtModule> {
|
||||||
|
val stack = mutableListOf(this)
|
||||||
|
val visited = mutableSetOf<KtModule>()
|
||||||
|
|
||||||
|
while (stack.isNotEmpty()) {
|
||||||
|
val current = stack.removeLast()
|
||||||
|
if (visited.add(current)) continue
|
||||||
|
|
||||||
|
current.allDirectDependencies().forEach { dependency ->
|
||||||
|
if (dependency !in visited) stack += dependency
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return visited.toList()
|
||||||
|
}
|
||||||
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider
|
|||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProviderMixIn
|
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProviderMixIn
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
@@ -53,7 +54,10 @@ public abstract class KtAnalysisSession(final override val token: ValidityToken)
|
|||||||
KtVisibilityCheckerMixIn,
|
KtVisibilityCheckerMixIn,
|
||||||
KtMemberSymbolProviderMixin,
|
KtMemberSymbolProviderMixin,
|
||||||
KtInheritorsProviderMixIn,
|
KtInheritorsProviderMixIn,
|
||||||
KtTypeCreatorMixIn {
|
KtTypeCreatorMixIn,
|
||||||
|
KtAnalysisScopeProviderMixIn {
|
||||||
|
|
||||||
|
public abstract val useSiteModule: KtModule
|
||||||
|
|
||||||
override val analysisSession: KtAnalysisSession get() = this
|
override val analysisSession: KtAnalysisSession get() = this
|
||||||
|
|
||||||
@@ -131,6 +135,9 @@ public abstract class KtAnalysisSession(final override val token: ValidityToken)
|
|||||||
internal val symbolInfoProvider: KtSymbolInfoProvider get() = symbolInfoProviderImpl
|
internal val symbolInfoProvider: KtSymbolInfoProvider get() = symbolInfoProviderImpl
|
||||||
protected abstract val symbolInfoProviderImpl: KtSymbolInfoProvider
|
protected abstract val symbolInfoProviderImpl: KtSymbolInfoProvider
|
||||||
|
|
||||||
|
internal val analysisScopeProvider: KtAnalysisScopeProvider get() = analysisScopeProviderImpl
|
||||||
|
protected abstract val analysisScopeProviderImpl: KtAnalysisScopeProvider
|
||||||
|
|
||||||
@PublishedApi
|
@PublishedApi
|
||||||
internal val typesCreator: KtTypeCreator
|
internal val typesCreator: KtTypeCreator
|
||||||
get() = typesCreatorImpl
|
get() = typesCreatorImpl
|
||||||
|
|||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* 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.components
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
|
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||||
|
|
||||||
|
public abstract class KtAnalysisScopeProvider : KtAnalysisSessionComponent() {
|
||||||
|
public abstract fun getAnalysisScope(): GlobalSearchScope
|
||||||
|
|
||||||
|
public abstract fun canBeAnalysed(psi: PsiElement): Boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface KtAnalysisScopeProviderMixIn : KtAnalysisSessionMixIn {
|
||||||
|
/**
|
||||||
|
* Return [GlobalSearchScope] represent a scope code in which can be analysed by current [KtAnalysisSession].
|
||||||
|
* That means [org.jetbrains.kotlin.analysis.api.symbols.KtSymbol] can be built for the declarations from this scope.
|
||||||
|
*/
|
||||||
|
public val analysisScope: GlobalSearchScope
|
||||||
|
get() = analysisSession.analysisScopeProvider.getAnalysisScope()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if [PsiElement] is inside analysis scope.
|
||||||
|
* That means [org.jetbrains.kotlin.analysis.api.symbols.KtSymbol] can be built by this [PsiElement]
|
||||||
|
*
|
||||||
|
* @see analysisScope
|
||||||
|
*/
|
||||||
|
public fun PsiElement.canBeAnalysed(): Boolean =
|
||||||
|
analysisSession.analysisScopeProvider.canBeAnalysed(this)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user