From f359f36ed9e99229c5ed17c73fb25b7e72644a44 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 14 Jul 2020 13:48:16 +0200 Subject: [PATCH] IR: add IrFactory to IrDeclaration, use in deep copy --- .../fir/lazy/AbstractFir2IrLazyDeclaration.kt | 3 +++ .../kotlin/ir/declarations/IrDeclaration.kt | 2 ++ .../ir/declarations/impl/IrDeclarationBase.kt | 3 +++ .../ir/declarations/impl/IrScriptImpl.kt | 3 +++ .../ir/declarations/impl/IrVariableImpl.kt | 4 ++++ .../lazy/IrLazyDeclarationBase.kt | 5 ++-- .../ir/util/DeepCopyIrTreeWithSymbols.kt | 24 +++++++++---------- .../common/overrides/FakeOverrideCopier.kt | 11 +++++---- .../backend/common/overrides/FakeOverrides.kt | 1 - .../common/overrides/IrOverridingUtil.kt | 1 - 10 files changed, 37 insertions(+), 20 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt index 51593edf02f..a047b13f5a0 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt @@ -25,6 +25,9 @@ abstract class AbstractFir2IrLazyDeclaration ) : IrElementBase(startOffset, endOffset), IrDeclaration, IrDeclarationParent, Fir2IrComponents by components { + override val factory: IrFactory + get() = components.irFactory + internal fun prepareTypeParameters() { typeParameters = fir.typeParameters.mapIndexedNotNull { index, typeParameter -> if (typeParameter !is FirTypeParameter) return@mapIndexedNotNull null diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt index 9c13df2d4a4..93b656a8d19 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt @@ -42,6 +42,8 @@ interface IrDeclaration : IrStatement, IrMutableAnnotationContainer { var parent: IrDeclarationParent + val factory: IrFactory + override fun transform(transformer: IrElementTransformer, data: D): IrStatement = accept(transformer, data) as IrStatement } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrDeclarationBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrDeclarationBase.kt index 85911b2c8cb..28c031dd40e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrDeclarationBase.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrDeclarationBase.kt @@ -32,6 +32,9 @@ abstract class IrDeclarationBase( IrDeclaration, DeclarationCarrier { + override val factory: IrFactory + get() = IrFactoryImpl + override var parentField: IrDeclarationParent? = null // TODO reduce boilerplate diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt index bf90b621e81..93856c20ca2 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt @@ -46,6 +46,9 @@ class IrScriptImpl( @ObsoleteDescriptorBasedAPI override val descriptor: ScriptDescriptor = symbol.descriptor + override val factory: IrFactory + get() = error("Create IrScriptImpl directly") + init { symbol.bind(this) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrVariableImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrVariableImpl.kt index 2e1f2138df6..c9b7032c08b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrVariableImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrVariableImpl.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin 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.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrExpression @@ -60,6 +61,9 @@ class IrVariableImpl( override var initializer: IrExpression? = null + override val factory: IrFactory + get() = error("Create IrVariableImpl directly") + override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitVariable(this, data) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyDeclarationBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyDeclarationBase.kt index 7c7498d5f9d..cf43af948a4 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyDeclarationBase.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyDeclarationBase.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.ir.IrElementBase 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.IrValueParameterImpl import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator @@ -26,11 +25,13 @@ abstract class IrLazyDeclarationBase( private val stubGenerator: DeclarationStubGenerator, protected val typeTranslator: TypeTranslator ) : IrElementBase(startOffset, endOffset), IrDeclaration { + override val factory: IrFactory + get() = stubGenerator.symbolTable.irFactory protected fun KotlinType.toIrType() = typeTranslator.translateType(this) protected fun ReceiverParameterDescriptor.generateReceiverParameterStub(): IrValueParameter = - IrValueParameterImpl( + factory.createValueParameter( UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, IrValueParameterSymbolImpl(this), name, -1, type.toIrType(), null, isCrossinline = false, isNoinline = false ) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt index 2ef676abc53..6d1f2d85133 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt @@ -125,7 +125,7 @@ open class DeepCopyIrTreeWithSymbols( } override fun visitClass(declaration: IrClass): IrClass = - IrClassImpl( + declaration.factory.createClass( declaration.startOffset, declaration.endOffset, mapDeclarationOrigin(declaration.origin), symbolRemapper.getDeclaredClass(declaration.symbol), @@ -151,7 +151,7 @@ open class DeepCopyIrTreeWithSymbols( }.copyAttributes(declaration) override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction = - IrFunctionImpl( + declaration.factory.createFunction( declaration.startOffset, declaration.endOffset, mapDeclarationOrigin(declaration.origin), symbolRemapper.getDeclaredFunction(declaration.symbol), @@ -176,7 +176,7 @@ open class DeepCopyIrTreeWithSymbols( } override fun visitConstructor(declaration: IrConstructor): IrConstructor = - IrConstructorImpl( + declaration.factory.createConstructor( declaration.startOffset, declaration.endOffset, mapDeclarationOrigin(declaration.origin), symbolRemapper.getDeclaredConstructor(declaration.symbol), @@ -209,7 +209,7 @@ open class DeepCopyIrTreeWithSymbols( } override fun visitProperty(declaration: IrProperty): IrProperty = - IrPropertyImpl( + declaration.factory.createProperty( declaration.startOffset, declaration.endOffset, mapDeclarationOrigin(declaration.origin), symbolRemapper.getDeclaredProperty(declaration.symbol), @@ -236,7 +236,7 @@ open class DeepCopyIrTreeWithSymbols( } override fun visitField(declaration: IrField): IrField = - IrFieldImpl( + declaration.factory.createField( declaration.startOffset, declaration.endOffset, mapDeclarationOrigin(declaration.origin), symbolRemapper.getDeclaredField(declaration.symbol), @@ -252,7 +252,7 @@ open class DeepCopyIrTreeWithSymbols( } override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty): IrLocalDelegatedProperty = - IrLocalDelegatedPropertyImpl( + declaration.factory.createLocalDelegatedProperty( declaration.startOffset, declaration.endOffset, mapDeclarationOrigin(declaration.origin), symbolRemapper.getDeclaredLocalDelegatedProperty(declaration.symbol), @@ -267,7 +267,7 @@ open class DeepCopyIrTreeWithSymbols( } override fun visitEnumEntry(declaration: IrEnumEntry): IrEnumEntry = - IrEnumEntryImpl( + declaration.factory.createEnumEntry( declaration.startOffset, declaration.endOffset, mapDeclarationOrigin(declaration.origin), symbolRemapper.getDeclaredEnumEntry(declaration.symbol), @@ -279,7 +279,7 @@ open class DeepCopyIrTreeWithSymbols( } override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer): IrAnonymousInitializer = - IrAnonymousInitializerImpl( + declaration.factory.createAnonymousInitializer( declaration.startOffset, declaration.endOffset, mapDeclarationOrigin(declaration.origin), IrAnonymousInitializerSymbolImpl(declaration.descriptor) @@ -309,7 +309,7 @@ open class DeepCopyIrTreeWithSymbols( } private fun copyTypeParameter(declaration: IrTypeParameter): IrTypeParameter = - IrTypeParameterImpl( + declaration.factory.createTypeParameter( declaration.startOffset, declaration.endOffset, mapDeclarationOrigin(declaration.origin), symbolRemapper.getDeclaredTypeParameter(declaration.symbol), @@ -336,7 +336,7 @@ open class DeepCopyIrTreeWithSymbols( } override fun visitValueParameter(declaration: IrValueParameter): IrValueParameter = - IrValueParameterImpl( + declaration.factory.createValueParameter( declaration.startOffset, declaration.endOffset, mapDeclarationOrigin(declaration.origin), symbolRemapper.getDeclaredValueParameter(declaration.symbol), @@ -352,7 +352,7 @@ open class DeepCopyIrTreeWithSymbols( } override fun visitTypeAlias(declaration: IrTypeAlias): IrTypeAlias = - IrTypeAliasImpl( + declaration.factory.createTypeAlias( declaration.startOffset, declaration.endOffset, symbolRemapper.getDeclaredTypeAlias(declaration.symbol), symbolRenamer.getTypeAliasName(declaration.symbol), @@ -768,7 +768,7 @@ open class DeepCopyIrTreeWithSymbols( ).copyAttributes(expression) 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 = IrErrorExpressionImpl( diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrideCopier.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrideCopier.kt index cf8936cf321..769fdd2804b 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrideCopier.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrideCopier.kt @@ -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 import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrProperty 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.* class FakeOverrideCopier( @@ -47,7 +50,7 @@ class FakeOverrideCopier( } override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction = - IrFakeOverrideFunctionImpl( + declaration.factory.createFakeOverrideFunction( declaration.startOffset, declaration.endOffset, IrDeclarationOrigin.FAKE_OVERRIDE, symbolRenamer.getFunctionName(declaration.symbol), @@ -67,7 +70,7 @@ class FakeOverrideCopier( override fun visitProperty(declaration: IrProperty): IrProperty = - IrFakeOverridePropertyImpl( + declaration.factory.createFakeOverrideProperty( declaration.startOffset, declaration.endOffset, IrDeclarationOrigin.FAKE_OVERRIDE, declaration.name, diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt index 815958785e8..8a36f611c04 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.backend.common.overrides import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer import org.jetbrains.kotlin.ir.IrElement 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.WrappedPropertyDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrOverridingUtil.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrOverridingUtil.kt index e92300f0aaa..2d68539c9f7 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrOverridingUtil.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/IrOverridingUtil.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility 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.symbols.IrPropertySymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol