From a8b44c9e18ca269b253362db6ef0b5fdc076d646 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Thu, 13 Sep 2018 16:26:17 +0300 Subject: [PATCH] [JS IR BE] Fix Ir Copier * use symbol table to allocate classifier for IrType --- .../inline/DeepCopyIrTreeWithDescriptors.kt | 24 +++++++++++-------- .../org/jetbrains/kotlin/ir/types/irTypes.kt | 2 +- .../jetbrains/kotlin/ir/util/SymbolTable.kt | 4 ++-- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/DeepCopyIrTreeWithDescriptors.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/DeepCopyIrTreeWithDescriptors.kt index 4edb9c0f587..d9882cfa560 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/DeepCopyIrTreeWithDescriptors.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/DeepCopyIrTreeWithDescriptors.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.createFunctionSymbol import org.jetbrains.kotlin.ir.symbols.impl.createValueSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.DeepCopyIrTree +import org.jetbrains.kotlin.ir.util.withScope import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -508,16 +509,19 @@ internal class DeepCopyIrTreeWithDescriptors(val targetDescriptor: FunctionDescr //---------------------------------------------------------------------// - override fun visitFunction(declaration: IrFunction): IrFunction = - IrFunctionImpl( - startOffset = declaration.startOffset, - endOffset = declaration.endOffset, - origin = mapDeclarationOrigin(declaration.origin), - descriptor = mapFunctionDeclaration(declaration.descriptor), - body = declaration.body?.transform(this, null) - ).also { - it.setOverrides(context.symbolTable) - }.transformParameters(declaration) + override fun visitFunction(declaration: IrFunction) = + context.symbolTable.withScope(mapFunctionDeclaration(declaration.descriptor)) { descriptor -> + IrFunctionImpl( + startOffset = declaration.startOffset, + endOffset = declaration.endOffset, + origin = mapDeclarationOrigin(declaration.origin), + descriptor = descriptor, + body = declaration.body?.transform(this@InlineCopyIr, null) + ).also { + it.setOverrides(context.symbolTable) + it.transformParameters(declaration) + } + } //---------------------------------------------------------------------// diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt index b437e73d535..abd365f4a15 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt @@ -145,6 +145,6 @@ fun KotlinType.toIrType(symbolTable: SymbolTable? = null): IrType? { // TODO: this function creates unbound symbol which is the great source of problems private fun ClassifierDescriptor.getSymbol(symbolTable: SymbolTable?): IrClassifierSymbol = when (this) { is ClassDescriptor -> symbolTable?.referenceClass(this) ?: IrClassSymbolImpl(this) - is TypeParameterDescriptor -> /*symbolTable?.referenceTypeParameter(this) ?: */IrTypeParameterSymbolImpl(this) + is TypeParameterDescriptor -> symbolTable?.referenceTypeParameter(this) ?: IrTypeParameterSymbolImpl(this) else -> TODO() } \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index c65b99179cd..a8c3212638d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -413,9 +413,9 @@ open class SymbolTable : ReferenceSymbolTable { } } -inline fun SymbolTable.withScope(owner: DeclarationDescriptor, block: SymbolTable.() -> T): T { +inline fun SymbolTable.withScope(owner: D, block: SymbolTable.(D) -> T): T { enterScope(owner) - val result = block(this) + val result = block(owner) leaveScope(owner) return result } \ No newline at end of file