[FIR2IR] Create special IrDeclarationOrigin for generated declarations

This commit is contained in:
Dmitriy Novozhilov
2021-10-04 12:28:06 +03:00
committed by TeamCityServer
parent 233b9f1242
commit b3768a201f
11 changed files with 79 additions and 33 deletions
@@ -492,7 +492,10 @@ internal fun IrDeclarationParent.declareThisReceiverParameter(
fun FirClass.irOrigin(firProvider: FirProvider): IrDeclarationOrigin = when {
firProvider.getFirClassifierContainerFileIfAny(symbol) != null -> IrDeclarationOrigin.DEFINED
isJava -> IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
else -> IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
else -> when (val origin = origin) {
is FirDeclarationOrigin.Plugin -> IrPluginDeclarationOrigin(origin.key)
else -> IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
}
}
val IrType.isSamType: Boolean
@@ -598,3 +601,9 @@ fun FirSession.createFilesWithGeneratedDeclarations(): List<FirFile> {
}
}
}
fun FirDeclaration?.computeIrOrigin(predefinedOrigin: IrDeclarationOrigin? = null): IrDeclarationOrigin {
return predefinedOrigin
?: (this?.origin as? FirDeclarationOrigin.Plugin)?.let { IrPluginDeclarationOrigin(it.key) }
?: IrDeclarationOrigin.DEFINED
}
@@ -229,7 +229,7 @@ class Fir2IrClassifierStorage(
fun registerIrClass(
regularClass: FirRegularClass,
parent: IrDeclarationParent? = null,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED
predefinedOrigin: IrDeclarationOrigin? = null
): IrClass {
val visibility = regularClass.visibility
val modality = if (regularClass.classKind == ClassKind.ENUM_CLASS) {
@@ -245,7 +245,7 @@ class Fir2IrClassifierStorage(
irFactory.createClass(
startOffset,
endOffset,
origin,
regularClass.computeIrOrigin(predefinedOrigin),
symbol,
regularClass.name,
regularClass.classKind,
@@ -314,7 +314,7 @@ class Fir2IrClassifierStorage(
typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT
): IrTypeParameter {
require(index >= 0)
val origin = IrDeclarationOrigin.DEFINED
val origin = typeParameter.computeIrOrigin()
val irTypeParameter = with(typeParameter) {
convertWithOffsets { startOffset, endOffset ->
irFactory.createTypeParameter(
@@ -389,11 +389,12 @@ class Fir2IrClassifierStorage(
fun createIrEnumEntry(
enumEntry: FirEnumEntry,
irParent: IrClass?,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED
predefinedOrigin: IrDeclarationOrigin? = null
): IrEnumEntry {
return enumEntry.convertWithOffsets { startOffset, endOffset ->
val signature = signatureComposer.composeSignature(enumEntry)
val result = declareIrEnumEntry(signature) { symbol ->
val origin = enumEntry.computeIrOrigin(predefinedOrigin)
irFactory.createEnumEntry(
startOffset, endOffset, origin, symbol, enumEntry.name
).apply {
@@ -437,7 +437,7 @@ class Fir2IrDeclarationStorage(
function: FirFunction,
irParent: IrDeclarationParent?,
thisReceiverOwner: IrClass? = irParent as? IrClass,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
predefinedOrigin: IrDeclarationOrigin? = null,
isLocal: Boolean = false,
containingClass: ConeClassLikeLookupTag? = null,
): IrSimpleFunction = convertCatching(function) {
@@ -453,7 +453,7 @@ class Fir2IrDeclarationStorage(
// See org.jetbrains.kotlin.backend.jvm.lower.InheritedDefaultMethodsOnClassesLoweringKt.isDefinitelyNotDefaultImplsMethod
(irParent as? IrClass)?.origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB &&
function.origin == FirDeclarationOrigin.Enhancement -> IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
else -> origin
else -> function.computeIrOrigin(predefinedOrigin)
}
classifierStorage.preCacheTypeParameters(function)
val name = simpleFunction?.name
@@ -544,9 +544,10 @@ class Fir2IrDeclarationStorage(
fun createIrConstructor(
constructor: FirConstructor,
irParent: IrClass,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
predefinedOrigin: IrDeclarationOrigin? = null,
isLocal: Boolean = false
): IrConstructor = convertCatching(constructor) {
val origin = constructor.computeIrOrigin(predefinedOrigin)
val isPrimary = constructor.isPrimary
classifierStorage.preCacheTypeParameters(constructor)
val signature = if (isLocal) null else signatureComposer.composeSignature(constructor)
@@ -572,11 +573,11 @@ class Fir2IrDeclarationStorage(
fun getOrCreateIrConstructor(
constructor: FirConstructor,
irParent: IrClass,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
predefinedOrigin: IrDeclarationOrigin? = null,
isLocal: Boolean = false
): IrConstructor {
getCachedIrConstructor(constructor)?.let { return it }
return createIrConstructor(constructor, irParent, origin, isLocal)
return createIrConstructor(constructor, irParent, predefinedOrigin, isLocal)
}
private fun declareIrAccessor(
@@ -760,10 +761,11 @@ class Fir2IrDeclarationStorage(
property: FirProperty,
irParent: IrDeclarationParent?,
thisReceiverOwner: IrClass? = irParent as? IrClass,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
predefinedOrigin: IrDeclarationOrigin? = null,
isLocal: Boolean = false,
containingClass: ConeClassLikeLookupTag? = null,
): IrProperty = convertCatching(property) {
val origin = property.computeIrOrigin(predefinedOrigin)
classifierStorage.preCacheTypeParameters(property)
if (property.delegate != null) {
val delegateReference = (property.delegate as? FirQualifiedAccess)?.calleeReference as? FirResolvedNamedReference
@@ -930,7 +932,7 @@ class Fir2IrDeclarationStorage(
typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT,
skipDefaultParameter: Boolean = false,
): IrValueParameter = convertCatching(valueParameter) {
val origin = IrDeclarationOrigin.DEFINED
val origin = valueParameter.computeIrOrigin()
val type = valueParameter.returnTypeRef.toIrType()
val irParameter = valueParameter.convertWithOffsets { startOffset, endOffset ->
irFactory.createValueParameter(
@@ -1058,7 +1060,7 @@ class Fir2IrDeclarationStorage(
return getIrCallableSymbol(
firConstructorSymbol,
getCachedIrDeclaration = ::getCachedIrConstructor,
createIrDeclaration = { parent, origin -> createIrConstructor(fir, parent as IrClass, origin = origin) },
createIrDeclaration = { parent, origin -> createIrConstructor(fir, parent as IrClass, predefinedOrigin = origin) },
createIrLazyDeclaration = { signature, lazyParent, declarationOrigin ->
val symbol = Fir2IrConstructorSymbol(signature)
val irConstructor = fir.convertWithOffsets { startOffset, endOffset ->
@@ -1085,13 +1087,13 @@ class Fir2IrDeclarationStorage(
val irParent = findIrParent(fir)
val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED
val declarationOrigin = computeDeclarationOrigin(firFunctionSymbol, parentOrigin)
createIrFunction(fir, irParent, origin = declarationOrigin).symbol
createIrFunction(fir, irParent, predefinedOrigin = declarationOrigin).symbol
}
is FirSimpleFunction -> {
return getIrCallableSymbol(
firFunctionSymbol,
getCachedIrDeclaration = ::getCachedIrFunction,
createIrDeclaration = { parent, origin -> createIrFunction(fir, parent, origin = origin) },
createIrDeclaration = { parent, origin -> createIrFunction(fir, parent, predefinedOrigin = origin) },
createIrLazyDeclaration = { signature, lazyParent, declarationOrigin ->
val symbol = Fir2IrSimpleFunctionSymbol(signature, fir.containerSource)
val irFunction = fir.convertWithOffsets { startOffset, endOffset ->
@@ -1130,7 +1132,7 @@ class Fir2IrDeclarationStorage(
return getIrCallableSymbol(
firPropertySymbol,
getCachedIrDeclaration = ::getCachedIrProperty,
createIrDeclaration = { parent, origin -> createIrProperty(fir, parent, origin = origin) },
createIrDeclaration = { parent, origin -> createIrProperty(fir, parent, predefinedOrigin = origin) },
createIrLazyDeclaration = { signature, lazyParent, declarationOrigin ->
val symbol = Fir2IrPropertySymbol(signature, fir.containerSource)
val irProperty = fir.convertWithOffsets { startOffset, endOffset ->
@@ -1212,6 +1214,7 @@ class Fir2IrDeclarationStorage(
(symbol.fir.origin is FirDeclarationOrigin.Enhancement || symbol.fir.origin is FirDeclarationOrigin.Java) -> {
IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
}
symbol.origin is FirDeclarationOrigin.Plugin -> IrPluginDeclarationOrigin((symbol.origin as FirDeclarationOrigin.Plugin).key)
else -> parentOrigin
}
@@ -1244,7 +1247,7 @@ class Fir2IrDeclarationStorage(
propertyCache[fir]?.let { return it.backingField!!.symbol }
val irParent = findIrParent(fir)
val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED
createIrProperty(fir, irParent, origin = parentOrigin).apply {
createIrProperty(fir, irParent, predefinedOrigin = parentOrigin).apply {
setAndModifyParent(irParent)
}.backingField!!.symbol
}
@@ -1270,7 +1273,7 @@ class Fir2IrDeclarationStorage(
classifierStorage.createIrEnumEntry(
firDeclaration,
irParent = irParentClass,
origin = if (containingFile != null) IrDeclarationOrigin.DEFINED else
predefinedOrigin = if (containingFile != null) IrDeclarationOrigin.DEFINED else
irParentClass?.origin ?: IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
).symbol
}
@@ -217,7 +217,7 @@ class Fir2IrVisitor(
override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?): IrElement {
val irFunction = if (simpleFunction.visibility == Visibilities.Local) {
declarationStorage.createIrFunction(
simpleFunction, irParent = conversionScope.parent(), origin = IrDeclarationOrigin.LOCAL_FUNCTION, isLocal = true
simpleFunction, irParent = conversionScope.parent(), predefinedOrigin = IrDeclarationOrigin.LOCAL_FUNCTION, isLocal = true
)
} else {
declarationStorage.getCachedIrFunction(simpleFunction)!!
@@ -236,7 +236,7 @@ class Fir2IrVisitor(
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: Any?): IrElement {
return anonymousFunction.convertWithOffsets { startOffset, endOffset ->
val irFunction = declarationStorage.createIrFunction(
anonymousFunction, irParent = conversionScope.parent(), origin = IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA, isLocal = true
anonymousFunction, irParent = conversionScope.parent(), predefinedOrigin = IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA, isLocal = true
)
conversionScope.withFunction(irFunction) {
memberGenerator.convertFunctionContent(irFunction, anonymousFunction, containingClass = null)
@@ -0,0 +1,15 @@
/*
* Copyright 2010-2021 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.declarations.FirPluginKey
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
class IrPluginDeclarationOrigin(val pluginKey: FirPluginKey) : IrDeclarationOrigin {
override fun toString(): String {
return "GENERATED[${pluginKey}]"
}
}
@@ -118,7 +118,7 @@ class DelegatedMemberGenerator(
): IrSimpleFunction {
val delegateFunction =
declarationStorage.createIrFunction(
delegateOverride, subClass, origin = IrDeclarationOrigin.DELEGATED_MEMBER,
delegateOverride, subClass, predefinedOrigin = IrDeclarationOrigin.DELEGATED_MEMBER,
containingClass = firSubClass.symbol.toLookupTag()
)
val baseSymbols = mutableListOf<FirNamedFunctionSymbol>()
@@ -188,7 +188,7 @@ class DelegatedMemberGenerator(
): IrProperty {
val delegateProperty =
declarationStorage.createIrProperty(
firDelegateProperty, subClass, origin = IrDeclarationOrigin.DELEGATED_MEMBER,
firDelegateProperty, subClass, predefinedOrigin = IrDeclarationOrigin.DELEGATED_MEMBER,
containingClass = firSubClass.symbol.toLookupTag()
)
// the overridden symbols should be collected only after all fake overrides for all superclases are created and bound to their
@@ -72,6 +72,17 @@ class UnderAnnotatedWith(annotations: Set<AnnotationFqn>) : Annotated(annotation
}
}
// annotation class AllOpen // from library
/*
@AllOpen
annotation class MyOpen
@MyOpen
class MyClass
*/
sealed class MetaAnnotated(final override val metaAnnotations: Set<AnnotationFqn>) : DeclarationPredicate() {
init {
require(metaAnnotations.isNotEmpty()) {
@@ -7,4 +7,8 @@ package org.jetbrains.kotlin.fir.plugin
import org.jetbrains.kotlin.fir.declarations.FirPluginKey
object AllOpenPluginKey : FirPluginKey()
object AllOpenPluginKey : FirPluginKey() {
override fun toString(): String {
return "AllOpenPlugin"
}
}
@@ -26,11 +26,11 @@ FILE fqName:<root> fileName:/classWithGeneratedMembersAndNestedClass.kt
overridden:
public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
FUN name:materialize visibility:public modality:FINAL <> ($this:<root>.Foo) returnType:<root>.Foo
FUN GENERATED[AllOpenMembersGeneratorKey] name:materialize visibility:public modality:FINAL <> ($this:<root>.Foo) returnType:<root>.Foo
$this: VALUE_PARAMETER name:<this> type:<root>.Foo
CLASS CLASS name:Nested modality:FINAL visibility:public superTypes:[kotlin.Any]
CLASS GENERATED[AllOpenMembersGeneratorKey] CLASS name:Nested modality:FINAL visibility:public superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Foo.Nested
CONSTRUCTOR visibility:public <> () returnType:<root>.Foo.Nested [primary]
CONSTRUCTOR GENERATED[AllOpenMembersGeneratorKey] visibility:public <> () returnType:<root>.Foo.Nested [primary]
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
@@ -64,11 +64,13 @@ FILE fqName:bar fileName:/generatedClassWithMembersAndNestedClasses.kt
$this: CALL 'public final fun materialize (): bar.Bar declared in foo.AllOpenGenerated.NestedBar' type=bar.Bar origin=null
$this: GET_VAR 'val nestedBar: foo.AllOpenGenerated.NestedBar [val] declared in bar.testNestedClasses' type=foo.AllOpenGenerated.NestedBar origin=null
FILE fqName:foo fileName:__GENERATED DECLARATIONS__.kt
CLASS CLASS name:AllOpenGenerated modality:FINAL visibility:public superTypes:[kotlin.Any]
CLASS GENERATED[AllOpenClassGeneratorKey] CLASS name:AllOpenGenerated modality:FINAL visibility:public superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:foo.AllOpenGenerated
CLASS CLASS name:NestedFoo modality:FINAL visibility:public superTypes:[kotlin.Any]
CONSTRUCTOR GENERATED[AllOpenClassGeneratorKey] visibility:public <> () returnType:foo.AllOpenGenerated [primary]
CLASS GENERATED[AllOpenClassGeneratorKey] CLASS name:NestedFoo modality:FINAL visibility:public superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:foo.AllOpenGenerated.NestedFoo
FUN name:materialize visibility:public modality:FINAL <> ($this:foo.AllOpenGenerated.NestedFoo) returnType:bar.Foo
CONSTRUCTOR GENERATED[AllOpenClassGeneratorKey] visibility:public <> () returnType:foo.AllOpenGenerated.NestedFoo [primary]
FUN GENERATED[AllOpenClassGeneratorKey] name:materialize visibility:public modality:FINAL <> ($this:foo.AllOpenGenerated.NestedFoo) returnType:bar.Foo
$this: VALUE_PARAMETER name:<this> type:foo.AllOpenGenerated.NestedFoo
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden:
@@ -83,9 +85,10 @@ FILE fqName:foo fileName:__GENERATED DECLARATIONS__.kt
overridden:
public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
CLASS CLASS name:NestedBar modality:FINAL visibility:public superTypes:[kotlin.Any]
CLASS GENERATED[AllOpenClassGeneratorKey] CLASS name:NestedBar modality:FINAL visibility:public superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:foo.AllOpenGenerated.NestedBar
FUN name:materialize visibility:public modality:FINAL <> ($this:foo.AllOpenGenerated.NestedBar) returnType:bar.Bar
CONSTRUCTOR GENERATED[AllOpenClassGeneratorKey] visibility:public <> () returnType:foo.AllOpenGenerated.NestedBar [primary]
FUN GENERATED[AllOpenClassGeneratorKey] name:materialize visibility:public modality:FINAL <> ($this:foo.AllOpenGenerated.NestedBar) returnType:bar.Bar
$this: VALUE_PARAMETER name:<this> type:foo.AllOpenGenerated.NestedBar
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden:
@@ -32,5 +32,5 @@ FILE fqName:foo fileName:/topLevelCallables.kt
VALUE_PARAMETER name:s index:0 type:kotlin.String
BLOCK_BODY
FILE fqName:foo fileName:__GENERATED DECLARATIONS__.kt
FUN name:dummyMySuperClass visibility:public modality:FINAL <> (value:foo.MySuperClass) returnType:kotlin.String
VALUE_PARAMETER name:value index:0 type:foo.MySuperClass
FUN GENERATED[AllOpenPlugin] name:dummyMySuperClass visibility:public modality:FINAL <> (value:foo.MySuperClass) returnType:kotlin.String
VALUE_PARAMETER GENERATED[AllOpenPlugin] name:value index:0 type:foo.MySuperClass