IR: add IrSimpleFunction.isInfix

This commit is contained in:
Georgy Bronnikov
2020-07-14 20:59:58 +03:00
parent 8e4bc06b3c
commit c901e82a55
28 changed files with 60 additions and 32 deletions
@@ -490,6 +490,7 @@ fun IrClass.addFakeOverridesViaIncorrectHeuristic(implementedMembers: List<IrSim
isTailrec = irFunction.isTailrec
isSuspend = irFunction.isSuspend
isOperator = irFunction.isOperator
isInfix = irFunction.isInfix
isExpect = irFunction.isExpect
isFakeOverride = true
}.apply {
@@ -540,7 +541,8 @@ fun createStaticFunctionWithReceivers(
isSuspend = oldFunction.isSuspend,
isExpect = oldFunction.isExpect,
isFakeOverride = isFakeOverride,
isOperator = oldFunction is IrSimpleFunction && oldFunction.isOperator
isOperator = oldFunction is IrSimpleFunction && oldFunction.isOperator,
isInfix = oldFunction is IrSimpleFunction && oldFunction.isInfix
).apply {
descriptor.bind(this)
parent = irParent
@@ -136,7 +136,7 @@ internal fun IrFunctionBuilder.buildFunction(originalDescriptor: FunctionDescrip
startOffset, endOffset, origin,
IrSimpleFunctionSymbolImpl(wrappedDescriptor),
name, visibility, modality, returnType,
isInline, isExternal, isTailrec, isSuspend, isOperator, isExpect, isFakeOverride
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride
).also {
wrappedDescriptor.bind(it)
}
@@ -99,6 +99,7 @@ object JsIrBuilder {
isSuspend: Boolean = false,
isExpect: Boolean = false,
isOperator: Boolean = false,
isInfix: Boolean = false,
isFakeOverride: Boolean = false,
origin: IrDeclarationOrigin = SYNTHESIZED_DECLARATION
): IrSimpleFunction = buildFun {
@@ -112,6 +113,7 @@ object JsIrBuilder {
this.isTailrec = isTailrec
this.isSuspend = isSuspend
this.isOperator = isOperator
this.isInfix = isInfix
this.isExpect = isExpect
this.isFakeOverride = isFakeOverride
}.also {
@@ -264,6 +264,7 @@ class JvmDeclarationFactory(
isTailrec = false
isSuspend = fakeOverride.isSuspend
isOperator = fakeOverride.isOperator
isInfix = fakeOverride.isInfix
isExpect = false
isFakeOverride = false
}.apply {
@@ -401,7 +401,7 @@ private fun StatementGenerator.createFunctionForSuspendConversion(
irSuspendFunReturnType,
isInline = false, isExternal = false, isTailrec = false,
isSuspend = true,
isOperator = false, isExpect = false, isFakeOverride = false
isOperator = false, isInfix = false, isExpect = false, isFakeOverride = false
)
}
adapterFunctionDescriptor.bind(irAdapterFun)
@@ -358,6 +358,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
isTailrec = false,
isSuspend = adapteeDescriptor.isSuspend || hasSuspendConversion,
isOperator = adapteeDescriptor.isOperator, // TODO ?
isInfix = adapteeDescriptor.isInfix,
isExpect = false,
isFakeOverride = false
).also { irAdapterFun ->
@@ -184,7 +184,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
val irFunction = with(descriptor) {
IrFunctionImpl(
startOffset, endOffset, origin, symbol, name, visibility, modality, IrUninitializedType,
isInline, isExternal, isTailrec, isSuspend, isOperator, isExpect
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect
)
}
irFunction.metadata = MetadataSource.Function(descriptor)
@@ -24,6 +24,7 @@ class IrFunctionBuilder : IrDeclarationBuilder() {
var isSuspend: Boolean = false
var isExpect: Boolean = false
var isOperator: Boolean = false
var isInfix: Boolean = false
var isPrimary: Boolean = false
@@ -41,12 +42,14 @@ class IrFunctionBuilder : IrDeclarationBuilder() {
isTailrec = from.isTailrec
isSuspend = from.isSuspend
isOperator = from.isOperator
isInfix = from.isInfix
isFakeOverride = from.isFakeOverride
} else {
modality = Modality.FINAL
isTailrec = false
isSuspend = false
isOperator = false
isInfix = false
}
if (from is IrConstructor) {
@@ -19,6 +19,7 @@ interface IrSimpleFunction :
val isSuspend: Boolean
val isFakeOverride: Boolean
val isOperator: Boolean
val isInfix: Boolean
var correspondingPropertySymbol: IrPropertySymbol?
}
@@ -33,6 +33,7 @@ abstract class IrFunctionCommonImpl(
override val isTailrec: Boolean,
override val isSuspend: Boolean,
override val isOperator: Boolean,
override val isInfix: Boolean,
isExpect: Boolean,
override val isFakeOverride: Boolean
) :
@@ -91,10 +92,11 @@ class IrFunctionImpl(
override val isTailrec: Boolean,
override val isSuspend: Boolean,
override val isOperator: Boolean,
isInfix: Boolean,
isExpect: Boolean,
override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE
) : IrFunctionCommonImpl(startOffset, endOffset, origin, name, visibility, modality, returnType, isInline,
isExternal, isTailrec, isSuspend, isOperator, isExpect, isFakeOverride) {
isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride) {
@ObsoleteDescriptorBasedAPI
override val descriptor: FunctionDescriptor get() = symbol.descriptor
@@ -120,9 +122,10 @@ class IrFakeOverrideFunctionImpl(
isTailrec: Boolean,
isSuspend: Boolean,
isOperator: Boolean,
isInfix: Boolean,
isExpect: Boolean
) : IrFunctionCommonImpl(startOffset, endOffset, origin, name, visibility, modality, returnType, isInline,
isExternal, isTailrec, isSuspend, isOperator, isExpect,
isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect,
isFakeOverride = true)
{
private var _symbol: IrSimpleFunctionSymbol? = null
@@ -36,6 +36,7 @@ class IrLazyFunction(
isExpect: Boolean,
override val isFakeOverride: Boolean,
override val isOperator: Boolean,
override val isInfix: Boolean,
stubGenerator: DeclarationStubGenerator,
typeTranslator: TypeTranslator
) :
@@ -70,8 +70,8 @@ class IrBuiltIns(
val symbol = symbolTable.declareSimpleFunctionIfNotExists(operatorDescriptor) {
val operator = IrFunctionImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, BUILTIN_OPERATOR, it, Name.identifier(name), Visibilities.PUBLIC, Modality.FINAL,
returnType, isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isOperator = false,
isExpect = false, isFakeOverride = false
returnType, isInline = false, isExternal = false, isTailrec = false, isSuspend = false,
isOperator = false, isInfix = false, isExpect = false, isFakeOverride = false
)
operator.parent = packageFragment
packageFragment.declarations += operator
@@ -156,8 +156,8 @@ class IrBuiltIns(
return symbolTable.declareSimpleFunctionIfNotExists(operatorDescriptor) {
val operator = IrFunctionImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, BUILTIN_OPERATOR, it, name, Visibilities.PUBLIC, Modality.FINAL, returnIrType,
isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isOperator = false, isExpect = false,
isFakeOverride = false
isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isOperator = false, isInfix = false,
isExpect = false, isFakeOverride = false
)
operator.parent = packageFragment
packageFragment.declarations += operator
@@ -304,6 +304,7 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa
isTailrec = false,
isSuspend = isSuspend,
isOperator = true,
isInfix = false,
isExpect = false,
isFakeOverride = false
)
@@ -374,7 +375,7 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa
descriptor.run {
IrFunctionImpl(
offset, offset, memberOrigin, it, name, visibility, modality, returnType,
isInline, isExternal, isTailrec, isSuspend, isOperator, isExpect, true
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, true
)
}
}
@@ -220,7 +220,8 @@ class DeclarationStubGenerator(
it, descriptor,
descriptor.name, descriptor.visibility, descriptor.modality,
descriptor.isInline, descriptor.isExternal, descriptor.isTailrec, descriptor.isSuspend, descriptor.isExpect,
isFakeOverride = (origin == IrDeclarationOrigin.FAKE_OVERRIDE), isOperator = descriptor.isOperator,
isFakeOverride = (origin == IrDeclarationOrigin.FAKE_OVERRIDE),
isOperator = descriptor.isOperator, isInfix = descriptor.isInfix,
stubGenerator = this, typeTranslator = typeTranslator
)
}
@@ -165,7 +165,8 @@ open class DeepCopyIrTreeWithSymbols(
isSuspend = declaration.isSuspend,
isExpect = declaration.isExpect,
isFakeOverride = declaration.isFakeOverride,
isOperator = declaration.isOperator
isOperator = declaration.isOperator,
isInfix = declaration.isInfix
).apply {
overriddenSymbols = declaration.overriddenSymbols.map {
symbolRemapper.getReferencedFunction(it) as IrSimpleFunctionSymbol
@@ -385,7 +385,8 @@ class RenderIrElementVisitor(private val normalizeNames: Boolean = false) : IrEl
"suspend".takeIf { isSuspend },
"expect".takeIf { isExpect },
"fake_override".takeIf { isFakeOverride },
"operator".takeIf { isOperator }
"operator".takeIf { isOperator },
"infix".takeIf { isInfix }
)
private fun IrFunction.renderTypeParameters(): String =
@@ -24,7 +24,7 @@ fun SymbolTable.declareSimpleFunctionWithOverrides(
with(descriptor) {
IrFunctionImpl(
startOffset, endOffset, origin, it, nameProvider.nameForDeclaration(this),
visibility, modality, IrUninitializedType, isInline, isExternal, isTailrec, isSuspend, isOperator, isExpect
visibility, modality, IrUninitializedType, isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect
).also { declaration ->
declaration.metadata = MetadataSource.Function(this)
}
@@ -59,7 +59,8 @@ class FakeOverrideCopier(
isTailrec = declaration.isTailrec,
isSuspend = declaration.isSuspend,
isExpect = declaration.isExpect,
isOperator = declaration.isOperator
isOperator = declaration.isOperator,
isInfix = declaration.isInfix
).apply {
transformFunctionChildren(declaration)
}
@@ -1191,6 +1191,7 @@ abstract class IrFileDeserializer(
flags.isTailrec,
flags.isSuspend,
flags.isOperator,
flags.isInfix,
flags.isExpect,
flags.isFakeOverride
)
@@ -54,6 +54,7 @@ inline class FunctionFlags(val flags: Long) {
val visibility: Visibility get() = ProtoEnumFlags.visibility(IrFlags.VISIBILITY.get(flags.toInt()))
val isOperator: Boolean get() = IrFlags.IS_OPERATOR.get(flags.toInt())
val isInfix: Boolean get() = IrFlags.IS_INFIX.get(flags.toInt())
val isInline: Boolean get() = IrFlags.IS_INLINE.get(flags.toInt())
val isTailrec: Boolean get() = IrFlags.IS_TAILREC.get(flags.toInt())
val isExternal: Boolean get() = IrFlags.IS_EXTERNAL_FUNCTION.get(flags.toInt())
@@ -76,7 +77,7 @@ inline class FunctionFlags(val flags: Long) {
val flags = IrFlags.getFunctionFlags(
hasAnnotation, visibility, modality, kind,
isOperator, false, isInline, isTailrec, isExternal, isSuspend, isExpect
isOperator, isInfix, isInline, isTailrec, isExternal, isSuspend, isExpect
)
return flags.toLong()