IR: add IrFactory to IrDeclaration, use in deep copy

This commit is contained in:
Alexander Udalov
2020-07-14 13:48:16 +02:00
parent 305288aa82
commit f359f36ed9
10 changed files with 37 additions and 20 deletions
@@ -25,6 +25,9 @@ abstract class AbstractFir2IrLazyDeclaration<F : FirMemberDeclaration, D : IrSym
val fir: F, val fir: F,
open val symbol: Fir2IrBindableSymbol<*, D> open val symbol: Fir2IrBindableSymbol<*, D>
) : IrElementBase(startOffset, endOffset), IrDeclaration, IrDeclarationParent, Fir2IrComponents by components { ) : IrElementBase(startOffset, endOffset), IrDeclaration, IrDeclarationParent, Fir2IrComponents by components {
override val factory: IrFactory
get() = components.irFactory
internal fun prepareTypeParameters() { internal fun prepareTypeParameters() {
typeParameters = fir.typeParameters.mapIndexedNotNull { index, typeParameter -> typeParameters = fir.typeParameters.mapIndexedNotNull { index, typeParameter ->
if (typeParameter !is FirTypeParameter) return@mapIndexedNotNull null if (typeParameter !is FirTypeParameter) return@mapIndexedNotNull null
@@ -42,6 +42,8 @@ interface IrDeclaration : IrStatement, IrMutableAnnotationContainer {
var parent: IrDeclarationParent var parent: IrDeclarationParent
val factory: IrFactory
override fun <D> transform(transformer: IrElementTransformer<D>, data: D): IrStatement = override fun <D> transform(transformer: IrElementTransformer<D>, data: D): IrStatement =
accept(transformer, data) as IrStatement accept(transformer, data) as IrStatement
} }
@@ -32,6 +32,9 @@ abstract class IrDeclarationBase<T : DeclarationCarrier>(
IrDeclaration, IrDeclaration,
DeclarationCarrier { DeclarationCarrier {
override val factory: IrFactory
get() = IrFactoryImpl
override var parentField: IrDeclarationParent? = null override var parentField: IrDeclarationParent? = null
// TODO reduce boilerplate // TODO reduce boilerplate
@@ -46,6 +46,9 @@ class IrScriptImpl(
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
override val descriptor: ScriptDescriptor = symbol.descriptor override val descriptor: ScriptDescriptor = symbol.descriptor
override val factory: IrFactory
get() = error("Create IrScriptImpl directly")
init { init {
symbol.bind(this) symbol.bind(this)
} }
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
@@ -60,6 +61,9 @@ class IrVariableImpl(
override var initializer: IrExpression? = null override var initializer: IrExpression? = null
override val factory: IrFactory
get() = error("Create IrVariableImpl directly")
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitVariable(this, data) visitor.visitVariable(this, data)
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.ir.IrElementBase
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
@@ -26,11 +25,13 @@ abstract class IrLazyDeclarationBase(
private val stubGenerator: DeclarationStubGenerator, private val stubGenerator: DeclarationStubGenerator,
protected val typeTranslator: TypeTranslator protected val typeTranslator: TypeTranslator
) : IrElementBase(startOffset, endOffset), IrDeclaration { ) : IrElementBase(startOffset, endOffset), IrDeclaration {
override val factory: IrFactory
get() = stubGenerator.symbolTable.irFactory
protected fun KotlinType.toIrType() = typeTranslator.translateType(this) protected fun KotlinType.toIrType() = typeTranslator.translateType(this)
protected fun ReceiverParameterDescriptor.generateReceiverParameterStub(): IrValueParameter = protected fun ReceiverParameterDescriptor.generateReceiverParameterStub(): IrValueParameter =
IrValueParameterImpl( factory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, IrValueParameterSymbolImpl(this), UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, IrValueParameterSymbolImpl(this),
name, -1, type.toIrType(), null, isCrossinline = false, isNoinline = false name, -1, type.toIrType(), null, isCrossinline = false, isNoinline = false
) )
@@ -125,7 +125,7 @@ open class DeepCopyIrTreeWithSymbols(
} }
override fun visitClass(declaration: IrClass): IrClass = override fun visitClass(declaration: IrClass): IrClass =
IrClassImpl( declaration.factory.createClass(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredClass(declaration.symbol), symbolRemapper.getDeclaredClass(declaration.symbol),
@@ -151,7 +151,7 @@ open class DeepCopyIrTreeWithSymbols(
}.copyAttributes(declaration) }.copyAttributes(declaration)
override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction = override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction =
IrFunctionImpl( declaration.factory.createFunction(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredFunction(declaration.symbol), symbolRemapper.getDeclaredFunction(declaration.symbol),
@@ -176,7 +176,7 @@ open class DeepCopyIrTreeWithSymbols(
} }
override fun visitConstructor(declaration: IrConstructor): IrConstructor = override fun visitConstructor(declaration: IrConstructor): IrConstructor =
IrConstructorImpl( declaration.factory.createConstructor(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredConstructor(declaration.symbol), symbolRemapper.getDeclaredConstructor(declaration.symbol),
@@ -209,7 +209,7 @@ open class DeepCopyIrTreeWithSymbols(
} }
override fun visitProperty(declaration: IrProperty): IrProperty = override fun visitProperty(declaration: IrProperty): IrProperty =
IrPropertyImpl( declaration.factory.createProperty(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredProperty(declaration.symbol), symbolRemapper.getDeclaredProperty(declaration.symbol),
@@ -236,7 +236,7 @@ open class DeepCopyIrTreeWithSymbols(
} }
override fun visitField(declaration: IrField): IrField = override fun visitField(declaration: IrField): IrField =
IrFieldImpl( declaration.factory.createField(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredField(declaration.symbol), symbolRemapper.getDeclaredField(declaration.symbol),
@@ -252,7 +252,7 @@ open class DeepCopyIrTreeWithSymbols(
} }
override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty): IrLocalDelegatedProperty = override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty): IrLocalDelegatedProperty =
IrLocalDelegatedPropertyImpl( declaration.factory.createLocalDelegatedProperty(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredLocalDelegatedProperty(declaration.symbol), symbolRemapper.getDeclaredLocalDelegatedProperty(declaration.symbol),
@@ -267,7 +267,7 @@ open class DeepCopyIrTreeWithSymbols(
} }
override fun visitEnumEntry(declaration: IrEnumEntry): IrEnumEntry = override fun visitEnumEntry(declaration: IrEnumEntry): IrEnumEntry =
IrEnumEntryImpl( declaration.factory.createEnumEntry(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredEnumEntry(declaration.symbol), symbolRemapper.getDeclaredEnumEntry(declaration.symbol),
@@ -279,7 +279,7 @@ open class DeepCopyIrTreeWithSymbols(
} }
override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer): IrAnonymousInitializer = override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer): IrAnonymousInitializer =
IrAnonymousInitializerImpl( declaration.factory.createAnonymousInitializer(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
IrAnonymousInitializerSymbolImpl(declaration.descriptor) IrAnonymousInitializerSymbolImpl(declaration.descriptor)
@@ -309,7 +309,7 @@ open class DeepCopyIrTreeWithSymbols(
} }
private fun copyTypeParameter(declaration: IrTypeParameter): IrTypeParameter = private fun copyTypeParameter(declaration: IrTypeParameter): IrTypeParameter =
IrTypeParameterImpl( declaration.factory.createTypeParameter(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredTypeParameter(declaration.symbol), symbolRemapper.getDeclaredTypeParameter(declaration.symbol),
@@ -336,7 +336,7 @@ open class DeepCopyIrTreeWithSymbols(
} }
override fun visitValueParameter(declaration: IrValueParameter): IrValueParameter = override fun visitValueParameter(declaration: IrValueParameter): IrValueParameter =
IrValueParameterImpl( declaration.factory.createValueParameter(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredValueParameter(declaration.symbol), symbolRemapper.getDeclaredValueParameter(declaration.symbol),
@@ -352,7 +352,7 @@ open class DeepCopyIrTreeWithSymbols(
} }
override fun visitTypeAlias(declaration: IrTypeAlias): IrTypeAlias = override fun visitTypeAlias(declaration: IrTypeAlias): IrTypeAlias =
IrTypeAliasImpl( declaration.factory.createTypeAlias(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
symbolRemapper.getDeclaredTypeAlias(declaration.symbol), symbolRemapper.getDeclaredTypeAlias(declaration.symbol),
symbolRenamer.getTypeAliasName(declaration.symbol), symbolRenamer.getTypeAliasName(declaration.symbol),
@@ -768,7 +768,7 @@ open class DeepCopyIrTreeWithSymbols(
).copyAttributes(expression) ).copyAttributes(expression)
override fun visitErrorDeclaration(declaration: IrErrorDeclaration): IrErrorDeclaration = override fun visitErrorDeclaration(declaration: IrErrorDeclaration): IrErrorDeclaration =
IrErrorDeclarationImpl(declaration.startOffset, declaration.endOffset, declaration.descriptor) declaration.factory.createErrorDeclaration(declaration.startOffset, declaration.endOffset, declaration.descriptor)
override fun visitErrorExpression(expression: IrErrorExpression): IrErrorExpression = override fun visitErrorExpression(expression: IrErrorExpression): IrErrorExpression =
IrErrorExpressionImpl( IrErrorExpressionImpl(
@@ -1,11 +1,14 @@
/*
* 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.backend.common.overrides package org.jetbrains.kotlin.backend.common.overrides
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.impl.IrFakeOverrideFunctionImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFakeOverridePropertyImpl
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
class FakeOverrideCopier( class FakeOverrideCopier(
@@ -47,7 +50,7 @@ class FakeOverrideCopier(
} }
override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction = override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction =
IrFakeOverrideFunctionImpl( declaration.factory.createFakeOverrideFunction(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
IrDeclarationOrigin.FAKE_OVERRIDE, IrDeclarationOrigin.FAKE_OVERRIDE,
symbolRenamer.getFunctionName(declaration.symbol), symbolRenamer.getFunctionName(declaration.symbol),
@@ -67,7 +70,7 @@ class FakeOverrideCopier(
override fun visitProperty(declaration: IrProperty): IrProperty = override fun visitProperty(declaration: IrProperty): IrProperty =
IrFakeOverridePropertyImpl( declaration.factory.createFakeOverrideProperty(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
IrDeclarationOrigin.FAKE_OVERRIDE, IrDeclarationOrigin.FAKE_OVERRIDE,
declaration.name, declaration.name,
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.backend.common.overrides
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFakeOverridePropertyImpl
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFakeOverridePropertyImpl
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol