From cd138bc0220a76116be4e1005f0999656af497d7 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 18 Mar 2019 14:05:51 +0300 Subject: [PATCH] IR: IrSymbolVisitor --- .../jetbrains/kotlin/ir/symbols/IrSymbol.kt | 129 +++++++++++++++--- .../kotlin/ir/util/IrSymbolVisitor.kt | 66 +++++++++ 2 files changed, 178 insertions(+), 17 deletions(-) create mode 100644 compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrSymbolVisitor.kt diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt index 1494ccd53a8..d7ab1e0428b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt @@ -19,11 +19,14 @@ package org.jetbrains.kotlin.ir.symbols import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrReturnableBlock +import org.jetbrains.kotlin.ir.util.IrSymbolVisitor interface IrSymbol { val owner: IrSymbolOwner val descriptor: DeclarationDescriptor val isBound: Boolean + + fun accept(visitor: IrSymbolVisitor, data: D): R } interface IrBindableSymbol : IrSymbol { @@ -35,43 +38,135 @@ interface IrBindableSymbol : I interface IrPackageFragmentSymbol : IrSymbol { override val descriptor: PackageFragmentDescriptor + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitPackageFragmentSymbol(this, data) } -interface IrFileSymbol : IrPackageFragmentSymbol, IrBindableSymbol -interface IrExternalPackageFragmentSymbol : IrPackageFragmentSymbol, IrBindableSymbol +interface IrFileSymbol : + IrPackageFragmentSymbol, IrBindableSymbol { -interface IrAnonymousInitializerSymbol : IrBindableSymbol -interface IrEnumEntrySymbol : IrBindableSymbol + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitFileSymbol(this, data) +} -interface IrFieldSymbol : IrBindableSymbol +interface IrExternalPackageFragmentSymbol : + IrPackageFragmentSymbol, IrBindableSymbol { + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitExternalPackageFragmentSymbol(this, data) +} + +interface IrAnonymousInitializerSymbol : + IrBindableSymbol { + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitAnonymousInitializerSymbol(this, data) +} + +interface IrEnumEntrySymbol : + IrBindableSymbol { + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitEnumEntrySymbol(this, data) +} + +interface IrFieldSymbol : + IrBindableSymbol { + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitFieldSymbol(this, data) +} + +interface IrClassifierSymbol : + IrSymbol { -interface IrClassifierSymbol : IrSymbol { override val descriptor: ClassifierDescriptor + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitClassifierSymbol(this, data) } -interface IrClassSymbol : IrClassifierSymbol, IrBindableSymbol -interface IrTypeParameterSymbol : IrClassifierSymbol, IrBindableSymbol +interface IrClassSymbol : + IrClassifierSymbol, IrBindableSymbol { + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitClassSymbol(this, data) +} + +interface IrTypeParameterSymbol : + IrClassifierSymbol, IrBindableSymbol { + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitTypeParameterSymbol(this, data) +} + +interface IrValueSymbol : + IrSymbol { -interface IrValueSymbol : IrSymbol { override val descriptor: ValueDescriptor override val owner: IrValueDeclaration + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitValueSymbol(this, data) } -interface IrValueParameterSymbol : IrValueSymbol, IrBindableSymbol -interface IrVariableSymbol : IrValueSymbol, IrBindableSymbol +interface IrValueParameterSymbol : + IrValueSymbol, IrBindableSymbol { + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitValueParameterSymbol(this, data) +} + +interface IrVariableSymbol : + IrValueSymbol, IrBindableSymbol { + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitVariableSymbol(this, data) +} + +interface IrReturnTargetSymbol : + IrSymbol { -interface IrReturnTargetSymbol : IrSymbol { override val descriptor: FunctionDescriptor override val owner: IrReturnTarget + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitReturnTargetSymbol(this, data) } -interface IrFunctionSymbol : IrReturnTargetSymbol { +interface IrFunctionSymbol : + IrReturnTargetSymbol { + override val owner: IrFunction + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitFunctionSymbol(this, data) } -interface IrConstructorSymbol : IrFunctionSymbol, IrBindableSymbol -interface IrSimpleFunctionSymbol : IrFunctionSymbol, IrBindableSymbol +interface IrConstructorSymbol : + IrFunctionSymbol, IrBindableSymbol { -interface IrReturnableBlockSymbol : IrReturnTargetSymbol, IrBindableSymbol + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitConstructorSymbol(this, data) +} +interface IrSimpleFunctionSymbol : + IrFunctionSymbol, IrBindableSymbol { -interface IrPropertySymbol : IrBindableSymbol \ No newline at end of file + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitSimpleFunctionSymbol(this, data) +} + +interface IrReturnableBlockSymbol : + IrReturnTargetSymbol, IrBindableSymbol { + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitReturnableBlockSymbol(this, data) +} + +interface IrPropertySymbol : + IrBindableSymbol { + + override fun accept(visitor: IrSymbolVisitor, data: D): R = + visitor.visitPropertySymbol(this, data) +} \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrSymbolVisitor.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrSymbolVisitor.kt new file mode 100644 index 00000000000..2e5ea9d8eae --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrSymbolVisitor.kt @@ -0,0 +1,66 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. 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.ir.util + +import org.jetbrains.kotlin.ir.symbols.* + +interface IrSymbolVisitor { + fun visitSymbol(symbol: IrSymbol, data: D): R + + fun visitPackageFragmentSymbol(symbol: IrPackageFragmentSymbol, data: D) = + visitSymbol(symbol, data) + + fun visitFileSymbol(symbol: IrFileSymbol, data: D) = + visitPackageFragmentSymbol(symbol, data) + + fun visitExternalPackageFragmentSymbol(symbol: IrExternalPackageFragmentSymbol, data: D) = + visitPackageFragmentSymbol(symbol, data) + + fun visitClassifierSymbol(symbol: IrClassifierSymbol, data: D) = + visitSymbol(symbol, data) + + fun visitClassSymbol(symbol: IrClassSymbol, data: D) = + visitClassifierSymbol(symbol, data) + + fun visitTypeParameterSymbol(symbol: IrTypeParameterSymbol, data: D) = + visitClassifierSymbol(symbol, data) + + fun visitValueSymbol(symbol: IrValueSymbol, data: D) = + visitSymbol(symbol, data) + + fun visitVariableSymbol(symbol: IrVariableSymbol, data: D) = + visitValueSymbol(symbol, data) + + fun visitValueParameterSymbol(symbol: IrValueParameterSymbol, data: D) = + visitValueSymbol(symbol, data) + + fun visitReturnTargetSymbol(symbol: IrReturnTargetSymbol, data: D) = + visitSymbol(symbol, data) + + fun visitFunctionSymbol(symbol: IrFunctionSymbol, data: D) = + visitReturnTargetSymbol(symbol, data) + + fun visitSimpleFunctionSymbol(symbol: IrSimpleFunctionSymbol, data: D) = + visitFunctionSymbol(symbol, data) + + fun visitConstructorSymbol(symbol: IrConstructorSymbol, data: D) = + visitFunctionSymbol(symbol, data) + + fun visitReturnableBlockSymbol(symbol: IrReturnableBlockSymbol, data: D) = + visitReturnTargetSymbol(symbol, data) + + fun visitAnonymousInitializerSymbol(symbol: IrAnonymousInitializerSymbol, data: D) = + visitSymbol(symbol, data) + + fun visitEnumEntrySymbol(symbol: IrEnumEntrySymbol, data: D) = + visitSymbol(symbol, data) + + fun visitFieldSymbol(symbol: IrFieldSymbol, data: D) = + visitSymbol(symbol, data) + + fun visitPropertySymbol(symbol: IrPropertySymbol, data: D) = + visitSymbol(symbol, data) +} \ No newline at end of file