IR: {IrClass, IrFunction, IrProperty, IrField}.isExternal

This commit is contained in:
Dmitry Petrov
2018-05-04 18:23:44 +03:00
parent 9717345e3b
commit a6057fb499
23 changed files with 144 additions and 98 deletions
@@ -35,6 +35,7 @@ interface IrClass : IrSymbolDeclaration<IrClassSymbol>, IrDeclarationContainer,
val modality: Modality
val isCompanion: Boolean
val isData: Boolean
val isExternal: Boolean
// NB type parameters can't be top-level classifiers in supetypes of a class
val superClasses: MutableList<IrClassSymbol>
@@ -22,5 +22,7 @@ interface IrField : IrSymbolDeclaration<IrFieldSymbol> {
val type: KotlinType
val visibility: Visibility
val isFinal: Boolean
val isExternal: Boolean
var initializer: IrExpressionBody?
}
@@ -30,6 +30,7 @@ interface IrFunction : IrDeclaration, IrTypeParametersContainer, IrSymbolOwner,
val visibility: Visibility
val isInline: Boolean // NB: there's an inline constructor for Array and each primitive array class
val isExternal: Boolean
val returnType: KotlinType
var dispatchReceiverParameter: IrValueParameter?
@@ -33,6 +33,7 @@ interface IrProperty : IrDeclaration {
val isConst: Boolean
val isLateinit: Boolean
val isDelegated: Boolean
val isExternal: Boolean
val typeParameters: MutableList<IrTypeParameter>
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.ir.util.transform
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.utils.SmartList
class IrClassImpl(
@@ -39,7 +40,8 @@ class IrClassImpl(
override val visibility: Visibility,
override val modality: Modality,
override val isCompanion: Boolean,
override val isData: Boolean
override val isData: Boolean,
override val isExternal: Boolean
) : IrDeclarationBase(startOffset, endOffset, origin),
IrClass {
@@ -48,7 +50,8 @@ class IrClassImpl(
startOffset, endOffset, origin, symbol,
symbol.descriptor.name, symbol.descriptor.kind,
symbol.descriptor.visibility, symbol.descriptor.modality,
symbol.descriptor.isCompanionObject, symbol.descriptor.isData
symbol.descriptor.isCompanionObject, symbol.descriptor.isData,
symbol.descriptor.isEffectivelyExternal()
)
constructor(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: ClassDescriptor) :
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.types.KotlinType
class IrConstructorImpl(
@@ -33,9 +34,10 @@ class IrConstructorImpl(
override val symbol: IrConstructorSymbol,
visibility: Visibility,
returnType: KotlinType,
isInline: Boolean
isInline: Boolean,
isExternal: Boolean
) :
IrFunctionBase(startOffset, endOffset, origin, visibility, isInline, returnType),
IrFunctionBase(startOffset, endOffset, origin, visibility, isInline, isExternal, returnType),
IrConstructor {
constructor(
@@ -48,7 +50,8 @@ class IrConstructorImpl(
startOffset, endOffset, origin, symbol,
symbol.descriptor.visibility,
symbol.descriptor.returnType,
symbol.descriptor.isInline
symbol.descriptor.isInline,
symbol.descriptor.isEffectivelyExternal()
) {
this.body = body
}
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.types.KotlinType
@@ -38,20 +39,16 @@ class IrFieldImpl(
override val name: Name,
override val type: KotlinType,
override val visibility: Visibility,
override val isFinal: Boolean
override val isFinal: Boolean,
override val isExternal: Boolean
) : IrDeclarationBase(startOffset, endOffset, origin), IrField {
constructor(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, symbol: IrFieldSymbol, isFinal: Boolean) :
this(
startOffset, endOffset, origin, symbol,
symbol.descriptor.name, symbol.descriptor.type, symbol.descriptor.visibility,
isFinal
)
constructor(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, symbol: IrFieldSymbol) :
this(
startOffset, endOffset, origin, symbol,
symbol.descriptor.modality == Modality.FINAL
symbol.descriptor.name, symbol.descriptor.type, symbol.descriptor.visibility,
symbol.descriptor.modality == Modality.FINAL,
symbol.descriptor.isEffectivelyExternal()
)
constructor(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: PropertyDescriptor) :
@@ -34,6 +34,7 @@ abstract class IrFunctionBase(
origin: IrDeclarationOrigin,
override val visibility: Visibility,
override val isInline: Boolean,
override val isExternal: Boolean,
override val returnType: KotlinType
) : IrDeclarationBase(startOffset, endOffset, origin), IrFunction {
override val typeParameters: MutableList<IrTypeParameter> = SmartList()
@@ -39,10 +39,11 @@ class IrFunctionImpl(
override val modality: Modality,
returnType: KotlinType,
isInline: Boolean,
isExternal: Boolean,
override val isTailrec: Boolean,
override val isSuspend: Boolean
) :
IrFunctionBase(startOffset, endOffset, origin, visibility, isInline, returnType),
IrFunctionBase(startOffset, endOffset, origin, visibility, isInline, isExternal, returnType),
IrSimpleFunction {
constructor(
@@ -57,6 +58,7 @@ class IrFunctionImpl(
symbol.descriptor.modality,
symbol.descriptor.returnType!!,
symbol.descriptor.isInline,
symbol.descriptor.isExternal,
symbol.descriptor.isTailrec,
symbol.descriptor.isSuspend
)
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.ir.util.transform
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.utils.SmartList
@@ -39,7 +40,8 @@ class IrPropertyImpl(
override val isVar: Boolean,
override val isConst: Boolean,
override val isLateinit: Boolean,
override val isDelegated: Boolean
override val isDelegated: Boolean,
override val isExternal: Boolean
) : IrDeclarationBase(startOffset, endOffset, origin),
IrProperty {
@@ -52,25 +54,40 @@ class IrPropertyImpl(
) : this(
startOffset, endOffset, origin, descriptor,
descriptor.name, descriptor.type, descriptor.visibility, descriptor.modality,
descriptor.isVar, descriptor.isConst, descriptor.isLateInit,
isDelegated
isVar = descriptor.isVar,
isConst = descriptor.isConst,
isLateinit = descriptor.isLateInit,
isDelegated = isDelegated,
isExternal = descriptor.isEffectivelyExternal()
)
constructor(
startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin,
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
descriptor: PropertyDescriptor
) : this(startOffset, endOffset, origin, descriptor.isDelegated, descriptor)
constructor(
startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, isDelegated: Boolean, descriptor: PropertyDescriptor,
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
isDelegated: Boolean,
descriptor: PropertyDescriptor,
backingField: IrField?
) : this(startOffset, endOffset, origin, isDelegated, descriptor) {
this.backingField = backingField
}
constructor(
startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, isDelegated: Boolean, descriptor: PropertyDescriptor,
backingField: IrField?, getter: IrFunction?, setter: IrFunction?
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
isDelegated: Boolean,
descriptor: PropertyDescriptor,
backingField: IrField?,
getter: IrFunction?,
setter: IrFunction?
) : this(startOffset, endOffset, origin, isDelegated, descriptor, backingField) {
this.getter = getter
this.setter = setter
@@ -60,12 +60,16 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
"flags:${renderSimpleFunctionFlags()}"
}
private fun renderFlagsList(vararg flags: String?) =
flags.filterNotNull().joinToString(separator = ",")
private fun IrSimpleFunction.renderSimpleFunctionFlags(): String =
listOfNotNull(
renderFlagsList(
"tailrec".takeIf { isTailrec },
"inline".takeIf { isInline },
"external".takeIf { isExternal },
"suspend".takeIf { isSuspend }
).joinToString(separator = ",")
)
private fun IrFunction.renderTypeParameters(): String =
typeParameters.joinToString(separator = ", ", prefix = "<", postfix = ">") { it.name.toString() }
@@ -84,9 +88,15 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
renderTypeParameters() + " " +
renderValueParameterTypes() + " " +
"returnType:${returnType.render()} " +
"flags:${if (isInline) "inline" else ""}"
"flags:${renderConstructorFlags()}"
}
private fun IrConstructor.renderConstructorFlags() =
renderFlagsList(
"inline".takeIf { isInline },
"external".takeIf { isExternal }
)
override fun visitProperty(declaration: IrProperty, data: Nothing?): String =
declaration.run {
"PROPERTY ${renderOriginIfNonTrivial()}" +
@@ -95,12 +105,13 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
}
private fun IrProperty.renderPropertyFlags() =
listOfNotNull(
renderFlagsList(
"external".takeIf { isExternal },
"const".takeIf { isConst },
"lateinit".takeIf { isLateinit },
"delegated".takeIf { isDelegated },
if (isVar) "var" else "val"
).joinToString(separator = "m")
)
override fun visitField(declaration: IrField, data: Nothing?): String =
"FIELD ${declaration.renderOriginIfNonTrivial()}" +
@@ -108,7 +119,10 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
"flags:${declaration.renderFieldFlags()}"
private fun IrField.renderFieldFlags() =
if (isFinal) "final" else ""
renderFlagsList(
"final".takeIf { isFinal },
"external".takeIf { isExternal }
)
override fun visitClass(declaration: IrClass, data: Nothing?): String =
declaration.run {
@@ -118,7 +132,11 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
}
private fun IrClass.renderClassFlags() =
listOfNotNull("companion".takeIf { isCompanion }, "data".takeIf { isData }).joinToString(separator = ",")
renderFlagsList(
"companion".takeIf { isCompanion },
"data".takeIf { isData },
"external".takeIf { isExternal }
)
override fun visitTypeAlias(declaration: IrTypeAlias, data: Nothing?): String =
"TYPEALIAS ${declaration.renderOriginIfNonTrivial()}${declaration.descriptor.ref()} type=${declaration.descriptor.underlyingType.render()}"
@@ -128,11 +146,11 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
"name:${declaration.name} type:${declaration.type.render()} flags:${declaration.renderVariableFlags()}"
private fun IrVariable.renderVariableFlags(): String =
listOfNotNull(
renderFlagsList(
"const".takeIf { isConst },
"lateinit".takeIf { isLateinit },
if (isVar) "var" else "val"
).joinToString(separator = " ")
)
override fun visitEnumEntry(declaration: IrEnumEntry, data: Nothing?): String =
"ENUM_ENTRY ${declaration.renderOriginIfNonTrivial()}name:${declaration.name}"
@@ -158,11 +176,11 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
}
private fun IrValueParameter.renderValueParameterFlags(): String =
listOfNotNull(
renderFlagsList(
"vararg".takeIf { varargElementType != null },
"crossinline".takeIf { isCrossinline },
"noinline".takeIf { isNoinline }
).joinToString(separator = ",")
)
override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty, data: Nothing?): String =
declaration.run {