FIR: implements multi-module resolve, add tests #KT-24093 Fixed
This commit introduces FIR session provider, dependency provider, library session + other infrastructure necessary for multi-module resolve
This commit is contained in:
@@ -7,6 +7,7 @@ plugins {
|
||||
jvmTarget = "1.6"
|
||||
|
||||
dependencies {
|
||||
compile(project(":compiler:frontend.common"))
|
||||
compile(project(":compiler:frontend.java"))
|
||||
compile(project(":compiler:fir:resolve"))
|
||||
|
||||
|
||||
@@ -6,21 +6,59 @@
|
||||
package org.jetbrains.kotlin.fir.java
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.search.GlobalSearchScope
|
||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||
import org.jetbrains.kotlin.fir.FirModuleBasedSession
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.impl.FirCompositeSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.impl.FirDependenciesSymbolProviderImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.impl.FirLibrarySymbolProviderImpl
|
||||
import org.jetbrains.kotlin.fir.service
|
||||
|
||||
class FirJavaModuleBasedSession(moduleInfo: ModuleInfo, project: Project) : FirModuleBasedSession(moduleInfo) {
|
||||
class FirJavaModuleBasedSession(
|
||||
moduleInfo: ModuleInfo,
|
||||
override val sessionProvider: FirProjectSessionProvider,
|
||||
scope: GlobalSearchScope
|
||||
) : FirModuleBasedSession(moduleInfo) {
|
||||
init {
|
||||
sessionProvider.sessionCache[moduleInfo] = this
|
||||
registerComponent(
|
||||
FirSymbolProvider::class,
|
||||
FirCompositeSymbolProvider(
|
||||
listOf(service<FirProvider>(), JavaSymbolProvider(project), FirLibrarySymbolProviderImpl(this))
|
||||
listOf(
|
||||
service<FirProvider>(),
|
||||
JavaSymbolProvider(sessionProvider.project, scope),
|
||||
FirDependenciesSymbolProviderImpl(this)
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
class FirLibrarySession(
|
||||
moduleInfo: ModuleInfo,
|
||||
override val sessionProvider: FirProjectSessionProvider,
|
||||
scope: GlobalSearchScope
|
||||
) : FirSessionBase() {
|
||||
init {
|
||||
sessionProvider.sessionCache[moduleInfo] = this
|
||||
registerComponent(
|
||||
FirSymbolProvider::class,
|
||||
FirCompositeSymbolProvider(
|
||||
listOf(
|
||||
FirLibrarySymbolProviderImpl(this),
|
||||
JavaSymbolProvider(sessionProvider.project, scope),
|
||||
FirDependenciesSymbolProviderImpl(this)
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
class FirProjectSessionProvider(val project: Project) : FirSessionProvider {
|
||||
override fun getSession(moduleInfo: ModuleInfo): FirSession? {
|
||||
return sessionCache[moduleInfo]
|
||||
}
|
||||
|
||||
val sessionCache = mutableMapOf<ModuleInfo, FirSession>()
|
||||
}
|
||||
@@ -8,38 +8,22 @@ package org.jetbrains.kotlin.fir.java
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.search.GlobalSearchScope
|
||||
import org.jetbrains.kotlin.fir.java.symbols.JavaClassSymbol
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||
import org.jetbrains.kotlin.load.java.JavaClassFinder
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade
|
||||
|
||||
class JavaSymbolProvider(val project: Project) : FirSymbolProvider {
|
||||
|
||||
override val doesLookupInFir: Boolean
|
||||
get() = false
|
||||
|
||||
// TODO: Concrete scope here
|
||||
private val allScope = GlobalSearchScope.allScope(project)
|
||||
|
||||
private val classCache = mutableMapOf<ClassId, ConeSymbol?>()
|
||||
private val packageCache = mutableMapOf<FqName, FqName?>()
|
||||
|
||||
private inline fun <K, V : Any?> MutableMap<K, V>.lookupCacheOrCalculate(key: K, l: (K) -> V): V? {
|
||||
return if (key in this.keys) {
|
||||
this[key]
|
||||
} else {
|
||||
val calculated = l(key)
|
||||
this[key] = calculated
|
||||
calculated
|
||||
}
|
||||
}
|
||||
class JavaSymbolProvider(
|
||||
val project: Project,
|
||||
private val searchScope: GlobalSearchScope
|
||||
) : AbstractFirSymbolProvider() {
|
||||
|
||||
override fun getSymbolByFqName(classId: ClassId): ConeSymbol? {
|
||||
return classCache.lookupCacheOrCalculate(classId) {
|
||||
val facade = KotlinJavaPsiFacade.getInstance(project)
|
||||
val foundClass = facade.findClass(JavaClassFinder.Request(classId), allScope)
|
||||
val foundClass = facade.findClass(JavaClassFinder.Request(classId), searchScope)
|
||||
foundClass?.let { javaClass -> JavaClassSymbol(javaClass) }
|
||||
}
|
||||
}
|
||||
@@ -47,7 +31,7 @@ class JavaSymbolProvider(val project: Project) : FirSymbolProvider {
|
||||
override fun getPackage(fqName: FqName): FqName? {
|
||||
return packageCache.lookupCacheOrCalculate(fqName) {
|
||||
val facade = KotlinJavaPsiFacade.getInstance(project)
|
||||
val javaPackage = facade.findPackage(fqName.asString(), allScope) ?: return@lookupCacheOrCalculate null
|
||||
val javaPackage = facade.findPackage(fqName.asString(), searchScope) ?: return@lookupCacheOrCalculate null
|
||||
FqName(javaPackage.qualifiedName)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user