[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.project.structure.*
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.*
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.*
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.*
|
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.KotlinDeclarationProvider
|
||||||
import org.jetbrains.kotlin.analysis.providers.createAnnotationResolver
|
import org.jetbrains.kotlin.analysis.providers.createAnnotationResolver
|
||||||
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
|
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
|
||||||
@@ -300,7 +301,11 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
|
|||||||
val scopeProvider = FirKotlinScopeProvider()
|
val scopeProvider = FirKotlinScopeProvider()
|
||||||
val components = LLFirModuleResolveComponents(module, globalResolveComponents, scopeProvider)
|
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 =
|
val session =
|
||||||
LLFirLibraryOrLibrarySourceResolvableModuleSession(module, dependencyTracker, components, builtinsSession.builtinTypes)
|
LLFirLibraryOrLibrarySourceResolvableModuleSession(module, dependencyTracker, components, builtinsSession.builtinTypes)
|
||||||
components.session = session
|
components.session = session
|
||||||
@@ -348,6 +353,13 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
|
|||||||
)
|
)
|
||||||
|
|
||||||
addAll(restLibrariesProvider)
|
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)
|
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 {
|
private fun createModuleData(session: LLFirSession): LLFirModuleData {
|
||||||
return LLFirModuleData(session.ktModule).apply { bindSession(session) }
|
return LLFirModuleData(session.ktModule).apply { bindSession(session) }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user