JVM_IR: JvmNameProvider
This commit is contained in:
@@ -34,7 +34,7 @@ object JvmBackendFacade {
|
|||||||
val mangler = JvmManglerDesc(MainFunctionDetector(state.bindingContext, state.languageVersionSettings))
|
val mangler = JvmManglerDesc(MainFunctionDetector(state.bindingContext, state.languageVersionSettings))
|
||||||
val signaturer = JvmIdSignatureDescriptor(mangler)
|
val signaturer = JvmIdSignatureDescriptor(mangler)
|
||||||
val psi2ir = Psi2IrTranslator(state.languageVersionSettings, signaturer = signaturer)
|
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)
|
val pluginExtensions = IrGenerationExtension.getInstances(state.project)
|
||||||
|
|
||||||
for (extension in pluginExtensions) {
|
for (extension in pluginExtensions) {
|
||||||
|
|||||||
@@ -270,7 +270,6 @@ private val kotlinNothingValueExceptionPhase = makeIrFilePhase(
|
|||||||
|
|
||||||
@Suppress("Reformat")
|
@Suppress("Reformat")
|
||||||
private val jvmFilePhases =
|
private val jvmFilePhases =
|
||||||
renameAnonymousParametersLowering then
|
|
||||||
typeAliasAnnotationMethodsPhase then
|
typeAliasAnnotationMethodsPhase then
|
||||||
stripTypeAliasDeclarationsPhase then
|
stripTypeAliasDeclarationsPhase then
|
||||||
provisionalFunctionExpressionPhase then
|
provisionalFunctionExpressionPhase then
|
||||||
|
|||||||
@@ -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<KtParameter>()?.isSingleUnderscore == true) {
|
||||||
|
return Name.identifier("\$noName_${descriptor.index}")
|
||||||
|
}
|
||||||
|
return descriptor.name
|
||||||
|
}
|
||||||
|
}
|
||||||
-85
@@ -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<IrValueParameter, IrValueParameter> = 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<ValueParameterDescriptor>()?.let {
|
|
||||||
getNameForDestructuredParameterOrNull(it)?.let { return Name.identifier(it) }
|
|
||||||
if (DescriptorToSourceUtils.getSourceFromDescriptor(it)?.safeAs<KtParameter>()?.isSingleUnderscore == true) {
|
|
||||||
return Name.identifier("\$noName_${it.index}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -48,9 +48,10 @@ class Psi2IrTranslator(
|
|||||||
moduleDescriptor: ModuleDescriptor,
|
moduleDescriptor: ModuleDescriptor,
|
||||||
ktFiles: Collection<KtFile>,
|
ktFiles: Collection<KtFile>,
|
||||||
bindingContext: BindingContext,
|
bindingContext: BindingContext,
|
||||||
generatorExtensions: GeneratorExtensions
|
generatorExtensions: GeneratorExtensions,
|
||||||
|
nameProvider: NameProvider = NameProvider.DEFAULT
|
||||||
): IrModuleFragment {
|
): IrModuleFragment {
|
||||||
val context = createGeneratorContext(moduleDescriptor, bindingContext, extensions = generatorExtensions)
|
val context = createGeneratorContext(moduleDescriptor, bindingContext, nameProvider, extensions = generatorExtensions)
|
||||||
val irProviders = generateTypicalIrProviderList(
|
val irProviders = generateTypicalIrProviderList(
|
||||||
moduleDescriptor, context.irBuiltIns, context.symbolTable, extensions = generatorExtensions
|
moduleDescriptor, context.irBuiltIns, context.symbolTable, extensions = generatorExtensions
|
||||||
)
|
)
|
||||||
@@ -60,7 +61,8 @@ class Psi2IrTranslator(
|
|||||||
fun createGeneratorContext(
|
fun createGeneratorContext(
|
||||||
moduleDescriptor: ModuleDescriptor,
|
moduleDescriptor: ModuleDescriptor,
|
||||||
bindingContext: BindingContext,
|
bindingContext: BindingContext,
|
||||||
symbolTable: SymbolTable = SymbolTable(signaturer),
|
nameProvider: NameProvider = NameProvider.DEFAULT,
|
||||||
|
symbolTable: SymbolTable = SymbolTable(signaturer, nameProvider),
|
||||||
extensions: GeneratorExtensions = GeneratorExtensions()
|
extensions: GeneratorExtensions = GeneratorExtensions()
|
||||||
): GeneratorContext =
|
): GeneratorContext =
|
||||||
createGeneratorContext(
|
createGeneratorContext(
|
||||||
|
|||||||
+1
-1
@@ -63,7 +63,7 @@ class JsCoreScriptingCompiler(
|
|||||||
val mangler = JsManglerDesc
|
val mangler = JsManglerDesc
|
||||||
val signaturer = IdSignatureDescriptor(mangler)
|
val signaturer = IdSignatureDescriptor(mangler)
|
||||||
val psi2ir = Psi2IrTranslator(environment.configuration.languageVersionSettings, signaturer = signaturer)
|
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 providers = generateTypicalIrProviderList(module, psi2irContext.irBuiltIns, psi2irContext.symbolTable)
|
||||||
val irModuleFragment = psi2ir.generateModuleFragment(psi2irContext, files, providers, null) // TODO: deserializer
|
val irModuleFragment = psi2ir.generateModuleFragment(psi2irContext, files, providers, null) // TODO: deserializer
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user