From 9561cc827020cd2d9195f2c68b9f0be45cf4a640 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Mon, 20 Apr 2020 20:59:41 +0300 Subject: [PATCH] JVM_IR: JvmNameProvider --- .../kotlin/backend/jvm/JvmBackendFacade.kt | 2 +- .../jetbrains/kotlin/backend/jvm/JvmLower.kt | 1 - .../kotlin/backend/jvm/JvmNameProvider.kt | 32 +++++++ .../RenameAnonymousParametersLowering.kt | 85 ------------------- .../kotlin/psi2ir/Psi2IrTranslator.kt | 8 +- .../repl/js/JsCoreScriptingCompiler.kt | 2 +- 6 files changed, 39 insertions(+), 91 deletions(-) create mode 100644 compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmNameProvider.kt delete mode 100644 compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RenameAnonymousParametersLowering.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt index d06ad9ae678..9da3f024873 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt @@ -34,7 +34,7 @@ object JvmBackendFacade { val mangler = JvmManglerDesc(MainFunctionDetector(state.bindingContext, state.languageVersionSettings)) val signaturer = JvmIdSignatureDescriptor(mangler) val psi2ir = Psi2IrTranslator(state.languageVersionSettings, signaturer = signaturer) - val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext, extensions = extensions) + val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext, JvmNameProvider, extensions = extensions) val pluginExtensions = IrGenerationExtension.getInstances(state.project) for (extension in pluginExtensions) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index 9c124c20b98..33e18c44a28 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -270,7 +270,6 @@ private val kotlinNothingValueExceptionPhase = makeIrFilePhase( @Suppress("Reformat") private val jvmFilePhases = - renameAnonymousParametersLowering then typeAliasAnnotationMethodsPhase then stripTypeAliasDeclarationsPhase then provisionalFunctionExpressionPhase then diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmNameProvider.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmNameProvider.kt new file mode 100644 index 00000000000..9fe624c7941 --- /dev/null +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmNameProvider.kt @@ -0,0 +1,32 @@ +/* + * 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.jvm + +import org.jetbrains.kotlin.codegen.getNameForDestructuredParameterOrNull +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor +import org.jetbrains.kotlin.ir.util.NameProvider +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtParameter +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils +import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore +import org.jetbrains.kotlin.utils.addToStdlib.safeAs + +object JvmNameProvider : NameProvider { + override fun nameForDeclaration(descriptor: DeclarationDescriptor): Name { + if (descriptor is ValueParameterDescriptor) + return nameForValueParameter(descriptor) + return NameProvider.DEFAULT.nameForDeclaration(descriptor) + } + + private fun nameForValueParameter(descriptor: ValueParameterDescriptor): Name { + getNameForDestructuredParameterOrNull(descriptor)?.let { return Name.identifier(it) } + if (DescriptorToSourceUtils.getSourceFromDescriptor(descriptor)?.safeAs()?.isSingleUnderscore == true) { + return Name.identifier("\$noName_${descriptor.index}") + } + return descriptor.name + } +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RenameAnonymousParametersLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RenameAnonymousParametersLowering.kt deleted file mode 100644 index 222690647e3..00000000000 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/RenameAnonymousParametersLowering.kt +++ /dev/null @@ -1,85 +0,0 @@ -/* - * 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.jvm.lower - -import org.jetbrains.kotlin.backend.common.FileLoweringPass -import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext -import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase -import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.codegen.getNameForDestructuredParameterOrNull -import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor -import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor -import org.jetbrains.kotlin.ir.declarations.IrFile -import org.jetbrains.kotlin.ir.declarations.IrValueParameter -import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl -import org.jetbrains.kotlin.ir.descriptors.WrappedReceiverParameterDescriptor -import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor -import org.jetbrains.kotlin.ir.expressions.IrExpression -import org.jetbrains.kotlin.ir.expressions.IrGetValue -import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl -import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore -import org.jetbrains.kotlin.utils.addToStdlib.safeAs - -internal val renameAnonymousParametersLowering = makeIrFilePhase( - ::RenameAnonymousParametersLowering, - name = "RenameAnonymousParameters", - description = "Mangles variable names for anonymous parameters (only allowed in lambdas)" -) - -private class RenameAnonymousParametersLowering(val context: JvmBackendContext) : FileLoweringPass, IrElementTransformerVoidWithContext() { - - val oldParameterToNew: MutableMap = mutableMapOf() - - override fun lower(irFile: IrFile) = irFile.transformChildrenVoid() - - override fun visitValueParameterNew(declaration: IrValueParameter) = - declaration.computeNewParameterName()?.let { name -> - val descriptor = if (declaration.descriptor is ReceiverParameterDescriptor) { - WrappedReceiverParameterDescriptor(declaration.descriptor.annotations) - } else { - WrappedValueParameterDescriptor(declaration.descriptor.annotations) - } - IrValueParameterImpl( - declaration.startOffset, declaration.endOffset, - declaration.origin, - IrValueParameterSymbolImpl(descriptor), - name, - declaration.index, - declaration.type, - declaration.varargElementType, - declaration.isCrossinline, - declaration.isNoinline - ).apply { - descriptor.bind(this) - parent = declaration.parent - defaultValue = declaration.defaultValue - annotations += declaration.annotations - oldParameterToNew[declaration] = this - } - } ?: super.visitValueParameterNew(declaration) - - override fun visitGetValue(expression: IrGetValue): IrExpression { - val oldParameter = expression.symbol.owner - return oldParameterToNew[oldParameter]?.let { - IrGetValueImpl(expression.startOffset, expression.endOffset, it.type, it.symbol) - } ?: super.visitGetValue(expression) - } - - private fun IrValueParameter.computeNewParameterName(): Name? { - // Consistent with naming on old (non-IR) backend; see FunctionCodegen.java. - descriptor.safeAs()?.let { - getNameForDestructuredParameterOrNull(it)?.let { return Name.identifier(it) } - if (DescriptorToSourceUtils.getSourceFromDescriptor(it)?.safeAs()?.isSingleUnderscore == true) { - return Name.identifier("\$noName_${it.index}") - } - } - return null - } -} diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrTranslator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrTranslator.kt index 9ef875cba87..b6c08e25728 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrTranslator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrTranslator.kt @@ -48,9 +48,10 @@ class Psi2IrTranslator( moduleDescriptor: ModuleDescriptor, ktFiles: Collection, bindingContext: BindingContext, - generatorExtensions: GeneratorExtensions + generatorExtensions: GeneratorExtensions, + nameProvider: NameProvider = NameProvider.DEFAULT ): IrModuleFragment { - val context = createGeneratorContext(moduleDescriptor, bindingContext, extensions = generatorExtensions) + val context = createGeneratorContext(moduleDescriptor, bindingContext, nameProvider, extensions = generatorExtensions) val irProviders = generateTypicalIrProviderList( moduleDescriptor, context.irBuiltIns, context.symbolTable, extensions = generatorExtensions ) @@ -60,7 +61,8 @@ class Psi2IrTranslator( fun createGeneratorContext( moduleDescriptor: ModuleDescriptor, bindingContext: BindingContext, - symbolTable: SymbolTable = SymbolTable(signaturer), + nameProvider: NameProvider = NameProvider.DEFAULT, + symbolTable: SymbolTable = SymbolTable(signaturer, nameProvider), extensions: GeneratorExtensions = GeneratorExtensions() ): GeneratorContext = createGeneratorContext( diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsCoreScriptingCompiler.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsCoreScriptingCompiler.kt index 88ba2949846..c7b820bcc97 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsCoreScriptingCompiler.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsCoreScriptingCompiler.kt @@ -63,7 +63,7 @@ class JsCoreScriptingCompiler( val mangler = JsManglerDesc val signaturer = IdSignatureDescriptor(mangler) val psi2ir = Psi2IrTranslator(environment.configuration.languageVersionSettings, signaturer = signaturer) - val psi2irContext = psi2ir.createGeneratorContext(module, bindingContext, symbolTable) + val psi2irContext = psi2ir.createGeneratorContext(module, bindingContext, symbolTable = symbolTable) val providers = generateTypicalIrProviderList(module, psi2irContext.irBuiltIns, psi2irContext.symbolTable) val irModuleFragment = psi2ir.generateModuleFragment(psi2irContext, files, providers, null) // TODO: deserializer