[LL API] Migrate 'getKtModule()' usages to 'ProjectStructureProvider'
Ensure the contextual module is passed wherever possible. ^KT-57559 Fixed
This commit is contained in:
+3
-3
@@ -11,7 +11,7 @@ import com.intellij.openapi.vfs.VirtualFile
|
|||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||||
import org.jetbrains.kotlin.container.ComponentProvider
|
import org.jetbrains.kotlin.container.ComponentProvider
|
||||||
import org.jetbrains.kotlin.container.get
|
import org.jetbrains.kotlin.container.get
|
||||||
@@ -34,7 +34,7 @@ import org.jetbrains.kotlin.resolve.lazy.ResolveSession
|
|||||||
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
|
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
|
||||||
import org.jetbrains.kotlin.util.CancellationChecker
|
import org.jetbrains.kotlin.util.CancellationChecker
|
||||||
|
|
||||||
class CliFe10AnalysisFacade(private val project: Project) : Fe10AnalysisFacade {
|
class CliFe10AnalysisFacade : Fe10AnalysisFacade {
|
||||||
override fun getResolveSession(element: KtElement): ResolveSession {
|
override fun getResolveSession(element: KtElement): ResolveSession {
|
||||||
return getHandler(element).resolveSession ?: error("Resolution is not performed")
|
return getHandler(element).resolveSession ?: error("Resolution is not performed")
|
||||||
}
|
}
|
||||||
@@ -68,7 +68,7 @@ class CliFe10AnalysisFacade(private val project: Project) : Fe10AnalysisFacade {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getHandler(useSiteElement: KtElement): KtFe10AnalysisHandlerExtension {
|
private fun getHandler(useSiteElement: KtElement): KtFe10AnalysisHandlerExtension {
|
||||||
val ktModule = useSiteElement.getKtModule(project)
|
val ktModule = ProjectStructureProvider.getModule(useSiteElement, contextualModule = null)
|
||||||
return KtFe10AnalysisHandlerExtension.getInstance(ktModule.project, ktModule)
|
return KtFe10AnalysisHandlerExtension.getInstance(ktModule.project, ktModule)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
|||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider
|
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProviderByJavaPsi
|
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProviderByJavaPsi
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ class KtFe10AnalysisSession(
|
|||||||
) : KtAnalysisSession(analysisContext.token) {
|
) : KtAnalysisSession(analysisContext.token) {
|
||||||
constructor(contextElement: KtElement, token: KtLifetimeToken) : this(
|
constructor(contextElement: KtElement, token: KtLifetimeToken) : this(
|
||||||
Fe10AnalysisContext(Fe10AnalysisFacade.getInstance(contextElement.project), contextElement, token),
|
Fe10AnalysisContext(Fe10AnalysisFacade.getInstance(contextElement.project), contextElement, token),
|
||||||
contextElement.getKtModule()
|
ProjectStructureProvider.getModule(contextElement, contextualModule = null)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
-3
@@ -9,11 +9,8 @@ import com.intellij.openapi.project.Project
|
|||||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
|
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
|
||||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider
|
import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenFactory
|
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenFactory
|
||||||
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
|
||||||
|
|
||||||
|
|||||||
+34
-34
@@ -14,17 +14,14 @@ import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnaly
|
|||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescDefaultBackingFieldSymbol
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescDefaultBackingFieldSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getDescriptor
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getDescriptor
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtSymbol
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtSymbol
|
||||||
|
import org.jetbrains.kotlin.analysis.api.getModule
|
||||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtBackingFieldSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtBackingFieldSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||||
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
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule
|
import org.jetbrains.kotlin.analysis.project.structure.*
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtLibrarySourceModule
|
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
|
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
|
||||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||||
@@ -54,39 +51,42 @@ internal class KtFe10SymbolContainingDeclarationProvider(
|
|||||||
|
|
||||||
// TODO this is a dummy and incorrect implementation just to satisfy some tests
|
// TODO this is a dummy and incorrect implementation just to satisfy some tests
|
||||||
override fun getContainingModule(symbol: KtSymbol): KtModule {
|
override fun getContainingModule(symbol: KtSymbol): KtModule {
|
||||||
val psiForModule = symbol.getDescriptor()?.let { DescriptorToSourceUtils.getContainingFile(it) }
|
val descriptor = symbol.getDescriptor()
|
||||||
?: symbol.psi
|
|
||||||
|
|
||||||
return psiForModule?.getKtModule(analysisSession.analysisContext.resolveSession.project)
|
val symbolPsi = descriptor?.let(DescriptorToSourceUtils::getContainingFile) ?: symbol.psi
|
||||||
?: symbol.getDescriptor()?.getFakeContainingKtModule()
|
if (symbolPsi != null) {
|
||||||
?: (symbol as? KtBackingFieldSymbol)?.owningProperty?.let { getContainingModule(it) }
|
return analysisSession.getModule(symbolPsi)
|
||||||
?: TODO(symbol::class.java.name)
|
}
|
||||||
|
|
||||||
|
if (descriptor is DescriptorWithContainerSource) {
|
||||||
|
return getFakeContainingKtModule(descriptor)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (symbol is KtBackingFieldSymbol) {
|
||||||
|
return getContainingModule(symbol.owningProperty)
|
||||||
|
}
|
||||||
|
|
||||||
|
TODO(symbol::class.java.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun DeclarationDescriptor.getFakeContainingKtModule(): KtModule? {
|
private fun getFakeContainingKtModule(descriptor: DescriptorWithContainerSource): KtModule {
|
||||||
return when (this) {
|
val libraryPath = Paths.get((descriptor.containerSource as JvmPackagePartSource).knownJvmBinaryClass?.containingLibrary!!)
|
||||||
is DescriptorWithContainerSource -> {
|
return object : KtLibraryModule {
|
||||||
val libraryPath = Paths.get((containerSource as JvmPackagePartSource).knownJvmBinaryClass?.containingLibrary!!)
|
override val libraryName: String = libraryPath.fileName.toString().substringBeforeLast(".")
|
||||||
object : KtLibraryModule {
|
override val librarySources: KtLibrarySourceModule? = null
|
||||||
override val libraryName: String = libraryPath.fileName.toString().substringBeforeLast(".")
|
override fun getBinaryRoots(): Collection<Path> = listOf(libraryPath)
|
||||||
override val librarySources: KtLibrarySourceModule? = null
|
override val directRegularDependencies: List<KtModule> = emptyList()
|
||||||
override fun getBinaryRoots(): Collection<Path> = listOf(libraryPath)
|
override val directDependsOnDependencies: List<KtModule> = emptyList()
|
||||||
override val directRegularDependencies: List<KtModule> = emptyList()
|
override val transitiveDependsOnDependencies: List<KtModule> = emptyList()
|
||||||
override val directDependsOnDependencies: List<KtModule> = emptyList()
|
override val directFriendDependencies: List<KtModule> = emptyList()
|
||||||
override val transitiveDependsOnDependencies: List<KtModule> = emptyList()
|
override val contentScope: GlobalSearchScope = ProjectScope.getLibrariesScope(project)
|
||||||
override val directFriendDependencies: List<KtModule> = emptyList()
|
override val platform: TargetPlatform
|
||||||
override val contentScope: GlobalSearchScope = ProjectScope.getLibrariesScope(project)
|
get() = descriptor.platform!!
|
||||||
override val platform: TargetPlatform
|
override val analyzerServices: PlatformDependentAnalyzerServices
|
||||||
get() = this@getFakeContainingKtModule.platform!!
|
get() = JvmPlatformAnalyzerServices
|
||||||
override val analyzerServices: PlatformDependentAnalyzerServices
|
override val project: Project
|
||||||
get() = JvmPlatformAnalyzerServices
|
get() = analysisSession.analysisContext.resolveSession.project
|
||||||
override val project: Project
|
|
||||||
get() = analysisSession.analysisContext.resolveSession.project
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else -> null
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -37,7 +37,7 @@ object AnalysisApiFe10TestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
|
|||||||
override fun registerProjectModelServices(project: MockProject, testServices: TestServices) {
|
override fun registerProjectModelServices(project: MockProject, testServices: TestServices) {
|
||||||
project.apply {
|
project.apply {
|
||||||
registerService(KtAnalysisSessionProvider::class.java, KtFe10AnalysisSessionProvider(project))
|
registerService(KtAnalysisSessionProvider::class.java, KtFe10AnalysisSessionProvider(project))
|
||||||
registerService(Fe10AnalysisFacade::class.java, CliFe10AnalysisFacade(project))
|
registerService(Fe10AnalysisFacade::class.java, CliFe10AnalysisFacade())
|
||||||
registerService(ModuleVisibilityManager::class.java, CliModuleVisibilityManagerImpl(enabled = true))
|
registerService(ModuleVisibilityManager::class.java, CliModuleVisibilityManagerImpl(enabled = true))
|
||||||
|
|
||||||
registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerDescriptorsImpl())
|
registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerDescriptorsImpl())
|
||||||
|
|||||||
+3
-2
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenFactory
|
|||||||
import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider
|
import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
|
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import java.util.concurrent.ConcurrentMap
|
import java.util.concurrent.ConcurrentMap
|
||||||
@@ -36,7 +36,8 @@ class KtFirAnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getAnalysisSession(useSiteKtElement: KtElement, factory: KtLifetimeTokenFactory): KtAnalysisSession {
|
override fun getAnalysisSession(useSiteKtElement: KtElement, factory: KtLifetimeTokenFactory): KtAnalysisSession {
|
||||||
return getAnalysisSessionByUseSiteKtModule(useSiteKtElement.getKtModule(project), factory)
|
val module = ProjectStructureProvider.getModule(useSiteKtElement, contextualModule = null)
|
||||||
|
return getAnalysisSessionByUseSiteKtModule(module, factory)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getAnalysisSessionByUseSiteKtModule(useSiteKtModule: KtModule, factory: KtLifetimeTokenFactory): KtAnalysisSession {
|
override fun getAnalysisSessionByUseSiteKtModule(useSiteKtModule: KtModule, factory: KtLifetimeTokenFactory): KtAnalysisSession {
|
||||||
|
|||||||
+3
-2
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider.
|
|||||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider.arrayOfSymbol
|
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider.arrayOfSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider.arrayTypeToArrayOfCall
|
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider.arrayTypeToArrayOfCall
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFunctionSymbol
|
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFunctionSymbol
|
||||||
|
import org.jetbrains.kotlin.analysis.api.getModule
|
||||||
import org.jetbrains.kotlin.analysis.api.impl.base.components.AbstractKtCallResolver
|
import org.jetbrains.kotlin.analysis.api.impl.base.components.AbstractKtCallResolver
|
||||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||||
import org.jetbrains.kotlin.analysis.api.signatures.KtCallableSignature
|
import org.jetbrains.kotlin.analysis.api.signatures.KtCallableSignature
|
||||||
@@ -1290,7 +1291,7 @@ internal class KtFirCallResolver(
|
|||||||
@KtAnalysisApiInternals
|
@KtAnalysisApiInternals
|
||||||
override fun unresolvedKtCallError(psi: KtElement): KtErrorCallInfo {
|
override fun unresolvedKtCallError(psi: KtElement): KtErrorCallInfo {
|
||||||
LOG.logErrorWithAttachment("${psi::class.simpleName} should always resolve to a KtCallInfo") {
|
LOG.logErrorWithAttachment("${psi::class.simpleName} should always resolve to a KtCallInfo") {
|
||||||
withPsiEntry("psi", psi)
|
withPsiEntry("psi", psi, analysisSession::getModule)
|
||||||
provideAdditionalAttachmentToUnresolvedCall(psi, this)
|
provideAdditionalAttachmentToUnresolvedCall(psi, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1309,7 +1310,7 @@ internal class KtFirCallResolver(
|
|||||||
"Error during resolving call ${element::class.java.name}",
|
"Error during resolving call ${element::class.java.name}",
|
||||||
exception = e,
|
exception = e,
|
||||||
) {
|
) {
|
||||||
withPsiEntry("psi", element)
|
withPsiEntry("psi", element, analysisSession::getModule)
|
||||||
element.getOrBuildFir(firResolveSession)?.let { withFirEntry("fir", it) }
|
element.getOrBuildFir(firResolveSession)?.let { withFirEntry("fir", it) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
|
|||||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||||
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.utils.cached
|
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||||
|
import org.jetbrains.kotlin.analysis.api.getModule
|
||||||
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
|
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
|
||||||
import org.jetbrains.kotlin.analysis.api.impl.base.symbols.toKtClassKind
|
import org.jetbrains.kotlin.analysis.api.impl.base.symbols.toKtClassKind
|
||||||
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
||||||
@@ -21,7 +22,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
|||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.firClassByPsiClassProvider
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.firClassByPsiClassProvider
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
|
||||||
import org.jetbrains.kotlin.analysis.utils.classIdIfNonLocal
|
import org.jetbrains.kotlin.analysis.utils.classIdIfNonLocal
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
@@ -116,7 +116,7 @@ internal class KtFirPsiJavaClassSymbol(
|
|||||||
override val hasLazyFirSymbol: Boolean get() = true
|
override val hasLazyFirSymbol: Boolean get() = true
|
||||||
|
|
||||||
override val firSymbol: FirRegularClassSymbol by cached {
|
override val firSymbol: FirRegularClassSymbol by cached {
|
||||||
val module = psi.getKtModule(analysisSession.project)
|
val module = analysisSession.getModule(psi)
|
||||||
val provider = analysisSession.firResolveSession.getSessionFor(module).firClassByPsiClassProvider
|
val provider = analysisSession.firResolveSession.getSessionFor(module).firClassByPsiClassProvider
|
||||||
val firClassSymbol = provider.getFirClass(psi)
|
val firClassSymbol = provider.getFirClass(psi)
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.components.KtFirAnalysisSessionComponent
|
import org.jetbrains.kotlin.analysis.api.fir.components.KtFirAnalysisSessionComponent
|
||||||
|
import org.jetbrains.kotlin.analysis.api.getModule
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
|
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbolOfType
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbolOfType
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
|
||||||
@@ -72,7 +72,7 @@ internal class KtFirSymbolProvider(
|
|||||||
is FirAnonymousFunctionSymbol -> firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(firSymbol)
|
is FirAnonymousFunctionSymbol -> firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(firSymbol)
|
||||||
else -> buildErrorWithAttachment("Unexpected ${firSymbol::class}") {
|
else -> buildErrorWithAttachment("Unexpected ${firSymbol::class}") {
|
||||||
withFirSymbolEntry("firSymbol", firSymbol)
|
withFirSymbolEntry("firSymbol", firSymbol)
|
||||||
withPsiEntry("function", psi)
|
withPsiEntry("function", psi, analysisSession::getModule)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,8 +141,9 @@ internal class KtFirSymbolProvider(
|
|||||||
return when (val firClassLike = resolveToFirSymbolOfType<FirClassLikeSymbol<*>>(firResolveSession)) {
|
return when (val firClassLike = resolveToFirSymbolOfType<FirClassLikeSymbol<*>>(firResolveSession)) {
|
||||||
is FirTypeAliasSymbol -> firClassLike.fullyExpandedClass(analysisSession.useSiteSession)
|
is FirTypeAliasSymbol -> firClassLike.fullyExpandedClass(analysisSession.useSiteSession)
|
||||||
?: buildErrorWithAttachment("${firClassLike.fir::class} should be expanded to the expected type alias") {
|
?: buildErrorWithAttachment("${firClassLike.fir::class} should be expanded to the expected type alias") {
|
||||||
|
val errorElement = this@resolveToFirClassLikeSymbol
|
||||||
withFirSymbolEntry("firClassLikeSymbol", firClassLike)
|
withFirSymbolEntry("firClassLikeSymbol", firClassLike)
|
||||||
withPsiEntry("ktClassOrObject", this@resolveToFirClassLikeSymbol)
|
withPsiEntry("ktClassOrObject", errorElement, analysisSession::getModule)
|
||||||
}
|
}
|
||||||
is FirAnonymousObjectSymbol -> firClassLike
|
is FirAnonymousObjectSymbol -> firClassLike
|
||||||
is FirRegularClassSymbol -> firClassLike
|
is FirRegularClassSymbol -> firClassLike
|
||||||
|
|||||||
+6
-2
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2023 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.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.fir.utils
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
||||||
|
import org.jetbrains.kotlin.analysis.api.getModule
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.DebugSymbolRenderer
|
import org.jetbrains.kotlin.analysis.api.symbols.DebugSymbolRenderer
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry
|
||||||
@@ -18,7 +19,10 @@ fun ExceptionAttachmentBuilder.withSymbolAttachment(name: String, symbol: KtSymb
|
|||||||
with(analysisSession) {
|
with(analysisSession) {
|
||||||
withEntry(name, symbol) { DebugSymbolRenderer(renderExtra = true).render(it) }
|
withEntry(name, symbol) { DebugSymbolRenderer(renderExtra = true).render(it) }
|
||||||
}
|
}
|
||||||
withPsiEntry("${name}Psi", symbol.psi)
|
|
||||||
|
val psi = symbol.psi
|
||||||
|
val psiModule = psi?.let(analysisSession::getModule)
|
||||||
|
withPsiEntry("${name}Psi", psi, psiModule)
|
||||||
|
|
||||||
if (symbol is KtFirSymbol<*>) {
|
if (symbol is KtFirSymbol<*>) {
|
||||||
val symbolFir = symbol.firSymbol.fir
|
val symbolFir = symbol.firSymbol.fir
|
||||||
|
|||||||
+13
-11
@@ -5,19 +5,18 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols
|
package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer
|
|
||||||
import org.jetbrains.kotlin.analysis.api.renderer.declarations.impl.KtDeclarationRendererForDebug
|
import org.jetbrains.kotlin.analysis.api.renderer.declarations.impl.KtDeclarationRendererForDebug
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
import org.jetbrains.kotlin.analysis.api.symbols.DebugSymbolRenderer
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol
|
||||||
import org.jetbrains.kotlin.analysis.utils.printer.prettyPrint
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.test.services.TestServices
|
|
||||||
import org.jetbrains.kotlin.test.services.assertions
|
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest
|
import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider
|
import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider
|
||||||
|
import org.jetbrains.kotlin.analysis.utils.printer.prettyPrint
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.test.services.TestModuleStructure
|
import org.jetbrains.kotlin.test.services.TestModuleStructure
|
||||||
|
import org.jetbrains.kotlin.test.services.TestServices
|
||||||
|
import org.jetbrains.kotlin.test.services.assertions
|
||||||
|
|
||||||
abstract class AbstractSymbolRestoreFromDifferentModuleTest : AbstractAnalysisApiBasedTest() {
|
abstract class AbstractSymbolRestoreFromDifferentModuleTest : AbstractAnalysisApiBasedTest() {
|
||||||
private val defaultRenderer = KtDeclarationRendererForDebug.WITH_QUALIFIED_NAMES
|
private val defaultRenderer = KtDeclarationRendererForDebug.WITH_QUALIFIED_NAMES
|
||||||
@@ -33,6 +32,9 @@ abstract class AbstractSymbolRestoreFromDifferentModuleTest : AbstractAnalysisAp
|
|||||||
caretTag = "restoreAt"
|
caretTag = "restoreAt"
|
||||||
).single().first
|
).single().first
|
||||||
|
|
||||||
|
val declarationModule = ProjectStructureProvider.getModule(declaration, contextualModule = null)
|
||||||
|
val restoreAtModule = ProjectStructureProvider.getModule(restoreAt, contextualModule = null)
|
||||||
|
|
||||||
val (debugRendered, prettyRendered, pointer) = analyseForTest(declaration) {
|
val (debugRendered, prettyRendered, pointer) = analyseForTest(declaration) {
|
||||||
val symbol = declaration.getSymbol()
|
val symbol = declaration.getSymbol()
|
||||||
val pointer = symbol.createPointer()
|
val pointer = symbol.createPointer()
|
||||||
@@ -46,19 +48,19 @@ abstract class AbstractSymbolRestoreFromDifferentModuleTest : AbstractAnalysisAp
|
|||||||
}
|
}
|
||||||
|
|
||||||
val actualDebug = prettyPrint {
|
val actualDebug = prettyPrint {
|
||||||
appendLine("Inital from ${declaration.getKtModule().moduleDescription}:")
|
appendLine("Inital from ${declarationModule.moduleDescription}:")
|
||||||
appendLine(debugRendered)
|
appendLine(debugRendered)
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine("Restored in ${restoreAt.getKtModule().moduleDescription}:")
|
appendLine("Restored in ${restoreAtModule.moduleDescription}:")
|
||||||
appendLine(debugRenderedRestored ?: NOT_RESTORED)
|
appendLine(debugRenderedRestored ?: NOT_RESTORED)
|
||||||
}
|
}
|
||||||
testServices.assertions.assertEqualsToTestDataFileSibling(actualDebug)
|
testServices.assertions.assertEqualsToTestDataFileSibling(actualDebug)
|
||||||
|
|
||||||
val actualPretty = prettyPrint {
|
val actualPretty = prettyPrint {
|
||||||
appendLine("Inital from ${declaration.getKtModule().moduleDescription}:")
|
appendLine("Inital from ${declarationModule.moduleDescription}:")
|
||||||
appendLine(prettyRendered)
|
appendLine(prettyRendered)
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine("Restored in ${restoreAt.getKtModule().moduleDescription}:")
|
appendLine("Restored in ${restoreAtModule.moduleDescription}:")
|
||||||
appendLine(prettyRenderedRestored ?: NOT_RESTORED)
|
appendLine(prettyRenderedRestored ?: NOT_RESTORED)
|
||||||
}
|
}
|
||||||
testServices.assertions.assertEqualsToTestDataFileSibling(actualPretty, extension = ".pretty.txt")
|
testServices.assertions.assertEqualsToTestDataFileSibling(actualPretty, extension = ".pretty.txt")
|
||||||
|
|||||||
@@ -5,12 +5,14 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.api
|
package org.jetbrains.kotlin.analysis.api
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.analysis.api.components.*
|
import org.jetbrains.kotlin.analysis.api.components.*
|
||||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner
|
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner
|
||||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
@@ -178,3 +180,7 @@ public abstract class KtAnalysisSession(final override val token: KtLifetimeToke
|
|||||||
get() = typesCreatorImpl
|
get() = typesCreatorImpl
|
||||||
protected abstract val typesCreatorImpl: KtTypeCreator
|
protected abstract val typesCreatorImpl: KtTypeCreator
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public fun KtAnalysisSession.getModule(element: PsiElement): KtModule {
|
||||||
|
return ProjectStructureProvider.getModule(element, useSiteModule)
|
||||||
|
}
|
||||||
+6
-3
@@ -8,11 +8,14 @@ package org.jetbrains.kotlin.analysis.utils.errors
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiInvalidElementAccessException
|
import com.intellij.psi.PsiInvalidElementAccessException
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
|
||||||
import org.jetbrains.kotlin.analysis.utils.printer.getElementTextInContext
|
import org.jetbrains.kotlin.analysis.utils.printer.getElementTextInContext
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
|
|
||||||
public fun ExceptionAttachmentBuilder.withPsiEntry(name: String, psi: PsiElement?) {
|
public fun ExceptionAttachmentBuilder.withPsiEntry(name: String, psi: PsiElement?, moduleFactory: (PsiElement) -> KtModule) {
|
||||||
|
return withPsiEntry(name, psi, psi?.let(moduleFactory))
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun ExceptionAttachmentBuilder.withPsiEntry(name: String, psi: PsiElement?, module: KtModule?) {
|
||||||
withEntry(name, psi) { psiElement ->
|
withEntry(name, psi) { psiElement ->
|
||||||
when {
|
when {
|
||||||
!psiElement.isValid -> "INVALID PSI ${PsiInvalidElementAccessException.findOutInvalidationReason(psiElement)}"
|
!psiElement.isValid -> "INVALID PSI ${PsiInvalidElementAccessException.findOutInvalidationReason(psiElement)}"
|
||||||
@@ -21,7 +24,7 @@ public fun ExceptionAttachmentBuilder.withPsiEntry(name: String, psi: PsiElement
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (psi != null) {
|
if (psi != null) {
|
||||||
withKtModuleEntry("${name}KtModule", psi.getKtModule())
|
withKtModuleEntry("${name}KtModule", module)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -11,6 +11,7 @@ import com.intellij.psi.PsiElement
|
|||||||
import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
|
import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider.CompilerPluginType
|
import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider.CompilerPluginType
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -20,7 +21,6 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
|||||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions.ASSIGN_METHOD
|
import org.jetbrains.kotlin.types.expressions.OperatorConventions.ASSIGN_METHOD
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
|
||||||
|
|
||||||
abstract class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleReference<KtSimpleNameExpression>(expression) {
|
abstract class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleReference<KtSimpleNameExpression>(expression) {
|
||||||
// Extension point used by deprecated android extensions.
|
// Extension point used by deprecated android extensions.
|
||||||
@@ -94,7 +94,7 @@ abstract class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSim
|
|||||||
abstract fun getImportAlias(): KtImportAlias?
|
abstract fun getImportAlias(): KtImportAlias?
|
||||||
|
|
||||||
private fun isAssignmentResolved(project: Project, binaryExpression: KtBinaryExpression): Boolean {
|
private fun isAssignmentResolved(project: Project, binaryExpression: KtBinaryExpression): Boolean {
|
||||||
val sourceModule = binaryExpression.getKtModule(element.project) as? KtSourceModule ?: return false
|
val sourceModule = ProjectStructureProvider.getModule(binaryExpression, contextualModule = null) as? KtSourceModule ?: return false
|
||||||
val reference = binaryExpression.operationReference.reference ?: return false
|
val reference = binaryExpression.operationReference.reference ?: return false
|
||||||
val pluginPresenceService = project.getService(KtCompilerPluginsProvider::class.java)
|
val pluginPresenceService = project.getService(KtCompilerPluginsProvider::class.java)
|
||||||
?: error("KtAssignResolutionPresenceService is not available as a service")
|
?: error("KtAssignResolutionPresenceService is not available as a service")
|
||||||
|
|||||||
+6
@@ -6,9 +6,11 @@
|
|||||||
package org.jetbrains.kotlin.analysis.low.level.api.fir.api
|
package org.jetbrains.kotlin.analysis.low.level.api.fir.api
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic
|
import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
@@ -57,3 +59,7 @@ abstract class LLFirResolveSession {
|
|||||||
|
|
||||||
abstract fun getTowerContextProvider(ktFile: KtFile): FirTowerContextProvider
|
abstract fun getTowerContextProvider(ktFile: KtFile): FirTowerContextProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun LLFirResolveSession.getModule(element: PsiElement): KtModule {
|
||||||
|
return ProjectStructureProvider.getModule(element, useSiteKtModule)
|
||||||
|
}
|
||||||
+7
-7
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLFirResolvableResolveSession
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLFirResolvableResolveSession
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry
|
import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry
|
||||||
import org.jetbrains.kotlin.analysis.utils.printer.getElementTextInContext
|
import org.jetbrains.kotlin.analysis.utils.printer.getElementTextInContext
|
||||||
@@ -105,8 +104,8 @@ object LowLevelFirApiFacadeForResolveOnAir {
|
|||||||
|
|
||||||
declaration.accept(expressionLocator)
|
declaration.accept(expressionLocator)
|
||||||
return expressionLocator.result ?: errorWithFirSpecificEntries("Resolved on-air element was not found in containing declaration") {
|
return expressionLocator.result ?: errorWithFirSpecificEntries("Resolved on-air element was not found in containing declaration") {
|
||||||
withPsiEntry("place", place)
|
withPsiEntry("place", place, firResolveSession::getModule)
|
||||||
withPsiEntry("elementToResolve", elementToResolve)
|
withPsiEntry("elementToResolve", elementToResolve, firResolveSession::getModule)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,7 +113,7 @@ object LowLevelFirApiFacadeForResolveOnAir {
|
|||||||
firResolveSession: LLFirResolveSession,
|
firResolveSession: LLFirResolveSession,
|
||||||
ktFile: KtFile,
|
ktFile: KtFile,
|
||||||
): FirTowerContextProvider {
|
): FirTowerContextProvider {
|
||||||
val ktModule = ktFile.getKtModule(firResolveSession.project)
|
val ktModule = firResolveSession.getModule(ktFile)
|
||||||
val session = firResolveSession.getSessionFor(ktModule) as LLFirResolvableModuleSession
|
val session = firResolveSession.getSessionFor(ktModule) as LLFirResolvableModuleSession
|
||||||
val moduleComponents = session.moduleComponents
|
val moduleComponents = session.moduleComponents
|
||||||
|
|
||||||
@@ -153,7 +152,8 @@ object LowLevelFirApiFacadeForResolveOnAir {
|
|||||||
firResolveSession: LLFirResolvableResolveSession,
|
firResolveSession: LLFirResolvableResolveSession,
|
||||||
file: KtFile,
|
file: KtFile,
|
||||||
): FirTowerDataContext {
|
): FirTowerDataContext {
|
||||||
val session = firResolveSession.getSessionFor(file.getKtModule(firResolveSession.project)) as LLFirResolvableModuleSession
|
val module = firResolveSession.getModule(file)
|
||||||
|
val session = firResolveSession.getSessionFor(module) as LLFirResolvableModuleSession
|
||||||
val moduleComponents = session.moduleComponents
|
val moduleComponents = session.moduleComponents
|
||||||
|
|
||||||
val firFile = moduleComponents.firFileBuilder.buildRawFirFileWithCaching(file)
|
val firFile = moduleComponents.firFileBuilder.buildRawFirFileWithCaching(file)
|
||||||
@@ -188,8 +188,8 @@ object LowLevelFirApiFacadeForResolveOnAir {
|
|||||||
|
|
||||||
val sameDeclarationInOriginalFile = PsiTreeUtil.findSameElementInCopy(dependencyNonLocalDeclaration, originalKtFile)
|
val sameDeclarationInOriginalFile = PsiTreeUtil.findSameElementInCopy(dependencyNonLocalDeclaration, originalKtFile)
|
||||||
?: buildErrorWithAttachment("Cannot find original function matching") {
|
?: buildErrorWithAttachment("Cannot find original function matching") {
|
||||||
withPsiEntry("matchingPsi", dependencyNonLocalDeclaration)
|
withPsiEntry("matchingPsi", dependencyNonLocalDeclaration, originalFirResolveSession::getModule)
|
||||||
withPsiEntry("originalFile", originalKtFile)
|
withPsiEntry("originalFile", originalKtFile, originalFirResolveSession::getModule)
|
||||||
}
|
}
|
||||||
|
|
||||||
recordOriginalDeclaration(
|
recordOriginalDeclaration(
|
||||||
|
|||||||
+10
-7
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.ThreadSafe
|
import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.ThreadSafe
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.checkWithAttachmentBuilder
|
import org.jetbrains.kotlin.analysis.utils.errors.checkWithAttachmentBuilder
|
||||||
import org.jetbrains.kotlin.fir.builder.BodyBuildingMode
|
import org.jetbrains.kotlin.fir.builder.BodyBuildingMode
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
@@ -18,16 +18,19 @@ import org.jetbrains.kotlin.psi.KtFile
|
|||||||
* Responsible for building [FirFile] by [KtFile]
|
* Responsible for building [FirFile] by [KtFile]
|
||||||
*/
|
*/
|
||||||
@ThreadSafe
|
@ThreadSafe
|
||||||
internal class LLFirFileBuilder(
|
internal class LLFirFileBuilder(val moduleComponents: LLFirModuleResolveComponents) {
|
||||||
val moduleComponents: LLFirModuleResolveComponents,
|
private val projectStructureProvider by lazy { ProjectStructureProvider.getInstance(moduleComponents.session.project) }
|
||||||
) {
|
|
||||||
fun buildRawFirFileWithCaching(ktFile: KtFile): FirFile = moduleComponents.cache.fileCached(ktFile) {
|
fun buildRawFirFileWithCaching(ktFile: KtFile): FirFile = moduleComponents.cache.fileCached(ktFile) {
|
||||||
checkWithAttachmentBuilder(ktFile.getKtModule() == moduleComponents.module, { "Modules are inconsistent" }) {
|
val contextualModule = moduleComponents.module
|
||||||
|
val actualFileModule = projectStructureProvider.getModule(ktFile, contextualModule)
|
||||||
|
|
||||||
|
checkWithAttachmentBuilder(actualFileModule == contextualModule, { "Modules are inconsistent" }) {
|
||||||
withEntry("file", ktFile.name)
|
withEntry("file", ktFile.name)
|
||||||
withEntry("file module", ktFile.getKtModule()) {
|
withEntry("file module", actualFileModule) {
|
||||||
it.toString()
|
it.toString()
|
||||||
}
|
}
|
||||||
withEntry("components module", moduleComponents.module) {
|
withEntry("components module", contextualModule) {
|
||||||
it.toString()
|
it.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.KtSourceElement
|
import org.jetbrains.kotlin.KtSourceElement
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignation
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignation
|
||||||
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry
|
import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry
|
||||||
@@ -218,7 +219,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
|
|||||||
val typeParameters = mutableListOf<FirTypeParameterRef>()
|
val typeParameters = mutableListOf<FirTypeParameterRef>()
|
||||||
context.appendOuterTypeParameters(ignoreLastLevel = false, typeParameters)
|
context.appendOuterTypeParameters(ignoreLastLevel = false, typeParameters)
|
||||||
val containingClass = this.containingClass ?: buildErrorWithAttachment("Constructor outside of class") {
|
val containingClass = this.containingClass ?: buildErrorWithAttachment("Constructor outside of class") {
|
||||||
withPsiEntry("constructor", constructor)
|
withPsiEntry("constructor", constructor, baseSession.llFirModuleData.ktModule)
|
||||||
}
|
}
|
||||||
val selfType = classOrObject.toDelegatedSelfType(typeParameters, containingClass.symbol)
|
val selfType = classOrObject.toDelegatedSelfType(typeParameters, containingClass.symbol)
|
||||||
val superTypeCallEntry = classOrObject.superTypeListEntries.lastIsInstanceOrNull<KtSuperTypeCallEntry>()
|
val superTypeCallEntry = classOrObject.superTypeListEntries.lastIsInstanceOrNull<KtSuperTypeCallEntry>()
|
||||||
@@ -230,7 +231,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
|
|||||||
val params = extractContructorConversionParams(classOrObject, constructor)
|
val params = extractContructorConversionParams(classOrObject, constructor)
|
||||||
val delegatedTypeRef = (originalDeclaration as FirConstructor).delegatedConstructor?.constructedTypeRef
|
val delegatedTypeRef = (originalDeclaration as FirConstructor).delegatedConstructor?.constructedTypeRef
|
||||||
?: buildErrorWithAttachment("Secondary constructor without delegated call") {
|
?: buildErrorWithAttachment("Secondary constructor without delegated call") {
|
||||||
withPsiEntry("constructor", constructor)
|
withPsiEntry("constructor", constructor, baseSession.llFirModuleData.ktModule)
|
||||||
}
|
}
|
||||||
return constructor.toFirConstructor(
|
return constructor.toFirConstructor(
|
||||||
delegatedTypeRef,
|
delegatedTypeRef,
|
||||||
@@ -264,7 +265,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
|
|||||||
|
|
||||||
override fun visitEnumEntry(enumEntry: KtEnumEntry, data: Unit?): FirElement {
|
override fun visitEnumEntry(enumEntry: KtEnumEntry, data: Unit?): FirElement {
|
||||||
val owner = containingClass ?: buildErrorWithAttachment("Enum entry outside of class") {
|
val owner = containingClass ?: buildErrorWithAttachment("Enum entry outside of class") {
|
||||||
withPsiEntry("enumEntry", enumEntry)
|
withPsiEntry("enumEntry", enumEntry, baseSession.llFirModuleData.ktModule)
|
||||||
}
|
}
|
||||||
val classOrObject = owner.psi as KtClassOrObject
|
val classOrObject = owner.psi as KtClassOrObject
|
||||||
val primaryConstructor = classOrObject.primaryConstructor
|
val primaryConstructor = classOrObject.primaryConstructor
|
||||||
|
|||||||
+1
-2
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.caches.NullableCaffeineCa
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirSymbolProviderNameCacheBase
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirSymbolProviderNameCacheBase
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
|
||||||
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
|
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
|
||||||
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
|
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
@@ -105,7 +104,7 @@ internal class LLFirCombinedKotlinSymbolProvider private constructor(
|
|||||||
val callableId = CallableId(packageFqName, name)
|
val callableId = CallableId(packageFqName, name)
|
||||||
|
|
||||||
declarationProvider.getTopLevelCallableFiles(callableId)
|
declarationProvider.getTopLevelCallableFiles(callableId)
|
||||||
.groupBy { it.getKtModule(project) }
|
.groupBy { getModule(it) }
|
||||||
.forEach { (ktModule, ktFiles) ->
|
.forEach { (ktModule, ktFiles) ->
|
||||||
// If `ktModule` cannot be found in the map, `ktFiles` cannot be processed by any of the available providers, because none
|
// If `ktModule` cannot be found in the map, `ktFiles` cannot be processed by any of the available providers, because none
|
||||||
// of them belong to the correct module. We can skip in that case, because iterating through all providers wouldn't lead to
|
// of them belong to the correct module. We can skip in that case, because iterating through all providers wouldn't lead to
|
||||||
|
|||||||
+2
-3
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.psi
|
|||||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
|
||||||
import org.jetbrains.kotlin.analysis.utils.classIdIfNonLocal
|
import org.jetbrains.kotlin.analysis.utils.classIdIfNonLocal
|
||||||
|
|
||||||
class LLFirFirClassByPsiClassProvider(private val session: LLFirSession) : FirSessionComponent {
|
class LLFirFirClassByPsiClassProvider(private val session: LLFirSession) : FirSessionComponent {
|
||||||
@@ -37,7 +36,7 @@ class LLFirFirClassByPsiClassProvider(private val session: LLFirSession) : FirSe
|
|||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
withEntry("virtualFilePath", psiClass.containingFile.virtualFile?.path)
|
withEntry("virtualFilePath", psiClass.containingFile.virtualFile?.path)
|
||||||
withPsiEntry("psiClass", psiClass)
|
withPsiEntry("psiClass", psiClass, session.ktModule)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (psiClass.qualifiedName == null) {
|
if (psiClass.qualifiedName == null) {
|
||||||
@@ -71,7 +70,7 @@ class LLFirFirClassByPsiClassProvider(private val session: LLFirSession) : FirSe
|
|||||||
val provider = session.nullableJavaSymbolProvider ?: session.symbolProvider
|
val provider = session.nullableJavaSymbolProvider ?: session.symbolProvider
|
||||||
val symbol = provider.getClassLikeSymbolByClassId(classId)
|
val symbol = provider.getClassLikeSymbolByClassId(classId)
|
||||||
?: buildErrorWithAttachment("No classifier found") {
|
?: buildErrorWithAttachment("No classifier found") {
|
||||||
withPsiEntry("psiClass", psiClass)
|
withPsiEntry("psiClass", psiClass, session.ktModule)
|
||||||
withEntry("classId", classId) { it.asString() }
|
withEntry("classId", classId) { it.asString() }
|
||||||
}
|
}
|
||||||
return symbol as FirRegularClassSymbol
|
return symbol as FirRegularClassSymbol
|
||||||
|
|||||||
+5
-2
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSourcesSession
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSourcesSession
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getContainingFile
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getContainingFile
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.analysis.providers.KotlinAnnotationsResolver
|
import org.jetbrains.kotlin.analysis.providers.KotlinAnnotationsResolver
|
||||||
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
|
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
@@ -44,6 +45,7 @@ internal class LLFirIdePredicateBasedProvider(
|
|||||||
private val annotationsResolver: KotlinAnnotationsResolver,
|
private val annotationsResolver: KotlinAnnotationsResolver,
|
||||||
private val declarationProvider: KotlinDeclarationProvider,
|
private val declarationProvider: KotlinDeclarationProvider,
|
||||||
) : FirPredicateBasedProvider() {
|
) : FirPredicateBasedProvider() {
|
||||||
|
private val projectStructureProvider by lazy { ProjectStructureProvider.getInstance(session.project) }
|
||||||
|
|
||||||
private val registeredPluginAnnotations: FirRegisteredPluginAnnotations
|
private val registeredPluginAnnotations: FirRegisteredPluginAnnotations
|
||||||
get() = session.registeredPluginAnnotations
|
get() = session.registeredPluginAnnotations
|
||||||
@@ -75,8 +77,9 @@ internal class LLFirIdePredicateBasedProvider(
|
|||||||
this !is KtProperty
|
this !is KtProperty
|
||||||
) return null
|
) return null
|
||||||
|
|
||||||
val firResolveSession = this.getFirResolveSession()
|
val moduleForFile = projectStructureProvider.getModule(this, session.ktModule)
|
||||||
return this.resolveToFirSymbol(firResolveSession).fir
|
val sessionForFile = moduleForFile.getFirResolveSession(project)
|
||||||
|
return this.resolveToFirSymbol(sessionForFile).fir
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getOwnersOfDeclaration(declaration: FirDeclaration): List<FirBasedSymbol<*>>? {
|
override fun getOwnersOfDeclaration(declaration: FirDeclaration): List<FirBasedSymbol<*>>? {
|
||||||
|
|||||||
+8
-2
@@ -40,7 +40,13 @@ abstract class LLFirSelectingCombinedSymbolProvider<PROVIDER : FirSymbolProvider
|
|||||||
/**
|
/**
|
||||||
* Cache [ProjectStructureProvider] to avoid service access when getting [KtModule]s.
|
* Cache [ProjectStructureProvider] to avoid service access when getting [KtModule]s.
|
||||||
*/
|
*/
|
||||||
private val projectStructureProvider: ProjectStructureProvider = project.getService(ProjectStructureProvider::class.java)
|
private val projectStructureProvider: ProjectStructureProvider = ProjectStructureProvider.getInstance(project)
|
||||||
|
|
||||||
|
private val contextualModule = session.llFirModuleData.ktModule
|
||||||
|
|
||||||
|
protected fun getModule(element: PsiElement): KtModule {
|
||||||
|
return projectStructureProvider.getModule(element, contextualModule)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Selects the element with the highest module precedence in [candidates], returning the element and the provider to which resolution
|
* Selects the element with the highest module precedence in [candidates], returning the element and the provider to which resolution
|
||||||
@@ -60,7 +66,7 @@ abstract class LLFirSelectingCombinedSymbolProvider<PROVIDER : FirSymbolProvider
|
|||||||
|
|
||||||
for (candidate in candidates) {
|
for (candidate in candidates) {
|
||||||
val element = getElement(candidate) ?: continue
|
val element = getElement(candidate) ?: continue
|
||||||
val ktModule = projectStructureProvider.getKtModuleForKtElement(element)
|
val ktModule = getModule(element)
|
||||||
|
|
||||||
// If `ktModule` cannot be found in the map, `candidate` cannot be processed by any of the available providers, because none of
|
// If `ktModule` cannot be found in the map, `candidate` cannot be processed by any of the available providers, because none of
|
||||||
// them belong to the correct module. We can skip in that case, because iterating through all providers wouldn't lead to any
|
// them belong to the correct module. We can skip in that case, because iterating through all providers wouldn't lead to any
|
||||||
|
|||||||
+8
-8
@@ -10,6 +10,7 @@ import com.intellij.psi.util.CachedValueProvider
|
|||||||
import com.intellij.psi.util.CachedValuesManager
|
import com.intellij.psi.util.CachedValuesManager
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
|
||||||
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.analysis.low.level.api.fir.api.getModule
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.canBePartOfParentDeclaration
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.canBePartOfParentDeclaration
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration
|
||||||
@@ -23,7 +24,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecific
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.findSourceNonLocalFirDeclaration
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.findSourceNonLocalFirDeclaration
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance
|
import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry
|
import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry
|
||||||
@@ -93,15 +93,15 @@ internal abstract class LLFirResolvableResolveSession(
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected fun getModuleComponentsForElement(element: KtElement): LLFirModuleResolveComponents {
|
protected fun getModuleComponentsForElement(element: KtElement): LLFirModuleResolveComponents {
|
||||||
val ktModule = element.getKtModule()
|
val module = getModule(element)
|
||||||
return getResolvableSessionFor(ktModule).moduleComponents
|
return getResolvableSessionFor(module).moduleComponents
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun resolveToFirSymbol(
|
override fun resolveToFirSymbol(
|
||||||
ktDeclaration: KtDeclaration,
|
ktDeclaration: KtDeclaration,
|
||||||
phase: FirResolvePhase
|
phase: FirResolvePhase
|
||||||
): FirBasedSymbol<*> {
|
): FirBasedSymbol<*> {
|
||||||
val module = ktDeclaration.getKtModule()
|
val module = getModule(ktDeclaration)
|
||||||
retryOnInvalidSession {
|
retryOnInvalidSession {
|
||||||
return when (getModuleKind(module)) {
|
return when (getModuleKind(module)) {
|
||||||
ModuleKind.RESOLVABLE_MODULE -> findSourceFirSymbol(ktDeclaration, module).also { resolveFirToPhase(it.fir, phase) }
|
ModuleKind.RESOLVABLE_MODULE -> findSourceFirSymbol(ktDeclaration, module).also { resolveFirToPhase(it.fir, phase) }
|
||||||
@@ -115,9 +115,9 @@ internal abstract class LLFirResolvableResolveSession(
|
|||||||
"This method will only work on compiled declarations, but this declaration is not compiled: ${ktDeclaration.getElementTextInContext()}"
|
"This method will only work on compiled declarations, but this declaration is not compiled: ${ktDeclaration.getElementTextInContext()}"
|
||||||
}
|
}
|
||||||
|
|
||||||
val ktModule = ktDeclaration.getKtModule(project)
|
val module = getModule(ktDeclaration)
|
||||||
val firSession = getSessionFor(ktModule)
|
val session = getSessionFor(module)
|
||||||
val searcher = FirDeclarationForCompiledElementSearcher(firSession.symbolProvider)
|
val searcher = FirDeclarationForCompiledElementSearcher(session.symbolProvider)
|
||||||
val firDeclaration = searcher.findNonLocalDeclaration(ktDeclaration)
|
val firDeclaration = searcher.findNonLocalDeclaration(ktDeclaration)
|
||||||
return firDeclaration.symbol
|
return firDeclaration.symbol
|
||||||
}
|
}
|
||||||
@@ -133,7 +133,7 @@ internal abstract class LLFirResolvableResolveSession(
|
|||||||
|
|
||||||
val nonLocalDeclaration = ktDeclaration.getNonLocalContainingOrThisDeclaration()
|
val nonLocalDeclaration = ktDeclaration.getNonLocalContainingOrThisDeclaration()
|
||||||
?: buildErrorWithAttachment("Declaration should have non-local container") {
|
?: buildErrorWithAttachment("Declaration should have non-local container") {
|
||||||
withPsiEntry("ktDeclaration", ktDeclaration)
|
withPsiEntry("ktDeclaration", ktDeclaration, ::getModule)
|
||||||
withEntry("module", module) { it.moduleDescription }
|
withEntry("module", module) { it.moduleDescription }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-2
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.util
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirModuleWithDependenciesSymbolProvider
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirModuleWithDependenciesSymbolProvider
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirBuiltinsAndCloneableSession
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirBuiltinsAndCloneableSession
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.ExceptionAttachmentBuilder
|
import org.jetbrains.kotlin.analysis.utils.errors.ExceptionAttachmentBuilder
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.withClassEntry
|
import org.jetbrains.kotlin.analysis.utils.errors.withClassEntry
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
@@ -26,6 +26,11 @@ import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
|||||||
* Allows to search for FIR declarations by compiled [KtDeclaration]s.
|
* Allows to search for FIR declarations by compiled [KtDeclaration]s.
|
||||||
*/
|
*/
|
||||||
internal class FirDeclarationForCompiledElementSearcher(private val symbolProvider: FirSymbolProvider) {
|
internal class FirDeclarationForCompiledElementSearcher(private val symbolProvider: FirSymbolProvider) {
|
||||||
|
private val projectStructureProvider by lazy {
|
||||||
|
val project = symbolProvider.session.llFirModuleData.ktModule.project
|
||||||
|
ProjectStructureProvider.getInstance(project)
|
||||||
|
}
|
||||||
|
|
||||||
fun findNonLocalDeclaration(ktDeclaration: KtDeclaration): FirDeclaration {
|
fun findNonLocalDeclaration(ktDeclaration: KtDeclaration): FirDeclaration {
|
||||||
return when (ktDeclaration) {
|
return when (ktDeclaration) {
|
||||||
is KtEnumEntry -> findNonLocalEnumEntry(ktDeclaration)
|
is KtEnumEntry -> findNonLocalEnumEntry(ktDeclaration)
|
||||||
@@ -81,7 +86,10 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid
|
|||||||
if (classCandidate == null) {
|
if (classCandidate == null) {
|
||||||
errorWithFirSpecificEntries("We should be able to find a symbol for $classId", psi = declaration) {
|
errorWithFirSpecificEntries("We should be able to find a symbol for $classId", psi = declaration) {
|
||||||
withEntry("classId", classId) { it.asString() }
|
withEntry("classId", classId) { it.asString() }
|
||||||
withEntry("ktModule", declaration.getKtModule()) { it.moduleDescription }
|
|
||||||
|
val contextualModule = symbolProvider.session.llFirModuleData.ktModule
|
||||||
|
val moduleForFile = projectStructureProvider.getModule(declaration, contextualModule)
|
||||||
|
withEntry("ktModule", moduleForFile) { it.moduleDescription }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -7,7 +7,8 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.util
|
|||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.ExceptionAttachmentBuilder
|
import org.jetbrains.kotlin.analysis.utils.errors.ExceptionAttachmentBuilder
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.withKtModuleEntry
|
import org.jetbrains.kotlin.analysis.utils.errors.withKtModuleEntry
|
||||||
@@ -36,7 +37,7 @@ fun ExceptionAttachmentBuilder.withFirEntry(name: String, fir: FirElement) {
|
|||||||
if (fir is FirElementWithResolveState) {
|
if (fir is FirElementWithResolveState) {
|
||||||
withKtModuleEntry("${name}KtModule", fir.llFirModuleData.ktModule)
|
withKtModuleEntry("${name}KtModule", fir.llFirModuleData.ktModule)
|
||||||
}
|
}
|
||||||
withPsiEntry("${name}Psi", fir.psi)
|
withPsiEntry("${name}Psi", fir.psi, (fir as? FirElementWithResolveState)?.llFirSession?.ktModule)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -65,7 +66,7 @@ fun errorWithFirSpecificEntries(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (psi != null) {
|
if (psi != null) {
|
||||||
withPsiEntry("psi", psi)
|
withPsiEntry("psi", psi, ProjectStructureProvider.getModule(psi, contextualModule = null))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (coneType != null) {
|
if (coneType != null) {
|
||||||
|
|||||||
+2
-2
@@ -48,8 +48,8 @@ class SealedClassesInheritorsCaclulatorPreAnalysisHandler(
|
|||||||
for ((testModule, ktFiles) in ktFilesByModule) {
|
for ((testModule, ktFiles) in ktFilesByModule) {
|
||||||
if (ktFiles.isEmpty()) continue
|
if (ktFiles.isEmpty()) continue
|
||||||
val project = testServices.compilerConfigurationProvider.getProject(testModule)
|
val project = testServices.compilerConfigurationProvider.getProject(testModule)
|
||||||
val ktModuleProvider = project.getService(ProjectStructureProvider::class.java)
|
val projectStructureProvider = project.getService(ProjectStructureProvider::class.java)
|
||||||
val ktModule = ktFiles.map(ktModuleProvider::getKtModuleForKtElement).distinct().single()
|
val ktModule = ktFiles.map { projectStructureProvider.getModule(it, contextualModule = null) }.distinct().single()
|
||||||
|
|
||||||
val tmpFirResolveSession = LLFirResolveSessionService.getInstance(project).getFirResolveSessionNoCaching(ktModule)
|
val tmpFirResolveSession = LLFirResolveSessionService.getInstance(project).getFirResolveSessionNoCaching(ktModule)
|
||||||
val firFiles = ktFiles.map { it.getOrBuildFirFile(tmpFirResolveSession) }
|
val firFiles = ktFiles.map { it.getOrBuildFirFile(tmpFirResolveSession) }
|
||||||
|
|||||||
+3
-2
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getDiagnostics
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getDiagnostics
|
||||||
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getModule
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.BeforeElementDiagnosticCollectionHandler
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.BeforeElementDiagnosticCollectionHandler
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.beforeElementDiagnosticCollectionHandler
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.beforeElementDiagnosticCollectionHandler
|
||||||
@@ -22,7 +23,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLeve
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirOutOfContentRootTestConfigurator
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirOutOfContentRootTestConfigurator
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.useFirSessionConfigurator
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.useFirSessionConfigurator
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
|
||||||
import org.jetbrains.kotlin.fir.SessionConfiguration
|
import org.jetbrains.kotlin.fir.SessionConfiguration
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
@@ -45,7 +45,8 @@ abstract class AbstractFirContextCollectionTest : AbstractLowLevelApiSingleFileT
|
|||||||
resolveWithClearCaches(ktFile) { firResolveSession ->
|
resolveWithClearCaches(ktFile) { firResolveSession ->
|
||||||
check(firResolveSession.isSourceSession)
|
check(firResolveSession.isSourceSession)
|
||||||
|
|
||||||
val session = firResolveSession.getSessionFor(ktFile.getKtModule()) as LLFirResolvableModuleSession
|
val module = firResolveSession.getModule(ktFile)
|
||||||
|
val session = firResolveSession.getSessionFor(module) as LLFirResolvableModuleSession
|
||||||
val handler = session.beforeElementDiagnosticCollectionHandler as BeforeElementTestDiagnosticCollectionHandler
|
val handler = session.beforeElementDiagnosticCollectionHandler as BeforeElementTestDiagnosticCollectionHandler
|
||||||
|
|
||||||
val fileStructureCache = session.moduleComponents.fileStructureCache
|
val fileStructureCache = session.moduleComponents.fileStructureCache
|
||||||
|
|||||||
+4
-3
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirResolvableM
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirOutOfContentRootTestConfigurator
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirOutOfContentRootTestConfigurator
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType
|
import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType
|
||||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||||
@@ -102,9 +102,10 @@ abstract class AbstractFileStructureTest : AbstractLowLevelApiSingleFileTest() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun KtFile.getFileStructure(): FileStructure {
|
private fun KtFile.getFileStructure(): FileStructure {
|
||||||
val moduleFirResolveSession = getFirResolveSession()
|
val module = ProjectStructureProvider.getModule(this, contextualModule = null)
|
||||||
|
val moduleFirResolveSession = module.getFirResolveSession(project)
|
||||||
check(moduleFirResolveSession.isSourceSession)
|
check(moduleFirResolveSession.isSourceSession)
|
||||||
val session = moduleFirResolveSession.getSessionFor(getKtModule()) as LLFirResolvableModuleSession
|
val session = moduleFirResolveSession.getSessionFor(module) as LLFirResolvableModuleSession
|
||||||
return session.moduleComponents.fileStructureCache.getFileStructure(this)
|
return session.moduleComponents.fileStructureCache.getFileStructure(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionConfigurator
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionConfigurator
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLFirNotUnderContentRootResolveSession
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLFirNotUnderContentRootResolveSession
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLFirSourceResolveSession
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLFirSourceResolveSession
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager
|
import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
@@ -40,7 +40,7 @@ internal fun FirDeclaration.name(): String = symbol.name()
|
|||||||
|
|
||||||
internal inline fun <R> resolveWithClearCaches(context: KtElement, action: (LLFirResolveSession) -> R): R {
|
internal inline fun <R> resolveWithClearCaches(context: KtElement, action: (LLFirResolveSession) -> R): R {
|
||||||
val project = context.project
|
val project = context.project
|
||||||
val module = context.getKtModule(project)
|
val module = ProjectStructureProvider.getModule(context, contextualModule = null)
|
||||||
val resolveSession = LLFirResolveSessionService.getInstance(project).getFirResolveSessionNoCaching(module)
|
val resolveSession = LLFirResolveSessionService.getInstance(project).getFirResolveSessionNoCaching(module)
|
||||||
return action(resolveSession)
|
return action(resolveSession)
|
||||||
}
|
}
|
||||||
|
|||||||
+24
-13
@@ -35,6 +35,8 @@ import org.jetbrains.kotlin.psi.KtFile
|
|||||||
import org.jetbrains.kotlin.psi.KtScript
|
import org.jetbrains.kotlin.psi.KtScript
|
||||||
|
|
||||||
class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase<KtModule>(project) {
|
class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase<KtModule>(project) {
|
||||||
|
private val projectStructureProvider by lazy { ProjectStructureProvider.getInstance(project) }
|
||||||
|
|
||||||
override fun findClassOrObjectDeclarationsInPackage(
|
override fun findClassOrObjectDeclarationsInPackage(
|
||||||
packageFqName: FqName,
|
packageFqName: FqName,
|
||||||
searchScope: GlobalSearchScope
|
searchScope: GlobalSearchScope
|
||||||
@@ -92,16 +94,21 @@ class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase<KtMo
|
|||||||
.map { fqn.child(it) }
|
.map { fqn.child(it) }
|
||||||
|
|
||||||
override fun createInstanceOfLightScript(script: KtScript): KtLightClass {
|
override fun createInstanceOfLightScript(script: KtScript): KtLightClass {
|
||||||
return SymbolLightClassForScript(script, script.getKtModule(project))
|
val module = ProjectStructureProvider.getModule(script, contextualModule = null)
|
||||||
|
return SymbolLightClassForScript(script, module)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun KtFile.findModule(): KtModule = getKtModule(project)
|
override fun KtFile.findModule(): KtModule {
|
||||||
|
return projectStructureProvider.getModule(this, contextualModule = null)
|
||||||
|
}
|
||||||
|
|
||||||
override fun declarationLocation(file: KtFile): DeclarationLocation? = when (file.getKtModule(project)) {
|
override fun declarationLocation(file: KtFile): DeclarationLocation? {
|
||||||
is KtSourceModule -> DeclarationLocation.ProjectSources
|
return when (projectStructureProvider.getModule(file, contextualModule = null)) {
|
||||||
is KtLibraryModule -> DeclarationLocation.LibraryClasses
|
is KtSourceModule -> DeclarationLocation.ProjectSources
|
||||||
is KtLibrarySourceModule -> DeclarationLocation.LibrarySources
|
is KtLibraryModule -> DeclarationLocation.LibraryClasses
|
||||||
else -> null
|
is KtLibrarySourceModule -> DeclarationLocation.LibrarySources
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createInstanceOfDecompiledLightClass(classOrObject: KtClassOrObject): KtLightClass? {
|
override fun createInstanceOfDecompiledLightClass(classOrObject: KtClassOrObject): KtLightClass? {
|
||||||
@@ -109,7 +116,8 @@ class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase<KtMo
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun createInstanceOfLightClass(classOrObject: KtClassOrObject): KtLightClass? {
|
override fun createInstanceOfLightClass(classOrObject: KtClassOrObject): KtLightClass? {
|
||||||
return createSymbolLightClassNoCache(classOrObject, classOrObject.getKtModule(project))
|
val module = projectStructureProvider.getModule(classOrObject, contextualModule = null)
|
||||||
|
return createSymbolLightClassNoCache(classOrObject, module)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createInstanceOfDecompiledLightFacade(facadeFqName: FqName, files: List<KtFile>): KtLightClassForFacade? {
|
override fun createInstanceOfDecompiledLightFacade(facadeFqName: FqName, files: List<KtFile>): KtLightClassForFacade? {
|
||||||
@@ -128,10 +136,10 @@ class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase<KtMo
|
|||||||
return project.createAllLibrariesModificationTracker()
|
return project.createAllLibrariesModificationTracker()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createInstanceOfLightFacade(
|
override fun createInstanceOfLightFacade(facadeFqName: FqName, files: List<KtFile>): KtLightClassForFacade {
|
||||||
facadeFqName: FqName,
|
val module = projectStructureProvider.getModule(files.first(), contextualModule = null)
|
||||||
files: List<KtFile>,
|
return SymbolLightClassForFacade(facadeFqName, files, module)
|
||||||
): KtLightClassForFacade = SymbolLightClassForFacade(facadeFqName, files, files.first().getKtModule(project))
|
}
|
||||||
|
|
||||||
override val KtModule.contentSearchScope: GlobalSearchScope get() = this.contentScope
|
override val KtModule.contentSearchScope: GlobalSearchScope get() = this.contentScope
|
||||||
|
|
||||||
@@ -168,7 +176,10 @@ class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase<KtMo
|
|||||||
|
|
||||||
override fun getFakeLightClass(classOrObject: KtClassOrObject): KtFakeLightClass = SymbolBasedFakeLightClass(classOrObject)
|
override fun getFakeLightClass(classOrObject: KtClassOrObject): KtFakeLightClass = SymbolBasedFakeLightClass(classOrObject)
|
||||||
|
|
||||||
private fun KtElement.isFromSourceOrLibraryBinary(project: Project): Boolean = getKtModule(project).isFromSourceOrLibraryBinary()
|
private fun KtElement.isFromSourceOrLibraryBinary(): Boolean {
|
||||||
|
val module = projectStructureProvider.getModule(this, contextualModule = null)
|
||||||
|
return module.isFromSourceOrLibraryBinary()
|
||||||
|
}
|
||||||
|
|
||||||
private fun KtModule.isFromSourceOrLibraryBinary() = when (this) {
|
private fun KtModule.isFromSourceOrLibraryBinary() = when (this) {
|
||||||
is KtSourceModule -> true
|
is KtSourceModule -> true
|
||||||
|
|||||||
+2
-2
@@ -11,6 +11,7 @@ import com.intellij.psi.PsiModifier
|
|||||||
import com.intellij.psi.PsiReferenceList
|
import com.intellij.psi.PsiReferenceList
|
||||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.analysis.api.annotations.hasAnnotation
|
import org.jetbrains.kotlin.analysis.api.annotations.hasAnnotation
|
||||||
|
import org.jetbrains.kotlin.analysis.api.getModule
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithTypeParameters
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithTypeParameters
|
||||||
@@ -21,7 +22,6 @@ import org.jetbrains.kotlin.analysis.api.types.KtType
|
|||||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode
|
import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModuleOfTypeSafe
|
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance
|
import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance
|
||||||
import org.jetbrains.kotlin.analysis.utils.printer.parentOfType
|
import org.jetbrains.kotlin.analysis.utils.printer.parentOfType
|
||||||
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
|
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
|
||||||
@@ -537,7 +537,7 @@ internal fun KtSymbolWithMembers.createInnerClasses(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val jvmDefaultMode = classOrObject
|
val jvmDefaultMode = classOrObject
|
||||||
?.getKtModuleOfTypeSafe<KtSourceModule>()
|
?.let { getModule(it) as? KtSourceModule }
|
||||||
?.languageVersionSettings
|
?.languageVersionSettings
|
||||||
?.getFlag(JvmAnalysisFlags.jvmDefaultMode)
|
?.getFlag(JvmAnalysisFlags.jvmDefaultMode)
|
||||||
?: JvmDefaultMode.DEFAULT
|
?: JvmDefaultMode.DEFAULT
|
||||||
|
|||||||
Reference in New Issue
Block a user