IR: IrSymbolVisitor

This commit is contained in:
Dmitry Petrov
2019-03-18 14:05:51 +03:00
parent 110a15d395
commit cd138bc022
2 changed files with 178 additions and 17 deletions
@@ -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 <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R
}
interface IrBindableSymbol<out D : DeclarationDescriptor, B : IrSymbolOwner> : IrSymbol {
@@ -35,43 +38,135 @@ interface IrBindableSymbol<out D : DeclarationDescriptor, B : IrSymbolOwner> : I
interface IrPackageFragmentSymbol : IrSymbol {
override val descriptor: PackageFragmentDescriptor
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitPackageFragmentSymbol(this, data)
}
interface IrFileSymbol : IrPackageFragmentSymbol, IrBindableSymbol<PackageFragmentDescriptor, IrFile>
interface IrExternalPackageFragmentSymbol : IrPackageFragmentSymbol, IrBindableSymbol<PackageFragmentDescriptor, IrExternalPackageFragment>
interface IrFileSymbol :
IrPackageFragmentSymbol, IrBindableSymbol<PackageFragmentDescriptor, IrFile> {
interface IrAnonymousInitializerSymbol : IrBindableSymbol<ClassDescriptor, IrAnonymousInitializer>
interface IrEnumEntrySymbol : IrBindableSymbol<ClassDescriptor, IrEnumEntry>
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitFileSymbol(this, data)
}
interface IrFieldSymbol : IrBindableSymbol<PropertyDescriptor, IrField>
interface IrExternalPackageFragmentSymbol :
IrPackageFragmentSymbol, IrBindableSymbol<PackageFragmentDescriptor, IrExternalPackageFragment> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitExternalPackageFragmentSymbol(this, data)
}
interface IrAnonymousInitializerSymbol :
IrBindableSymbol<ClassDescriptor, IrAnonymousInitializer> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitAnonymousInitializerSymbol(this, data)
}
interface IrEnumEntrySymbol :
IrBindableSymbol<ClassDescriptor, IrEnumEntry> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitEnumEntrySymbol(this, data)
}
interface IrFieldSymbol :
IrBindableSymbol<PropertyDescriptor, IrField> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitFieldSymbol(this, data)
}
interface IrClassifierSymbol :
IrSymbol {
interface IrClassifierSymbol : IrSymbol {
override val descriptor: ClassifierDescriptor
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitClassifierSymbol(this, data)
}
interface IrClassSymbol : IrClassifierSymbol, IrBindableSymbol<ClassDescriptor, IrClass>
interface IrTypeParameterSymbol : IrClassifierSymbol, IrBindableSymbol<TypeParameterDescriptor, IrTypeParameter>
interface IrClassSymbol :
IrClassifierSymbol, IrBindableSymbol<ClassDescriptor, IrClass> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitClassSymbol(this, data)
}
interface IrTypeParameterSymbol :
IrClassifierSymbol, IrBindableSymbol<TypeParameterDescriptor, IrTypeParameter> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitTypeParameterSymbol(this, data)
}
interface IrValueSymbol :
IrSymbol {
interface IrValueSymbol : IrSymbol {
override val descriptor: ValueDescriptor
override val owner: IrValueDeclaration
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitValueSymbol(this, data)
}
interface IrValueParameterSymbol : IrValueSymbol, IrBindableSymbol<ParameterDescriptor, IrValueParameter>
interface IrVariableSymbol : IrValueSymbol, IrBindableSymbol<VariableDescriptor, IrVariable>
interface IrValueParameterSymbol :
IrValueSymbol, IrBindableSymbol<ParameterDescriptor, IrValueParameter> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitValueParameterSymbol(this, data)
}
interface IrVariableSymbol :
IrValueSymbol, IrBindableSymbol<VariableDescriptor, IrVariable> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitVariableSymbol(this, data)
}
interface IrReturnTargetSymbol :
IrSymbol {
interface IrReturnTargetSymbol : IrSymbol {
override val descriptor: FunctionDescriptor
override val owner: IrReturnTarget
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitReturnTargetSymbol(this, data)
}
interface IrFunctionSymbol : IrReturnTargetSymbol {
interface IrFunctionSymbol :
IrReturnTargetSymbol {
override val owner: IrFunction
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitFunctionSymbol(this, data)
}
interface IrConstructorSymbol : IrFunctionSymbol, IrBindableSymbol<ClassConstructorDescriptor, IrConstructor>
interface IrSimpleFunctionSymbol : IrFunctionSymbol, IrBindableSymbol<FunctionDescriptor, IrSimpleFunction>
interface IrConstructorSymbol :
IrFunctionSymbol, IrBindableSymbol<ClassConstructorDescriptor, IrConstructor> {
interface IrReturnableBlockSymbol : IrReturnTargetSymbol, IrBindableSymbol<FunctionDescriptor, IrReturnableBlock>
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitConstructorSymbol(this, data)
}
interface IrSimpleFunctionSymbol :
IrFunctionSymbol, IrBindableSymbol<FunctionDescriptor, IrSimpleFunction> {
interface IrPropertySymbol : IrBindableSymbol<PropertyDescriptor, IrProperty>
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitSimpleFunctionSymbol(this, data)
}
interface IrReturnableBlockSymbol :
IrReturnTargetSymbol, IrBindableSymbol<FunctionDescriptor, IrReturnableBlock> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitReturnableBlockSymbol(this, data)
}
interface IrPropertySymbol :
IrBindableSymbol<PropertyDescriptor, IrProperty> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitPropertySymbol(this, data)
}
@@ -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<out R, in D> {
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)
}