IR: isExpect

This commit is contained in:
Dmitry Petrov
2019-10-15 15:58:17 +03:00
parent 3a234d46ed
commit 6532f29cc6
22 changed files with 103 additions and 62 deletions
@@ -18,6 +18,7 @@ class IrClassBuilder : IrDeclarationBuilder() {
var isData: Boolean = false
var isExternal: Boolean = false
var isInline: Boolean = false
var isExpect: Boolean = false
fun updateFrom(from: IrClass) {
super.updateFrom(from)
@@ -29,5 +30,6 @@ class IrClassBuilder : IrDeclarationBuilder() {
isData = from.isData
isExternal = from.isExternal
isInline = from.isInline
isExpect = from.isExpect
}
}
@@ -22,6 +22,7 @@ class IrFunctionBuilder : IrDeclarationBuilder() {
var modality: Modality = Modality.FINAL
var isTailrec: Boolean = false
var isSuspend: Boolean = false
var isExpect: Boolean = false
var isPrimary: Boolean = false
@@ -30,6 +31,7 @@ class IrFunctionBuilder : IrDeclarationBuilder() {
isInline = from.isInline
isExternal = from.isExternal
isExpect = from.isExpect
if (from is IrSimpleFunction) {
modality = from.modality
@@ -15,4 +15,5 @@ class IrPropertyBuilder : IrDeclarationBuilder() {
var isLateinit: Boolean = false
var isDelegated: Boolean = false
var isExternal: Boolean = false
var isExpect: Boolean = false
}
@@ -38,6 +38,7 @@ interface IrClass :
val isData: Boolean
val isExternal: Boolean
val isInline: Boolean
val isExpect: Boolean
val superTypes: MutableList<IrType>
@@ -31,6 +31,8 @@ interface IrFunction :
val isInline: Boolean // NB: there's an inline constructor for Array and each primitive array class
val isExternal: Boolean
val isExpect: Boolean
var returnType: IrType
var dispatchReceiverParameter: IrValueParameter?
@@ -34,6 +34,7 @@ interface IrProperty :
val isLateinit: Boolean
val isDelegated: Boolean
val isExternal: Boolean
val isExpect: Boolean
var backingField: IrField?
var getter: IrSimpleFunction?
@@ -43,7 +43,8 @@ class IrClassImpl(
override val isInner: Boolean,
override val isData: Boolean,
override val isExternal: Boolean,
override val isInline: Boolean
override val isInline: Boolean,
override val isExpect: Boolean
) :
IrDeclarationBase(startOffset, endOffset, origin),
IrClass {
@@ -64,7 +65,8 @@ class IrClassImpl(
isInner = symbol.descriptor.isInner,
isData = symbol.descriptor.isData,
isExternal = symbol.descriptor.isEffectivelyExternal(),
isInline = symbol.descriptor.isInline
isInline = symbol.descriptor.isInline,
isExpect = symbol.descriptor.isExpect
)
init {
@@ -37,11 +37,14 @@ class IrConstructorImpl(
returnType: IrType,
isInline: Boolean,
isExternal: Boolean,
override val isPrimary: Boolean
override val isPrimary: Boolean,
isExpect: Boolean
) :
IrFunctionBase(
startOffset, endOffset, origin, name,
visibility, isInline, isExternal, returnType
visibility,
isInline, isExternal, isExpect,
returnType
),
IrConstructor {
@@ -57,9 +60,10 @@ class IrConstructorImpl(
symbol.descriptor.name,
symbol.descriptor.visibility,
returnType,
symbol.descriptor.isInline,
symbol.descriptor.isEffectivelyExternal(),
symbol.descriptor.isPrimary
isInline = symbol.descriptor.isInline,
isExternal = symbol.descriptor.isEffectivelyExternal(),
isPrimary = symbol.descriptor.isPrimary,
isExpect = symbol.descriptor.isExpect
) {
this.body = body
}
@@ -34,6 +34,7 @@ abstract class IrFunctionBase(
override var visibility: Visibility,
override val isInline: Boolean,
override val isExternal: Boolean,
override val isExpect: Boolean,
returnType: IrType
) :
IrDeclarationBase(startOffset, endOffset, origin),
@@ -31,9 +31,10 @@ class IrFunctionImpl(
isInline: Boolean,
isExternal: Boolean,
override val isTailrec: Boolean,
override val isSuspend: Boolean
override val isSuspend: Boolean,
isExpect: Boolean
) :
IrFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, returnType),
IrFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, isExpect, returnType),
IrSimpleFunction {
constructor(
@@ -50,10 +51,11 @@ class IrFunctionImpl(
visibility,
modality,
returnType,
symbol.descriptor.isInline,
symbol.descriptor.isExternal,
symbol.descriptor.isTailrec,
symbol.descriptor.isSuspend
isInline = symbol.descriptor.isInline,
isExternal = symbol.descriptor.isExternal,
isTailrec = symbol.descriptor.isTailrec,
isSuspend = symbol.descriptor.isSuspend,
isExpect = symbol.descriptor.isExpect
)
override val descriptor: FunctionDescriptor = symbol.descriptor
@@ -39,8 +39,9 @@ class IrPropertyImpl(
override val isVar: Boolean = symbol.descriptor.isVar,
override val isConst: Boolean = symbol.descriptor.isConst,
override val isLateinit: Boolean = symbol.descriptor.isLateInit,
@Suppress("DEPRECATION") override val isDelegated: Boolean = symbol.descriptor.isDelegated,
override val isExternal: Boolean = symbol.descriptor.isEffectivelyExternal()
override val isDelegated: Boolean = @Suppress("DEPRECATION") symbol.descriptor.isDelegated,
override val isExternal: Boolean = symbol.descriptor.isEffectivelyExternal(),
override val isExpect: Boolean = symbol.descriptor.isExpect
) : IrDeclarationBase(startOffset, endOffset, origin),
IrProperty {
@@ -34,6 +34,7 @@ class IrLazyClass(
override val isData: Boolean,
override val isExternal: Boolean,
override val isInline: Boolean,
override val isExpect: Boolean,
stubGenerator: DeclarationStubGenerator,
typeTranslator: TypeTranslator
) :
@@ -57,6 +58,7 @@ class IrLazyClass(
isData = symbol.descriptor.isData,
isExternal = symbol.descriptor.isEffectivelyExternal(),
isInline = symbol.descriptor.isInline,
isExpect = symbol.descriptor.isExpect,
stubGenerator = stubGenerator,
typeTranslator = TypeTranslator
)
@@ -28,12 +28,13 @@ class IrLazyConstructor(
isInline: Boolean,
isExternal: Boolean,
override val isPrimary: Boolean,
isExpect: Boolean,
stubGenerator: DeclarationStubGenerator,
typeTranslator: TypeTranslator
) :
IrLazyFunctionBase(
startOffset, endOffset, origin, name,
visibility, isInline, isExternal,
visibility, isInline, isExternal, isExpect,
stubGenerator, typeTranslator
),
IrConstructor {
@@ -49,11 +50,12 @@ class IrLazyConstructor(
startOffset, endOffset, origin, symbol,
symbol.descriptor.name,
symbol.descriptor.visibility,
symbol.descriptor.isInline,
symbol.descriptor.isEffectivelyExternal(),
symbol.descriptor.isPrimary,
stubGenerator,
TypeTranslator
isInline = symbol.descriptor.isInline,
isExternal = symbol.descriptor.isEffectivelyExternal(),
isPrimary = symbol.descriptor.isPrimary,
isExpect = symbol.descriptor.isExpect,
stubGenerator = stubGenerator,
typeTranslator = TypeTranslator
)
override val typeParameters: MutableList<IrTypeParameter> by lazy {
@@ -33,10 +33,11 @@ class IrLazyFunction(
isExternal: Boolean,
override val isTailrec: Boolean,
override val isSuspend: Boolean,
isExpect: Boolean,
stubGenerator: DeclarationStubGenerator,
typeTranslator: TypeTranslator
) :
IrLazyFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, stubGenerator, typeTranslator),
IrLazyFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, isExpect, stubGenerator, typeTranslator),
IrSimpleFunction {
constructor(
@@ -51,12 +52,13 @@ class IrLazyFunction(
symbol.descriptor.name,
symbol.descriptor.visibility,
symbol.descriptor.modality,
symbol.descriptor.isInline,
symbol.descriptor.isExternal,
symbol.descriptor.isTailrec,
symbol.descriptor.isSuspend,
stubGenerator,
TypeTranslator
isInline = symbol.descriptor.isInline,
isExternal = symbol.descriptor.isExternal,
isTailrec = symbol.descriptor.isTailrec,
isSuspend = symbol.descriptor.isSuspend,
isExpect = symbol.descriptor.isExpect,
stubGenerator = stubGenerator,
typeTranslator = TypeTranslator
)
override val descriptor: FunctionDescriptor = symbol.descriptor
@@ -65,13 +67,13 @@ class IrLazyFunction(
typeTranslator.buildWithScope(this) {
stubGenerator.symbolTable.withScope(descriptor) {
val propertyIfAccessor = descriptor.propertyIfAccessor
propertyIfAccessor.typeParameters.mapTo(arrayListOf()) {
propertyIfAccessor.typeParameters.mapTo(arrayListOf()) { typeParameterDescriptor ->
if (descriptor != propertyIfAccessor) {
stubGenerator.generateOrGetScopedTypeParameterStub(it).also {
it.parent = this@IrLazyFunction
stubGenerator.generateOrGetScopedTypeParameterStub(typeParameterDescriptor).also { irTypeParameter ->
irTypeParameter.parent = this@IrLazyFunction
}
} else {
stubGenerator.generateOrGetTypeParameterStub(it)
stubGenerator.generateOrGetTypeParameterStub(typeParameterDescriptor)
}
}
}
@@ -26,6 +26,7 @@ abstract class IrLazyFunctionBase(
override var visibility: Visibility,
override val isInline: Boolean,
override val isExternal: Boolean,
override val isExpect: Boolean,
stubGenerator: DeclarationStubGenerator,
typeTranslator: TypeTranslator
) :
@@ -35,6 +35,7 @@ class IrLazyProperty(
override val isLateinit: Boolean,
override val isDelegated: Boolean,
override val isExternal: Boolean,
override val isExpect: Boolean,
stubGenerator: DeclarationStubGenerator,
typeTranslator: TypeTranslator,
private val bindingContext: BindingContext? = null
@@ -59,6 +60,7 @@ class IrLazyProperty(
isLateinit = symbol.descriptor.isLateInit,
isDelegated = @Suppress("DEPRECATION") symbol.descriptor.isDelegated,
isExternal = symbol.descriptor.isEffectivelyExternal(),
isExpect = symbol.descriptor.isExpect,
stubGenerator = stubGenerator,
typeTranslator = typeTranslator,
bindingContext = bindingContext
@@ -144,7 +144,8 @@ open class DeepCopyIrTreeWithSymbols(
declaration.isInner,
declaration.isData,
declaration.isExternal,
declaration.isInline
declaration.isInline,
declaration.isExpect
).apply {
transformAnnotations(declaration)
copyTypeParametersFrom(declaration)
@@ -164,10 +165,11 @@ open class DeepCopyIrTreeWithSymbols(
declaration.visibility,
declaration.modality,
declaration.returnType,
declaration.isInline,
declaration.isExternal,
declaration.isTailrec,
declaration.isSuspend
isInline = declaration.isInline,
isExternal = declaration.isExternal,
isTailrec = declaration.isTailrec,
isSuspend = declaration.isSuspend,
isExpect = declaration.isExpect
).apply {
declaration.overriddenSymbols.mapTo(overriddenSymbols) {
symbolRemapper.getReferencedFunction(it) as IrSimpleFunctionSymbol
@@ -183,9 +185,10 @@ open class DeepCopyIrTreeWithSymbols(
declaration.name,
declaration.visibility,
declaration.returnType,
declaration.isInline,
declaration.isExternal,
declaration.isPrimary
isInline = declaration.isInline,
isExternal = declaration.isExternal,
isPrimary = declaration.isPrimary,
isExpect = declaration.isExpect
).apply {
transformFunctionChildren(declaration)
}
@@ -215,11 +218,12 @@ open class DeepCopyIrTreeWithSymbols(
declaration.name,
declaration.visibility,
declaration.modality,
declaration.isVar,
declaration.isConst,
declaration.isLateinit,
declaration.isDelegated,
declaration.isExternal
isVar = declaration.isVar,
isConst = declaration.isConst,
isLateinit = declaration.isLateinit,
isDelegated = declaration.isDelegated,
isExpect = declaration.isExpect,
isExternal = declaration.isExternal
).apply {
transformAnnotations(declaration)
this.backingField = declaration.backingField?.transform()
@@ -370,7 +370,8 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
"tailrec".takeIf { isTailrec },
"inline".takeIf { isInline },
"external".takeIf { isExternal },
"suspend".takeIf { isSuspend }
"suspend".takeIf { isSuspend },
"expect".takeIf { isExpect }
)
private fun IrFunction.renderTypeParameters(): String =
@@ -397,7 +398,8 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
renderFlagsList(
"inline".takeIf { isInline },
"external".takeIf { isExternal },
"primary".takeIf { isPrimary }
"primary".takeIf { isPrimary },
"expect".takeIf { isExpect }
)
override fun visitProperty(declaration: IrProperty, data: Nothing?): String =
@@ -413,6 +415,7 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
"const".takeIf { isConst },
"lateinit".takeIf { isLateinit },
"delegated".takeIf { isDelegated },
"expect".takeIf { isExpect },
if (isVar) "var" else "val"
)
@@ -443,7 +446,8 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
"inner".takeIf { isInner },
"data".takeIf { isData },
"external".takeIf { isExternal },
"inline".takeIf { isInline }
"inline".takeIf { isInline },
"expect".takeIf { isExpect }
)
override fun visitVariable(declaration: IrVariable, data: Nothing?): String =