IR: use IrFactory in fir2ir

This commit is contained in:
Alexander Udalov
2020-07-13 18:47:10 +02:00
parent 9356f87f28
commit 8c41ba8ee4
8 changed files with 49 additions and 82 deletions
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.descriptors.WrappedReceiverParameterDescriptor
import org.jetbrains.kotlin.ir.expressions.IrConst
@@ -42,7 +41,6 @@ import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrClassPublicSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
import org.jetbrains.kotlin.ir.types.*
@@ -461,7 +459,7 @@ internal fun IrDeclarationParent.declareThisReceiverParameter(
return symbolTable.declareValueParameter(
startOffset, endOffset, thisOrigin, receiverDescriptor, thisType
) { symbol ->
IrValueParameterImpl(
symbolTable.irFactory.createValueParameter(
startOffset, endOffset, thisOrigin, symbol,
Name.special("<this>"), -1, thisType,
varargElementType = null, isCrossinline = false, isNoinline = false
@@ -22,10 +22,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrEnumEntryImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrTypeAliasImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrTypeParameterImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedEnumEntryDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedTypeAliasDescriptor
@@ -195,7 +191,7 @@ class Fir2IrClassifierStorage(
preCacheTypeParameters(typeAlias)
return typeAlias.convertWithOffsets { startOffset, endOffset ->
declareIrTypeAlias(signature) { symbol ->
val irTypeAlias = IrTypeAliasImpl(
val irTypeAlias = irFactory.createTypeAlias(
startOffset, endOffset, symbol,
typeAlias.name, typeAlias.visibility,
typeAlias.expandedTypeRef.toIrType(),
@@ -235,7 +231,7 @@ class Fir2IrClassifierStorage(
val signature = if (regularClass.isLocal) null else signatureComposer.composeSignature(regularClass)
val irClass = regularClass.convertWithOffsets { startOffset, endOffset ->
declareIrClass(signature) { symbol ->
IrClassImpl(
irFactory.createClass(
startOffset,
endOffset,
origin,
@@ -278,7 +274,7 @@ class Fir2IrClassifierStorage(
val signature = null
val result = anonymousObject.convertWithOffsets { startOffset, endOffset ->
declareIrClass(signature) { symbol ->
IrClassImpl(
irFactory.createClass(
startOffset, endOffset, origin, symbol, name,
// NB: for unknown reason, IR uses 'CLASS' kind for simple anonymous objects
anonymousObject.classKind.takeIf { it == ClassKind.ENUM_ENTRY } ?: ClassKind.CLASS,
@@ -312,7 +308,7 @@ class Fir2IrClassifierStorage(
val irTypeParameter = with(typeParameter) {
convertWithOffsets { startOffset, endOffset ->
symbolTable.declareGlobalTypeParameter(startOffset, endOffset, origin, descriptor) { symbol ->
IrTypeParameterImpl(
irFactory.createTypeParameter(
startOffset, endOffset, origin, symbol,
name, if (index < 0) 0 else index,
isReified,
@@ -393,7 +389,7 @@ class Fir2IrClassifierStorage(
return enumEntry.convertWithOffsets { startOffset, endOffset ->
val signature = signatureComposer.composeSignature(enumEntry)
val result = declareIrEnumEntry(signature) { symbol ->
IrEnumEntryImpl(
irFactory.createEnumEntry(
startOffset, endOffset, origin, symbol, enumEntry.name
).apply {
declarationStorage.enterScope(this)
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.generators.CallAndReferenceGenerator
import org.jetbrains.kotlin.fir.backend.generators.FakeOverrideGenerator
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.util.SymbolTable
@@ -17,10 +18,11 @@ interface Fir2IrComponents {
val scopeSession: ScopeSession
val symbolTable: SymbolTable
val irBuiltIns: IrBuiltIns
val irFactory: IrFactory
val classifierStorage: Fir2IrClassifierStorage
val declarationStorage: Fir2IrDeclarationStorage
val typeConverter: Fir2IrTypeConverter
val signatureComposer: Fir2IrSignatureComposer
val callGenerator: CallAndReferenceGenerator
val fakeOverrideGenerator: FakeOverrideGenerator
}
}
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.backend.generators.FakeOverrideGenerator
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.signaturer.FirBasedSignatureComposer
import org.jetbrains.kotlin.fir.signaturer.FirMangler
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.util.SymbolTable
@@ -19,6 +20,7 @@ class Fir2IrComponentsStorage(
override val scopeSession: ScopeSession,
override val symbolTable: SymbolTable,
override val irBuiltIns: IrBuiltIns,
override val irFactory: IrFactory,
mangler: FirMangler
) : Fir2IrComponents {
override lateinit var classifierStorage: Fir2IrClassifierStorage
@@ -28,4 +30,4 @@ class Fir2IrComponentsStorage(
override lateinit var fakeOverrideGenerator: FakeOverrideGenerator
override val signatureComposer = FirBasedSignatureComposer(mangler)
}
}
@@ -218,7 +218,7 @@ class Fir2IrConverter(
val builtIns = IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, symbolTable)
FirBuiltinSymbols(builtIns, moduleDescriptor.builtIns, symbolTable)
val sourceManager = PsiSourceManager()
val components = Fir2IrComponentsStorage(session, scopeSession, symbolTable, builtIns, mangler)
val components = Fir2IrComponentsStorage(session, scopeSession, symbolTable, builtIns, irFactory, mangler)
val conversionScope = Fir2IrConversionScope()
val classifierStorage = Fir2IrClassifierStorage(components)
val declarationStorage = Fir2IrDeclarationStorage(components, moduleDescriptor)
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.builtins.KotlinBuiltIns.*
import org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAMES
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.fir.FirAnnotationContainer
@@ -26,20 +26,28 @@ import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyConstructor
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyProperty
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazySimpleFunction
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.isKFunctionInvoke
import org.jetbrains.kotlin.fir.symbols.Fir2IrConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.Fir2IrPropertySymbol
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.*
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
import org.jetbrains.kotlin.ir.descriptors.*
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrSyntheticBodyKind
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.types.IrErrorType
import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
@@ -238,7 +246,7 @@ class Fir2IrDeclarationStorage(
symbolTable.declareValueParameter(
startOffset, endOffset, origin, descriptor, type
) { symbol ->
IrValueParameterImpl(
irFactory.createValueParameter(
startOffset, endOffset, IrDeclarationOrigin.DEFINED, symbol,
Name.special("<set-?>"), 0, type,
varargElementType = null,
@@ -388,7 +396,7 @@ class Fir2IrDeclarationStorage(
val signature = if (isLocal) null else signatureComposer.composeSignature(function)
val created = function.convertWithOffsets { startOffset, endOffset ->
val result = declareIrSimpleFunction(signature, simpleFunction?.containerSource) { symbol ->
IrFunctionImpl(
irFactory.createFunction(
startOffset, endOffset, updatedOrigin, symbol,
name, visibility,
simpleFunction?.modality ?: Modality.FINAL,
@@ -464,7 +472,7 @@ class Fir2IrDeclarationStorage(
val signature = if (isLocal) null else signatureComposer.composeSignature(constructor)
val created = constructor.convertWithOffsets { startOffset, endOffset ->
declareIrConstructor(signature) { symbol ->
IrConstructorImpl(
irFactory.createConstructor(
startOffset, endOffset, origin, symbol,
Name.special("<init>"), constructor.visibility,
constructor.returnTypeRef.toIrType(),
@@ -517,7 +525,7 @@ class Fir2IrDeclarationStorage(
isGetter = !isSetter
) { symbol ->
val accessorReturnType = if (isSetter) irBuiltIns.unitType else propertyType
IrFunctionImpl(
irFactory.createFunction(
startOffset, endOffset, origin, symbol,
Name.special("<$prefix-${correspondingProperty.name}>"),
propertyAccessor?.visibility ?: correspondingProperty.visibility,
@@ -577,7 +585,7 @@ class Fir2IrDeclarationStorage(
return symbolTable.declareField(
startOffset, endOffset, origin, descriptor, inferredType
) { symbol ->
IrFieldImpl(
irFactory.createField(
startOffset, endOffset, origin, symbol,
name, inferredType,
visibility, isFinal = isFinal,
@@ -627,7 +635,7 @@ class Fir2IrDeclarationStorage(
val signature = if (isLocal) null else signatureComposer.composeSignature(property)
return property.convertWithOffsets { startOffset, endOffset ->
val result = declareIrProperty(signature, property.containerSource) { symbol ->
IrPropertyImpl(
irFactory.createProperty(
startOffset, endOffset, origin, symbol,
property.name, property.visibility, property.modality!!,
isVar = property.isVar,
@@ -746,7 +754,7 @@ class Fir2IrDeclarationStorage(
startOffset, endOffset,
origin, descriptor, type
) { symbol ->
IrFieldImpl(
irFactory.createField(
startOffset, endOffset, origin, symbol,
field.name, type, field.visibility,
isFinal = field.modality == Modality.FINAL,
@@ -774,7 +782,7 @@ class Fir2IrDeclarationStorage(
symbolTable.declareValueParameter(
startOffset, endOffset, origin, descriptor, type
) { symbol ->
IrValueParameterImpl(
irFactory.createValueParameter(
startOffset, endOffset, origin, symbol,
valueParameter.name, index, type,
if (!valueParameter.isVararg) null
@@ -6,15 +6,9 @@
package org.jetbrains.kotlin.fir.backend.generators
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.FirMetadataSource
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
@@ -25,20 +19,16 @@ import org.jetbrains.kotlin.fir.types.impl.FirImplicitBooleanTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitIntTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitNullableAnyTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitStringTypeRef
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.IrGeneratorContextBase
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.DataClassMembersGenerator
import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
@@ -245,23 +235,10 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
}
val signature = if (classId.isLocal) null else components.signatureComposer.composeSignature(firFunction)
return components.declarationStorage.declareIrSimpleFunction(signature, null) { symbol ->
IrFunctionImpl(
UNDEFINED_OFFSET,
UNDEFINED_OFFSET,
origin,
symbol,
name,
Visibilities.PUBLIC,
Modality.OPEN,
returnType,
isInline = false,
isExternal = false,
isTailrec = false,
isSuspend = false,
isExpect = false,
isFakeOverride = false,
isOperator = false,
isInfix = false
components.irFactory.createFunction(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, symbol, name, Visibilities.PUBLIC, Modality.OPEN, returnType,
isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isExpect = false,
isFakeOverride = false, isOperator = false, isInfix = false,
).apply {
if (otherParameterNeeded) {
val irValueParameter = createSyntheticIrParameter(
@@ -288,23 +265,11 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
private fun createSyntheticIrParameter(irFunction: IrFunction, name: Name, type: IrType, index: Int = 0): IrValueParameter {
val descriptor = WrappedValueParameterDescriptor()
return components.symbolTable.declareValueParameter(
UNDEFINED_OFFSET,
UNDEFINED_OFFSET,
origin,
descriptor,
type
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor, type
) { symbol ->
IrValueParameterImpl(
UNDEFINED_OFFSET,
UNDEFINED_OFFSET,
origin,
symbol,
name,
index,
type,
null,
isCrossinline = false,
isNoinline = false
components.irFactory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, symbol, name, index, type, null,
isCrossinline = false, isNoinline = false
)
}.apply {
parent = irFunction
@@ -337,4 +302,4 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
fun getComponentIndex(irFunction: IrFunction): Int? =
irFunction.name.identifier.substring("component".length).toIntOrNull()
}
}
}
@@ -23,10 +23,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrPropertyImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrTypeParameterImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedTypeParameterDescriptor
@@ -115,7 +111,7 @@ internal class DelegatedMemberGenerator(
} == true
lateinit var irTypeSubstitutor: IrTypeSubstitutor
val delegateFunction = symbolTable.declareSimpleFunction(descriptor) { symbol ->
IrFunctionImpl(
irFactory.createFunction(
startOffset,
endOffset,
origin,
@@ -146,7 +142,7 @@ internal class DelegatedMemberGenerator(
typeParameters += symbolTable.declareScopedTypeParameter(
startOffset, endOffset, origin, parameterDescriptor
) { symbol ->
IrTypeParameterImpl(
irFactory.createTypeParameter(
startOffset,
endOffset,
origin,
@@ -176,7 +172,7 @@ internal class DelegatedMemberGenerator(
valueParameters += symbolTable.declareValueParameter(
startOffset, endOffset, origin, parameterDescriptor, substedType
) { symbol ->
IrValueParameterImpl(
irFactory.createValueParameter(
startOffset, endOffset, origin, symbol,
valueParameter.name, valueParameter.index, substedType,
null, valueParameter.isCrossinline, valueParameter.isNoinline
@@ -282,7 +278,7 @@ internal class DelegatedMemberGenerator(
startOffset, endOffset,
IrDeclarationOrigin.DELEGATED_MEMBER, descriptor, superProperty.isDelegated
) { symbol ->
IrPropertyImpl(
irFactory.createProperty(
startOffset, endOffset, IrDeclarationOrigin.DELEGATED_MEMBER, symbol,
superProperty.name, superProperty.visibility,
modality,