[LL] anchor module provider for navigation in monorepo
Use information from IDE about anchor module, to include everything from that module and dependencies into library session ^ KTIJ-24683
This commit is contained in:
+26
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.analysis.providers
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule
|
||||
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
||||
|
||||
/**
|
||||
* Provide module which contains dependencies of the library.
|
||||
*
|
||||
* Is required for navigation in IJ monorepo from kotlin compiler library sources to IJ platform sources.
|
||||
* Kotlin compiler depends on platform but this dependency is not represented as jars in monorepo
|
||||
* but should be replaced with given sources.
|
||||
*/
|
||||
public interface KotlinAnchorModuleProvider {
|
||||
public fun getAnchorModule(libraryModule: KtLibraryModule): KtSourceModule?
|
||||
|
||||
public companion object {
|
||||
public fun getInstance(project: Project): KotlinAnchorModuleProvider? =
|
||||
project.getService(KotlinAnchorModuleProvider::class.java)
|
||||
}
|
||||
}
|
||||
+23
-1
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveCompone
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.*
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.*
|
||||
import org.jetbrains.kotlin.analysis.project.structure.*
|
||||
import org.jetbrains.kotlin.analysis.providers.KotlinAnchorModuleProvider
|
||||
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
|
||||
import org.jetbrains.kotlin.analysis.providers.createAnnotationResolver
|
||||
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
|
||||
@@ -300,7 +301,11 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
|
||||
val scopeProvider = FirKotlinScopeProvider()
|
||||
val components = LLFirModuleResolveComponents(module, globalResolveComponents, scopeProvider)
|
||||
|
||||
val dependencyTracker = builtinsSession.modificationTracker
|
||||
val moduleAnchorSession = KotlinAnchorModuleProvider.getInstance(project)?.getAnchorModule(libraryModule)?.let {
|
||||
LLFirSessionCache.getInstance(project).getSession(it)
|
||||
}
|
||||
|
||||
val dependencyTracker = createLibraryDependencyTracker(moduleAnchorSession, builtinsSession)
|
||||
val session =
|
||||
LLFirLibraryOrLibrarySourceResolvableModuleSession(module, dependencyTracker, components, builtinsSession.builtinTypes)
|
||||
components.session = session
|
||||
@@ -348,6 +353,13 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
|
||||
)
|
||||
|
||||
addAll(restLibrariesProvider)
|
||||
|
||||
moduleAnchorSession?.let {
|
||||
(it.symbolProvider as LLFirModuleWithDependenciesSymbolProvider).also { moduleSymbolProvider ->
|
||||
addAll(moduleSymbolProvider.providers)
|
||||
addAll(moduleSymbolProvider.dependencyProvider.providers)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@@ -459,6 +471,16 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
|
||||
return CompositeModificationTracker.createFlattened(trackers)
|
||||
}
|
||||
|
||||
private fun createLibraryDependencyTracker(moduleAnchorSession: LLFirSession?, builtinsSession: LLFirBuiltinsAndCloneableSession): ModificationTracker {
|
||||
return moduleAnchorSession?.let {
|
||||
CompositeModificationTracker.createFlattened(buildList {
|
||||
add(moduleAnchorSession.modificationTracker)
|
||||
add(builtinsSession.modificationTracker)
|
||||
})
|
||||
}
|
||||
?: builtinsSession.modificationTracker
|
||||
}
|
||||
|
||||
private fun createModuleData(session: LLFirSession): LLFirModuleData {
|
||||
return LLFirModuleData(session.ktModule).apply { bindSession(session) }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user