From d02d423d4529770df45b7634e726e778ccd804d7 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 17 Jun 2020 17:43:27 +0300 Subject: [PATCH] [FIR2IR] Introduce additional built-in symbols prepared in advance This commit allow to avoid possible conflicts between descriptor-based and signature-based symbols, because BE sometimes (e.g. in DeclarationStubGenerator) creates descriptor-based symbol without checking signature-based --- .../kotlin/fir/backend/Fir2IrConverter.kt | 4 +-- .../kotlin/fir/symbols/FirBuiltinSymbols.kt | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/symbols/FirBuiltinSymbols.kt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index fa207234e14..d29c47e1145 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.backend -import org.jetbrains.kotlin.backend.common.ir.BuiltinSymbolsBase import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.backend.generators.AnnotationGenerator @@ -16,6 +15,7 @@ import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.signaturer.FirMangler +import org.jetbrains.kotlin.fir.symbols.FirBuiltinSymbols import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl @@ -185,7 +185,7 @@ class Fir2IrConverter( constantValueGenerator.typeTranslator = typeTranslator typeTranslator.constantValueGenerator = constantValueGenerator val builtIns = IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, symbolTable) - BuiltinSymbolsBase(builtIns, moduleDescriptor.builtIns, symbolTable) + FirBuiltinSymbols(builtIns, moduleDescriptor.builtIns, symbolTable) val sourceManager = PsiSourceManager() val components = Fir2IrComponentsStorage(session, scopeSession, symbolTable, builtIns, mangler) val conversionScope = Fir2IrConversionScope() diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/symbols/FirBuiltinSymbols.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/symbols/FirBuiltinSymbols.kt new file mode 100644 index 00000000000..2bd9097e4f0 --- /dev/null +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/symbols/FirBuiltinSymbols.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2020 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.fir.symbols + +import org.jetbrains.kotlin.backend.common.ir.BuiltinSymbolsBase +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns +import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable +import org.jetbrains.kotlin.name.Name + +class FirBuiltinSymbols( + irBuiltIns: IrBuiltIns, + builtIns: KotlinBuiltIns, + symbolTable: ReferenceSymbolTable +) : BuiltinSymbolsBase(irBuiltIns, builtIns, symbolTable) { + + init { + val builtInsPackage = builtInsPackage("kotlin") + // Comparable is a base interface for many pre-generated built-in classes, + // like String, so it's easier if it's generated together with them + // Otherwise we have problems like "IrLazyClass inherits Fir2IrLazyClass", + // which does not work properly yet + for (name in listOf("Comparable")) { + (builtInsPackage.getContributedClassifier( + Name.identifier(name), + NoLookupLocation.FROM_BACKEND + ) as? ClassDescriptor)?.let { symbolTable.referenceClass(it) } + } + } +} \ No newline at end of file