Use FirModuleBasedSession with module info, use platform default imports

In this commit, FIR sessions made bound to a particular module
This commit is contained in:
Mikhail Glukhikh
2018-04-05 17:44:46 +03:00
parent 9ca07bc706
commit bc82f2f940
8 changed files with 85 additions and 42 deletions
@@ -0,0 +1,26 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.fir.java
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.FirModuleBasedSession
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.FirLibrarySymbolProviderImpl
import org.jetbrains.kotlin.fir.service
class FirJavaModuleBasedSession(moduleInfo: ModuleInfo, project: Project) : FirModuleBasedSession(moduleInfo) {
init {
registerComponent(
FirSymbolProvider::class,
FirCompositeSymbolProvider(
listOf(service<FirProvider>(), JavaSymbolProvider(project), FirLibrarySymbolProviderImpl(this))
)
)
}
}
@@ -0,0 +1,22 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.fir
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.FirTypeResolver
import org.jetbrains.kotlin.fir.resolve.impl.*
abstract class FirModuleBasedSession(override val moduleInfo: ModuleInfo) : FirSessionBase() {
init {
val firProvider = FirProviderImpl(this)
registerComponent(FirProvider::class, firProvider)
registerComponent(FirQualifierResolver::class, FirQualifierResolverImpl(this))
registerComponent(FirTypeResolver::class, FirTypeResolverImpl())
}
}
@@ -5,30 +5,19 @@
package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.impl.FirImportImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedPackageStarImport
import org.jetbrains.kotlin.name.FqName
class FirDefaultStarImportingScope(session: FirSession, lookupInFir: Boolean = false) :
FirAbstractStarImportingScope(session, lookupInFir) {
// TODO: move relevant code in TargetPlatform from compiler:frontend and use here
override val starImports = listOf(
"kotlin",
"kotlin.annotation",
"kotlin.collections",
"kotlin.ranges",
"kotlin.sequences",
"kotlin.text",
"kotlin.io",
"java.lang",
// We should not (probably) import it for non-JVM projects
"kotlin.jvm"
).map {
val fqName = FqName(it)
// TODO: put languageVersionSettings into FirSession?
override val starImports = session.moduleInfo?.platform?.getDefaultImports(LanguageVersionSettingsImpl.DEFAULT, true)?.map {
FirResolvedPackageStarImport(
FirImportImpl(session, null, fqName, isAllUnder = true, aliasName = null),
fqName
FirImportImpl(session, null, it.fqName, isAllUnder = true, aliasName = null),
it.fqName
)
}
} ?: emptyList()
}
@@ -5,28 +5,10 @@
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.FirTypeResolver
import org.jetbrains.kotlin.fir.resolve.impl.*
import org.jetbrains.kotlin.fir.java.FirJavaModuleBasedSession
import org.jetbrains.kotlin.test.KotlinTestWithEnvironment
abstract class AbstractFirResolveWithSessionTestCase : KotlinTestWithEnvironment() {
open fun createSession(): FirSession {
return object : FirSessionBase() {
init {
val firProvider = FirProviderImpl(this)
registerComponent(FirProvider::class, firProvider)
registerComponent(
FirSymbolProvider::class,
FirCompositeSymbolProvider(listOf(firProvider, JavaSymbolProvider(project), FirLibrarySymbolProviderImpl(this)))
)
registerComponent(FirQualifierResolver::class, FirQualifierResolverImpl(this))
registerComponent(FirTypeResolver::class, FirTypeResolverImpl())
}
}
}
open fun createSession(): FirSession = FirJavaModuleBasedSession(FirTestModuleInfo(), project)
}
+1
View File
@@ -11,6 +11,7 @@ plugins {
jvmTarget = "1.6"
dependencies {
compile(project(":compiler:frontend.common"))
compile(project(":core:descriptors"))
compile(project(":compiler:fir:cones"))
compile(project(":compiler:ir.tree"))
@@ -5,10 +5,11 @@
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.analyzer.ModuleInfo
import kotlin.reflect.KClass
interface FirSession {
val moduleInfo: ModuleInfo?
val components: Map<KClass<*>, Any>
@@ -5,15 +5,18 @@
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.analyzer.ModuleInfo
import kotlin.reflect.KClass
abstract class FirSessionBase : FirSession {
override val components: MutableMap<KClass<*>, Any> = mutableMapOf()
override val moduleInfo: ModuleInfo?
get() = null
protected fun <T : Any> registerComponent(tClass: KClass<T>, t: T) {
assert(tClass !in components) { "Already registered component" }
components[tClass] = t
}
}
override val components: MutableMap<KClass<*>, Any> = mutableMapOf()
}
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.fir
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.TargetPlatform
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
class FirTestModuleInfo(
override val name: Name = Name.identifier("TestModule"),
private val dependencies: List<ModuleInfo> = emptyList(),
override val platform: TargetPlatform = JvmPlatform
) : ModuleInfo {
override fun dependencies(): List<ModuleInfo> = dependencies
}