From 38a7f2bc070f90ada195388a9b9bd1119404690c Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 6 Oct 2023 14:53:49 +0300 Subject: [PATCH] [IR] Mark utilities, which use IrDeclarationContainer.declarations with @IrSymbolInternals Only those utilities are marked because only them are accessible in fir2ir. And in other modules it's allowed to access .declarations from anywhere --- .../kotlin/ir/util/AdditionalIrUtils.kt | 8 ++++++ .../org/jetbrains/kotlin/ir/util/IrUtils.kt | 26 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt index d672c2df867..f6a363cf38e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt @@ -185,6 +185,8 @@ val IrDeclaration.fileEntry: IrFileEntry } } +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals fun IrClass.companionObject(): IrClass? = this.declarations.singleOrNull { it is IrClass && it.isCompanion } as IrClass? @@ -282,6 +284,8 @@ class NaiveSourceBasedFileEntryImpl( } } +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals private fun IrClass.getPropertyDeclaration(name: String): IrProperty? { val properties = declarations.filterIsInstanceAnd { it.name.asString() == name } if (properties.size > 1) { @@ -296,10 +300,14 @@ private fun IrClass.getPropertyDeclaration(name: String): IrProperty? { fun IrClass.getSimpleFunction(name: String): IrSimpleFunctionSymbol? = findDeclaration { it.name.asString() == name }?.symbol +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals fun IrClass.getPropertyGetter(name: String): IrSimpleFunctionSymbol? = getPropertyDeclaration(name)?.getter?.symbol ?: getSimpleFunction("").also { assert(it?.owner?.correspondingPropertySymbol?.owner?.name?.asString() == name) } +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals fun IrClass.getPropertySetter(name: String): IrSimpleFunctionSymbol? = getPropertyDeclaration(name)?.setter?.symbol ?: getSimpleFunction("").also { assert(it?.owner?.correspondingPropertySymbol?.owner?.name?.asString() == name) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 84df38bb10e..3b0bb1e7863 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -225,39 +225,61 @@ val IrProperty.isSimpleProperty: Boolean (setterFun == null || setterFun.origin == IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR) } +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals val IrClass.functions: Sequence get() = declarations.asSequence().filterIsInstance() +// This declaration accesses IrBasedSymbol.owner, which is marked with this opt-in +@IrSymbolInternals val IrClass.superClass: IrClass? get() = superTypes .firstOrNull { !it.isInterface() && !it.isAny() } ?.classOrNull ?.owner +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals val IrClassSymbol.functions: Sequence get() = owner.functions.map { it.symbol } +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals val IrClass.constructors: Sequence get() = declarations.asSequence().filterIsInstance() +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals val IrClass.defaultConstructor: IrConstructor? get() = constructors.firstOrNull { ctor -> ctor.valueParameters.all { it.defaultValue != null } } +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals val IrClassSymbol.constructors: Sequence get() = owner.constructors.map { it.symbol } +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals val IrClass.fields: Sequence get() = declarations.asSequence().filterIsInstance() +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals val IrClassSymbol.fields: Sequence get() = owner.fields.map { it.symbol } +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals val IrClass.primaryConstructor: IrConstructor? get() = this.declarations.singleOrNull { it is IrConstructor && it.isPrimary } as IrConstructor? +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals val IrClass.invokeFun: IrSimpleFunction? get() = declarations.filterIsInstance().singleOrNull { it.name.asString() == "invoke" } +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals val IrDeclarationContainer.properties: Sequence get() = declarations.asSequence().filterIsInstance() @@ -447,6 +469,8 @@ fun IrFunction.isExternalOrInheritedFromExternal(): Boolean { return isEffectivelyExternal() || (this is IrSimpleFunction && isExternalOrInheritedFromExternalImpl(this)) } +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals inline fun IrDeclarationContainer.findDeclaration(predicate: (T) -> Boolean): T? = declarations.find { it is T && predicate(it) } as? T @@ -1169,6 +1193,8 @@ fun IrFunction.isMethodOfAny(): Boolean = else -> false } +// This declaration accesses IrDeclarationContainer.declarations, which is marked with this opt-in +@IrSymbolInternals fun IrDeclarationContainer.simpleFunctions() = declarations.flatMap { when (it) { is IrSimpleFunction -> listOf(it)