From f96b5bae486b5b0d806debb33054d48139a7df91 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 30 Jun 2023 16:36:04 +0200 Subject: [PATCH] [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 --- .../providers/KotlinAnchorModuleProvider.kt | 26 +++++++++++++++++++ .../sessions/LLFirAbstractSessionFactory.kt | 24 ++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinAnchorModuleProvider.kt diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinAnchorModuleProvider.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinAnchorModuleProvider.kt new file mode 100644 index 00000000000..0597ac1e467 --- /dev/null +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/KotlinAnchorModuleProvider.kt @@ -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) + } +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt index 13e95a5d7bf..5dae10a2a8f 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt @@ -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) } }