[FIR] Use ScopeSession from resolve transformer in FIR2IR

This commit is contained in:
Mikhail Glukhikh
2020-04-03 17:16:47 +03:00
parent f775ac8825
commit 5c758af0a6
65 changed files with 1441 additions and 58 deletions
@@ -6,11 +6,13 @@
package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.util.SymbolTable
interface Fir2IrComponents {
val session: FirSession
val scopeSession: ScopeSession
val symbolTable: SymbolTable
val irBuiltIns: IrBuiltIns
val classifierStorage: Fir2IrClassifierStorage
@@ -6,11 +6,13 @@
package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.util.SymbolTable
class Fir2IrComponentsStorage(
override val session: FirSession,
override val scopeSession: ScopeSession,
override val symbolTable: SymbolTable,
override val irBuiltIns: IrBuiltIns
) : Fir2IrComponents {
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl
@@ -156,6 +157,7 @@ class Fir2IrConverter(
companion object {
fun createModuleFragment(
session: FirSession,
scopeSession: ScopeSession,
firFiles: List<FirFile>,
languageVersionSettings: LanguageVersionSettings,
fakeOverrideMode: FakeOverrideMode = FakeOverrideMode.NORMAL,
@@ -169,7 +171,7 @@ class Fir2IrConverter(
typeTranslator.constantValueGenerator = constantValueGenerator
val builtIns = IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, signaturer, symbolTable)
val sourceManager = PsiSourceManager()
val components = Fir2IrComponentsStorage(session, symbolTable, builtIns)
val components = Fir2IrComponentsStorage(session, scopeSession, symbolTable, builtIns)
val declarationStorage = Fir2IrDeclarationStorage(components, moduleDescriptor)
val classifierStorage = Fir2IrClassifierStorage(components)
val typeConverter = Fir2IrTypeConverter(components)
@@ -208,7 +208,7 @@ class Fir2IrDeclarationStorage(
}
}
val allNames = regularClass.collectCallableNamesFromSupertypes(session)
val scope = regularClass.buildUseSiteMemberScope(session, ScopeSession())
val scope = regularClass.buildUseSiteMemberScope(session, scopeSession)
if (scope != null) {
for (name in allNames) {
if (name in processedNames) continue
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.Name
internal class ClassMemberGenerator(
private val components: Fir2IrComponents,
@@ -32,7 +31,9 @@ internal class ClassMemberGenerator(
fakeOverrideMode: FakeOverrideMode
) : Fir2IrComponents by components {
private val fakeOverrideGenerator = FakeOverrideGenerator(session, declarationStorage, conversionScope, fakeOverrideMode)
private val fakeOverrideGenerator = FakeOverrideGenerator(
session, components.scopeSession, declarationStorage, conversionScope, fakeOverrideMode
)
private fun FirTypeRef.toIrType(): IrType = with(typeConverter) { toIrType() }
@@ -53,17 +54,19 @@ internal class ClassMemberGenerator(
convertFunctionContent(irPrimaryConstructor, primaryConstructor)
}
}
val processedCallableNames = mutableListOf<Name>()
klass.declarations.forEach {
if (it !is FirTypeAlias && (it !is FirConstructor || !it.isPrimary)) {
it.accept(visitor, null)
when (it) {
is FirSimpleFunction -> processedCallableNames += it.name
is FirProperty -> processedCallableNames += it.name
}
val processedCallableNames = klass.declarations.mapNotNullTo(mutableListOf()) {
when (it) {
is FirSimpleFunction -> it.name
is FirProperty -> it.name
else -> null
}
}
with(fakeOverrideGenerator) { irClass.addFakeOverrides(klass, processedCallableNames) }
klass.declarations.forEach {
if (it !is FirTypeAlias && (it !is FirConstructor || !it.isPrimary)) {
it.accept(visitor, null)
}
}
annotations = klass.annotations.mapNotNull {
it.accept(visitor, null) as? IrConstructorCall
}
@@ -10,8 +10,8 @@ import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.backend.collectCallableNamesFromSupertypes
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.allowsToHaveFakeOverride
import org.jetbrains.kotlin.fir.declarations.isStatic
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.buildUseSiteMemberScope
import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.name.Name
internal class FakeOverrideGenerator(
private val session: FirSession,
private val scopeSession: ScopeSession,
private val declarationStorage: Fir2IrDeclarationStorage,
private val conversionScope: Fir2IrConversionScope,
private val fakeOverrideMode: FakeOverrideMode
@@ -59,13 +60,16 @@ internal class FakeOverrideGenerator(
fun IrClass.addFakeOverrides(klass: FirClass<*>, processedCallableNames: MutableList<Name>) {
if (fakeOverrideMode == FakeOverrideMode.NONE) return
val superTypesCallableNames = klass.collectCallableNamesFromSupertypes(session)
val useSiteMemberScope = (klass as? FirRegularClass)?.buildUseSiteMemberScope(session, ScopeSession()) ?: return
val useSiteMemberScope = klass.buildUseSiteMemberScope(session, scopeSession) ?: return
for (name in superTypesCallableNames) {
if (name in processedCallableNames) continue
processedCallableNames += name
useSiteMemberScope.processFunctionsByName(name) { functionSymbol ->
if (functionSymbol is FirNamedFunctionSymbol) {
val originalFunction = functionSymbol.fir
if (originalFunction.isStatic && originalFunction.name in Fir2IrDeclarationStorage.ENUM_SYNTHETIC_NAMES) {
return@processFunctionsByName
}
val origin = IrDeclarationOrigin.FAKE_OVERRIDE
if (functionSymbol.isFakeOverride) {
// Substitution case
@@ -83,7 +83,9 @@ abstract class AbstractFir2IrTextTest : AbstractIrTextTestCase() {
val signaturer = IdSignatureDescriptor(JvmManglerDesc())
return Fir2IrConverter.createModuleFragment(
session, firFiles, myEnvironment.configuration.languageVersionSettings, signaturer = signaturer
session, resolveTransformer.scopeSession, firFiles,
myEnvironment.configuration.languageVersionSettings,
signaturer = signaturer
).irModuleFragment
}
}
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
// TODO: rework, see rr/FIR/semoro-dev FirStagesTransformerFactory
class FirTotalResolveTransformer {
private val scopeSession = ScopeSession()
val scopeSession = ScopeSession()
val transformers: List<FirTransformer<Nothing?>> =
FirResolvePhase.values()