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,
open val symbol: Fir2IrBindableSymbol<*, D>
) : 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
@@ -42,6 +42,8 @@ interface IrDeclaration : IrStatement, IrMutableAnnotationContainer {
var parent: IrDeclarationParent
val factory: IrFactory
override fun <D> transform(transformer: IrElementTransformer<D>, data: D): IrStatement =
accept(transformer, data) as IrStatement
}
@@ -32,6 +32,9 @@ abstract class IrDeclarationBase<T : DeclarationCarrier>(
IrDeclaration,
DeclarationCarrier {
override val factory: IrFactory
get() = IrFactoryImpl
override var parentField: IrDeclarationParent? = null
// TODO reduce boilerplate
@@ -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)
}
@@ -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 <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
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.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
)
@@ -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(
@@ -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,
@@ -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
@@ -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