[FIR2IR] Add fir2ir component for converting fir visibility to FE 1.0

This commit is contained in:
Dmitriy Novozhilov
2020-08-16 21:01:55 +03:00
parent a02109d857
commit 2e92fe9be9
16 changed files with 93 additions and 36 deletions
@@ -63,6 +63,7 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmClassCodegen
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions
import org.jetbrains.kotlin.fir.extensions.extensionService
@@ -405,7 +406,8 @@ object KotlinToJVMBytecodeCompiler {
Fir2IrConverter.createModuleFragment(
session, resolveTransformer.scopeSession, firFiles,
moduleConfiguration.languageVersionSettings, signaturer,
JvmGeneratorExtensions(), FirJvmKotlinMangler(session), IrFactoryImpl
JvmGeneratorExtensions(), FirJvmKotlinMangler(session), IrFactoryImpl,
FirJvmVisibilityConverter
)
performanceManager?.notifyIRTranslationFinished()
@@ -7,6 +7,7 @@ dependencies {
compileOnly(project(":core:descriptors"))
compileOnly(project(":compiler:fir:cones"))
compileOnly(project(":compiler:fir:resolve"))
compileOnly(project(":compiler:fir:jvm"))
compileOnly(project(":compiler:fir:tree"))
compileOnly(project(":compiler:fir:fir2ir"))
compileOnly(project(":compiler:fir:fir-serialization"))
@@ -0,0 +1,24 @@
/*
* 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.fir.backend.jvm
import org.jetbrains.kotlin.fir.JavaVisibilities
import org.jetbrains.kotlin.fir.Visibility
import org.jetbrains.kotlin.fir.backend.Fir2IrVisibilityConverter
import org.jetbrains.kotlin.descriptors.Visibility as OldVisibility
import org.jetbrains.kotlin.load.java.JavaVisibilities as OldJavaVisibilities
object FirJvmVisibilityConverter : Fir2IrVisibilityConverter() {
override fun convertPlatformVisibility(visibility: Visibility): OldVisibility {
return when (visibility) {
JavaVisibilities.PackageVisibility -> OldJavaVisibilities.PACKAGE_VISIBILITY
JavaVisibilities.ProtectedStaticVisibility -> OldJavaVisibilities.PROTECTED_STATIC_VISIBILITY
JavaVisibilities.ProtectedAndPackage -> OldJavaVisibilities.PROTECTED_AND_PACKAGE
else -> error("Unknown visibility: $this")
}
}
}
@@ -50,8 +50,6 @@ import org.jetbrains.kotlin.types.AbstractTypeChecker
import org.jetbrains.kotlin.types.AbstractTypeCheckerContext
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.descriptors.Visibilities as OldVisibilities
import org.jetbrains.kotlin.descriptors.Visibility as OldVisibility
internal fun <T : IrElement> FirElement.convertWithOffsets(
f: (startOffset: Int, endOffset: Int) -> T
@@ -491,15 +489,3 @@ fun Fir2IrComponents.createTemporaryVariableForSafeCallConstruction(
return Pair(receiverVariable, variableSymbol)
}
fun Visibility.toOldVisibility(): OldVisibility = when (this.normalize()) {
Visibilities.Private -> OldVisibilities.PRIVATE
Visibilities.PrivateToThis -> OldVisibilities.PRIVATE_TO_THIS
Visibilities.Protected -> OldVisibilities.PROTECTED
Visibilities.Internal -> OldVisibilities.INTERNAL
Visibilities.Public -> OldVisibilities.PUBLIC
Visibilities.Local -> OldVisibilities.LOCAL
Visibilities.InvisibleFake -> OldVisibilities.INVISIBLE_FAKE
Visibilities.Unknown -> OldVisibilities.UNKNOWN
else -> error("Unknown visiblity: $this")
}
@@ -192,7 +192,7 @@ class Fir2IrClassifierStorage(
declareIrTypeAlias(signature) { symbol ->
val irTypeAlias = irFactory.createTypeAlias(
startOffset, endOffset, symbol,
typeAlias.name, typeAlias.visibility.toOldVisibility(),
typeAlias.name, components.visibilityConverter.convertToOldVisibility(typeAlias.visibility),
typeAlias.expandedTypeRef.toIrType(),
typeAlias.isActual, IrDeclarationOrigin.DEFINED
).apply {
@@ -237,7 +237,7 @@ class Fir2IrClassifierStorage(
symbol,
regularClass.name,
regularClass.classKind,
visibility.toOldVisibility(),
components.visibilityConverter.convertToOldVisibility(visibility),
modality,
isCompanion = regularClass.isCompanion,
isInner = regularClass.isInner,
@@ -277,7 +277,7 @@ class Fir2IrClassifierStorage(
startOffset, endOffset, origin, symbol, name,
// NB: for unknown reason, IR uses 'CLASS' kind for simple anonymous objects
anonymousObject.classKind.takeIf { it == ClassKind.ENUM_ENTRY } ?: ClassKind.CLASS,
visibility.toOldVisibility(), modality
components.visibilityConverter.convertToOldVisibility(visibility), modality
).apply {
metadata = FirMetadataSource.Class(anonymousObject)
setThisReceiver(anonymousObject.typeParameters)
@@ -26,4 +26,5 @@ interface Fir2IrComponents {
val signatureComposer: Fir2IrSignatureComposer
val callGenerator: CallAndReferenceGenerator
val fakeOverrideGenerator: FakeOverrideGenerator
val visibilityConverter: Fir2IrVisibilityConverter
}
@@ -28,6 +28,7 @@ class Fir2IrComponentsStorage(
override lateinit var typeConverter: Fir2IrTypeConverter
override lateinit var callGenerator: CallAndReferenceGenerator
override lateinit var fakeOverrideGenerator: FakeOverrideGenerator
override lateinit var visibilityConverter: Fir2IrVisibilityConverter
override lateinit var builtIns: Fir2IrBuiltIns
override val signatureComposer = FirBasedSignatureComposer(mangler)
@@ -255,6 +255,7 @@ class Fir2IrConverter(
generatorExtensions: GeneratorExtensions,
mangler: FirMangler,
irFactory: IrFactory,
visibilityConverter: Fir2IrVisibilityConverter
): Fir2IrResult {
val moduleDescriptor = FirModuleDescriptor(session)
val symbolTable = SymbolTable(signaturer, irFactory)
@@ -279,6 +280,7 @@ class Fir2IrConverter(
components.declarationStorage = declarationStorage
components.classifierStorage = classifierStorage
components.typeConverter = typeConverter
components.visibilityConverter = visibilityConverter
components.builtIns = builtIns
val irFiles = mutableListOf<IrFile>()
@@ -330,4 +332,4 @@ class Fir2IrConverter(
return Fir2IrResult(irModuleFragment, symbolTable, sourceManager, components)
}
}
}
}
@@ -406,7 +406,7 @@ class Fir2IrDeclarationStorage(
val result = declareIrSimpleFunction(signature, simpleFunction?.containerSource) { symbol ->
irFactory.createFunction(
startOffset, endOffset, updatedOrigin, symbol,
name, visibility.toOldVisibility(),
name, components.visibilityConverter.convertToOldVisibility(visibility),
simpleFunction?.modality ?: Modality.FINAL,
function.returnTypeRef.toIrType(),
isInline = simpleFunction?.isInline == true,
@@ -483,7 +483,7 @@ class Fir2IrDeclarationStorage(
declareIrConstructor(signature) { symbol ->
irFactory.createConstructor(
startOffset, endOffset, origin, symbol,
Name.special("<init>"), constructor.visibility.toOldVisibility(),
Name.special("<init>"), components.visibilityConverter.convertToOldVisibility(constructor.visibility),
constructor.returnTypeRef.toIrType(),
isInline = false, isExternal = false, isPrimary = isPrimary, isExpect = constructor.isExpect
).apply {
@@ -535,10 +535,13 @@ class Fir2IrDeclarationStorage(
isGetter = !isSetter
) { symbol ->
val accessorReturnType = if (isSetter) irBuiltIns.unitType else propertyType
val visibility = propertyAccessor?.visibility?.let {
components.visibilityConverter.convertToOldVisibility(it)
}
irFactory.createFunction(
startOffset, endOffset, origin, symbol,
Name.special("<$prefix-${correspondingProperty.name}>"),
propertyAccessor?.visibility?.toOldVisibility() ?: correspondingProperty.visibility,
visibility ?: correspondingProperty.visibility,
correspondingProperty.modality, accessorReturnType,
isInline = propertyAccessor?.isInline == true,
isExternal = propertyAccessor?.isExternal == true,
@@ -650,7 +653,7 @@ class Fir2IrDeclarationStorage(
val result = declareIrProperty(signature, property.containerSource) { symbol ->
irFactory.createProperty(
startOffset, endOffset, origin, symbol,
property.name, property.visibility.toOldVisibility(), property.modality!!,
property.name, components.visibilityConverter.convertToOldVisibility(property.visibility), property.modality!!,
isVar = property.isVar,
isConst = property.isConst,
isLateinit = property.isLateInit,
@@ -678,8 +681,8 @@ class Fir2IrDeclarationStorage(
) {
backingField = createBackingField(
property, IrDeclarationOrigin.PROPERTY_BACKING_FIELD, descriptor,
property.fieldVisibility.toOldVisibility(), property.name, property.isVal, initializer,
type
components.visibilityConverter.convertToOldVisibility(property.fieldVisibility),
property.name, property.isVal, initializer, type
).also { field ->
if (initializer is FirConstExpression<*>) {
// TODO: Normally we shouldn't have error type here
@@ -690,7 +693,8 @@ class Fir2IrDeclarationStorage(
} else if (delegate != null) {
backingField = createBackingField(
property, IrDeclarationOrigin.PROPERTY_DELEGATE, descriptor,
property.fieldVisibility.toOldVisibility(), Name.identifier("${property.name}\$delegate"), true, delegate
components.visibilityConverter.convertToOldVisibility(property.fieldVisibility),
Name.identifier("${property.name}\$delegate"), true, delegate
)
}
if (irParent != null) {
@@ -770,7 +774,7 @@ class Fir2IrDeclarationStorage(
) { symbol ->
irFactory.createField(
startOffset, endOffset, origin, symbol,
field.name, type, field.visibility.toOldVisibility(),
field.name, type, components.visibilityConverter.convertToOldVisibility(field.visibility),
isFinal = field.modality == Modality.FINAL,
isExternal = false,
isStatic = field.isStatic
@@ -0,0 +1,35 @@
/*
* 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.fir.backend
import org.jetbrains.kotlin.fir.Visibilities
import org.jetbrains.kotlin.fir.Visibility
import org.jetbrains.kotlin.descriptors.Visibility as OldVisibility
import org.jetbrains.kotlin.descriptors.Visibilities as OldVisibilities
abstract class Fir2IrVisibilityConverter {
object Default : Fir2IrVisibilityConverter() {
override fun convertPlatformVisibility(visibility: Visibility): OldVisibility {
error("Unknown visibility: $this")
}
}
fun convertToOldVisibility(visibility: Visibility): OldVisibility {
return when (visibility) {
Visibilities.Private -> OldVisibilities.PRIVATE
Visibilities.PrivateToThis -> OldVisibilities.PRIVATE_TO_THIS
Visibilities.Protected -> OldVisibilities.PROTECTED
Visibilities.Internal -> OldVisibilities.INTERNAL
Visibilities.Public -> OldVisibilities.PUBLIC
Visibilities.Local -> OldVisibilities.LOCAL
Visibilities.InvisibleFake -> OldVisibilities.INVISIBLE_FAKE
Visibilities.Unknown -> OldVisibilities.UNKNOWN
else -> convertPlatformVisibility(visibility)
}
}
protected abstract fun convertPlatformVisibility(visibility: Visibility): OldVisibility
}
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter
import org.jetbrains.kotlin.fir.backend.toIrType
import org.jetbrains.kotlin.fir.backend.toOldVisibility
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol
@@ -57,7 +56,7 @@ class Fir2IrLazyClass(
get() = fir.name
@Suppress("SetterBackingFieldAssignment")
override var visibility: OldVisibility = fir.visibility.toOldVisibility()
override var visibility: OldVisibility = components.visibilityConverter.convertToOldVisibility(fir.visibility)
set(_) {
error("Mutating Fir2Ir lazy elements is not possible")
}
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter
import org.jetbrains.kotlin.fir.backend.toIrType
import org.jetbrains.kotlin.fir.backend.toOldVisibility
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.symbols.Fir2IrConstructorSymbol
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
@@ -63,7 +62,7 @@ class Fir2IrLazyConstructor(
get() = Name.special("<init>")
@Suppress("SetterBackingFieldAssignment")
override var visibility: OldVisibility = fir.visibility.toOldVisibility()
override var visibility: OldVisibility = components.visibilityConverter.convertToOldVisibility(fir.visibility)
set(_) {
error("Mutating Fir2Ir lazy elements is not possible")
}
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.toIrConst
import org.jetbrains.kotlin.fir.backend.toOldVisibility
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
@@ -71,7 +70,7 @@ class Fir2IrLazyProperty(
get() = fir.name
@Suppress("SetterBackingFieldAssignment")
override var visibility: OldVisibility = fir.visibility.toOldVisibility()
override var visibility: OldVisibility = components.visibilityConverter.convertToOldVisibility(fir.visibility)
set(_) {
error("Mutating Fir2Ir lazy elements is not possible")
}
@@ -95,7 +94,7 @@ class Fir2IrLazyProperty(
with(declarationStorage) {
createBackingField(
fir, IrDeclarationOrigin.PROPERTY_BACKING_FIELD, descriptor,
fir.fieldVisibility.toOldVisibility(), fir.name, fir.isVal, fir.initializer,
components.visibilityConverter.convertToOldVisibility(fir.visibility), fir.name, fir.isVal, fir.initializer,
type
).also { field ->
val initializer = fir.initializer
@@ -111,7 +110,7 @@ class Fir2IrLazyProperty(
with(declarationStorage) {
createBackingField(
fir, IrDeclarationOrigin.PROPERTY_DELEGATE, descriptor,
fir.fieldVisibility.toOldVisibility(), Name.identifier("${fir.name}\$delegate"), true, fir.delegate
components.visibilityConverter.convertToOldVisibility(fir.visibility), Name.identifier("${fir.name}\$delegate"), true, fir.delegate
)
}
}
@@ -72,7 +72,7 @@ class Fir2IrLazySimpleFunction(
get() = fir.name
@Suppress("SetterBackingFieldAssignment")
override var visibility: OldVisibility = fir.visibility.toOldVisibility()
override var visibility: OldVisibility = components.visibilityConverter.convertToOldVisibility(fir.visibility)
set(_) {
error("Mutating Fir2Ir lazy elements is not possible")
}
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
@@ -93,6 +94,7 @@ abstract class AbstractFir2IrTextTest : AbstractIrTextTestCase() {
JvmGeneratorExtensions(generateFacades = false),
FirJvmKotlinMangler(session),
IrFactoryImpl,
FirJvmVisibilityConverter
).irModuleFragment
}
}
@@ -45,6 +45,7 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmClassCodegen
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.createSession
import org.jetbrains.kotlin.fir.resolve.firProvider
@@ -150,6 +151,7 @@ object GenerationUtils {
JvmGeneratorExtensions(),
FirJvmKotlinMangler(session),
IrFactoryImpl,
FirJvmVisibilityConverter
)
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext