[Psi2Ir] Isolate type translator in file scope

Create TypeTranslator per file to avoid reusing it between files
This commit is contained in:
Roman Artemev
2021-06-03 12:32:19 +03:00
committed by TeamCityServer
parent ae3a2d4e71
commit 7ef63fbb45
5 changed files with 56 additions and 30 deletions
@@ -63,7 +63,6 @@ class Psi2IrTranslator(
symbolTable,
extensions,
typeTranslator,
typeTranslator.constantValueGenerator,
IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, symbolTable),
)
}
@@ -14,25 +14,47 @@ import org.jetbrains.kotlin.descriptors.NotFoundClasses
import org.jetbrains.kotlin.ir.builders.IrGeneratorContext
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.expressions.IrDeclarationReference
import org.jetbrains.kotlin.ir.util.ConstantValueGenerator
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.TypeTranslator
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.storage.LockBasedStorageManager
class GeneratorContext(
class GeneratorContext private constructor(
val configuration: Psi2IrConfiguration,
val moduleDescriptor: ModuleDescriptor,
val bindingContext: BindingContext,
val languageVersionSettings: LanguageVersionSettings,
val symbolTable: SymbolTable,
val extensions: GeneratorExtensions,
val typeTranslator: TypeTranslatorImpl,
val constantValueGenerator: ConstantValueGenerator,
override val irBuiltIns: IrBuiltIns
val typeTranslator: TypeTranslator,
override val irBuiltIns: IrBuiltIns,
internal val callToSubstitutedDescriptorMap: MutableMap<IrDeclarationReference, CallableDescriptor>
) : IrGeneratorContext {
internal val callToSubstitutedDescriptorMap = mutableMapOf<IrDeclarationReference, CallableDescriptor>()
constructor(
configuration: Psi2IrConfiguration,
moduleDescriptor: ModuleDescriptor,
bindingContext: BindingContext,
languageVersionSettings: LanguageVersionSettings,
symbolTable: SymbolTable,
extensions: GeneratorExtensions,
typeTranslator: TypeTranslator,
irBuiltIns: IrBuiltIns,
) : this(
configuration,
moduleDescriptor,
bindingContext,
languageVersionSettings,
symbolTable,
extensions,
typeTranslator,
irBuiltIns,
mutableMapOf()
)
val constantValueGenerator = typeTranslator.constantValueGenerator
fun IrDeclarationReference.commitSubstituted(descriptor: CallableDescriptor) {
callToSubstitutedDescriptorMap[this] = descriptor
@@ -42,4 +64,19 @@ class GeneratorContext(
val reflectionTypes = ReflectionTypes(moduleDescriptor, NotFoundClasses(LockBasedStorageManager.NO_LOCKS, moduleDescriptor))
val samTypeApproximator = SamTypeApproximator(moduleDescriptor.builtIns, languageVersionSettings)
fun createFileScopeContext(ktFile: KtFile): GeneratorContext {
return GeneratorContext(
configuration,
moduleDescriptor,
bindingContext,
languageVersionSettings,
symbolTable,
extensions,
TypeTranslatorImpl(symbolTable, languageVersionSettings, moduleDescriptor, extensions = extensions, ktFile = ktFile),
irBuiltIns,
callToSubstitutedDescriptorMap
)
}
}
@@ -38,15 +38,13 @@ class ModuleGenerator(
override val context: GeneratorContext,
private val expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>? = null
) : Generator {
private val constantValueGenerator = context.constantValueGenerator
fun generateModuleFragment(ktFiles: Collection<KtFile>): IrModuleFragment =
IrModuleFragmentImpl(context.moduleDescriptor, context.irBuiltIns).also { irModule ->
val irDeclarationGenerator = DeclarationGenerator(context)
ktFiles.toSet().mapTo(irModule.files) { ktFile ->
context.typeTranslator.inFile(ktFile) {
generateSingleFile(irDeclarationGenerator, ktFile, irModule)
}
val fileContext = context.createFileScopeContext(ktFile)
val irDeclarationGenerator = DeclarationGenerator(fileContext)
generateSingleFile(irDeclarationGenerator, ktFile, irModule)
}
}
@@ -57,6 +55,7 @@ class ModuleGenerator(
private fun generateSingleFile(irDeclarationGenerator: DeclarationGenerator, ktFile: KtFile, module: IrModuleFragment): IrFileImpl {
val irFile = createEmptyIrFile(ktFile, module)
val constantValueGenerator = irDeclarationGenerator.context.constantValueGenerator
for (ktAnnotationEntry in ktFile.annotationEntries) {
val annotationDescriptor = getOrFail(BindingContext.ANNOTATION, ktAnnotationEntry)
constantValueGenerator.generateAnnotationConstructorCall(annotationDescriptor)?.let {
@@ -14,16 +14,16 @@ import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.source.getPsi
import org.jetbrains.kotlin.types.*
class TypeTranslatorImpl(
open class TypeTranslatorImpl(
symbolTable: ReferenceSymbolTable,
languageVersionSettings: LanguageVersionSettings,
moduleDescriptor: ModuleDescriptor,
typeParametersResolverBuilder: () -> TypeParametersResolver = { ScopedTypeParametersResolver() },
enterTableScope: Boolean = false,
extensions: StubGeneratorExtensions = StubGeneratorExtensions.EMPTY,
private val ktFile: KtFile? = null
) : TypeTranslator(symbolTable, languageVersionSettings, typeParametersResolverBuilder, enterTableScope, extensions) {
override val constantValueGenerator: ConstantValueGenerator =
ConstantValueGeneratorImpl(moduleDescriptor, symbolTable, this)
override val constantValueGenerator: ConstantValueGenerator = ConstantValueGeneratorImpl(moduleDescriptor, symbolTable, this)
private val typeApproximatorForNI = TypeApproximator(moduleDescriptor.builtIns, languageVersionSettings)
@@ -48,17 +48,6 @@ class TypeTranslatorImpl(
val psiFile = typeAliasDescriptor.source.getPsi()?.containingFile ?: return false
return psiFile == currentFile
}
private var currentFile: KtFile? = null
fun <R> inFile(ktFile: KtFile?, block: () -> R): R {
try {
currentFile = ktFile
return block()
} finally {
currentFile = null
}
return psiFile == ktFile
}
}