[FIR2IR] Create special IrDeclarationOrigin for generated declarations
This commit is contained in:
committed by
TeamCityServer
parent
233b9f1242
commit
b3768a201f
@@ -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 {
|
||||
|
||||
+16
-13
@@ -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}]"
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -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
|
||||
|
||||
+11
@@ -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()) {
|
||||
|
||||
+5
-1
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
+8
-5
@@ -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:
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user