IR: explicitly pass isFakeOverride to buildFun and friends

This commit is contained in:
Georgy Bronnikov
2020-03-27 18:41:20 +03:00
committed by romanart
parent fb6956f842
commit 5fe28b3179
14 changed files with 44 additions and 17 deletions
@@ -560,6 +560,7 @@ fun createStaticFunctionWithReceivers(
origin: IrDeclarationOrigin = oldFunction.origin,
modality: Modality = Modality.FINAL,
visibility: Visibility = oldFunction.visibility,
isFakeOverride: Boolean = oldFunction.isFakeOverride,
copyMetadata: Boolean = true,
typeParametersFromContext: List<IrTypeParameter> = listOf()
): IrSimpleFunction {
@@ -579,7 +580,7 @@ fun createStaticFunctionWithReceivers(
isTailrec = false,
isSuspend = oldFunction.isSuspend,
isExpect = oldFunction.isExpect,
isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
isFakeOverride = isFakeOverride,
isOperator = oldFunction is IrSimpleFunction && oldFunction.isOperator
).apply {
descriptor.bind(this)
@@ -425,7 +425,7 @@ private fun IrFunction.generateDefaultsFunction(
if (this is IrSimpleFunction) {
// If this is an override of a function with default arguments, produce a fake override of a default stub.
if (overriddenSymbols.any { it.owner.findBaseFunctionWithDefaultArguments(skipInlineMethods, skipExternalMethods) != null })
return generateDefaultsFunctionImpl(context, IrDeclarationOrigin.FAKE_OVERRIDE, visibility).also {
return generateDefaultsFunctionImpl(context, IrDeclarationOrigin.FAKE_OVERRIDE, visibility, isFakeOverride = true).also {
context.mapping.defaultArgumentsDispatchFunction[this] = it
context.mapping.defaultArgumentsOriginalFunction[it] = this
@@ -453,7 +453,9 @@ private fun IrFunction.generateDefaultsFunction(
// Since this bug causes the metadata serializer to write the "has default value" flag into compiled
// binaries, it's way too late to fix it. Hence the workaround.
if (valueParameters.any { it.defaultValue != null }) {
return generateDefaultsFunctionImpl(context, IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER, visibility).also {
return generateDefaultsFunctionImpl(
context, IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER, visibility, isFakeOverride = false
).also {
context.mapping.defaultArgumentsDispatchFunction[this] = it
context.mapping.defaultArgumentsOriginalFunction[it] = this
}
@@ -464,7 +466,8 @@ private fun IrFunction.generateDefaultsFunction(
private fun IrFunction.generateDefaultsFunctionImpl(
context: CommonBackendContext,
newOrigin: IrDeclarationOrigin,
newVisibility: Visibility
newVisibility: Visibility,
isFakeOverride: Boolean
): IrFunction {
val newFunction = when (this) {
is IrConstructor ->
@@ -481,6 +484,7 @@ private fun IrFunction.generateDefaultsFunctionImpl(
updateFrom(this@generateDefaultsFunctionImpl)
name = Name.identifier("${this@generateDefaultsFunctionImpl.name}\$default")
origin = newOrigin
this.isFakeOverride = isFakeOverride
modality = Modality.FINAL
isExternal = false
isTailrec = false
@@ -213,4 +213,4 @@ private fun CommonBackendContext.buildOrGetNullableField(originalField: IrField)
}
}
private val IrProperty.isRealLateinit get() = isLateinit && getter?.isFakeOverride != true
private val IrProperty.isRealLateinit get() = isLateinit && !isFakeOverride
@@ -44,8 +44,7 @@ fun IrFieldBuilder.buildField(): IrField {
return IrFieldImpl(
startOffset, endOffset, origin,
IrFieldSymbolImpl(wrappedDescriptor),
name, type, visibility, isFinal, isExternal, isStatic,
origin == IrDeclarationOrigin.FAKE_OVERRIDE
name, type, visibility, isFinal, isExternal, isStatic, isFakeOverride
).also {
it.metadata = metadata
wrappedDescriptor.bind(it)
@@ -81,7 +80,7 @@ fun IrPropertyBuilder.buildProperty(): IrProperty {
IrPropertySymbolImpl(wrappedDescriptor),
name, visibility, modality,
isVar = isVar, isConst = isConst, isLateinit = isLateinit, isDelegated = isDelegated, isExpect = isExpect, isExternal = isExternal,
isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE
isFakeOverride = isFakeOverride
).also {
wrappedDescriptor.bind(it)
}
@@ -133,8 +132,7 @@ fun IrFunctionBuilder.buildFun(originalDescriptor: FunctionDescriptor? = null):
IrSimpleFunctionSymbolImpl(wrappedDescriptor),
name, visibility, modality, returnType,
isInline = isInline, isExternal = isExternal, isTailrec = isTailrec, isSuspend = isSuspend, isExpect = isExpect,
isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
isOperator = isOperator
isFakeOverride = isFakeOverride, isOperator = isOperator
).also {
wrappedDescriptor.bind(it)
}
@@ -183,6 +181,7 @@ fun IrDeclarationContainer.addFunction(
visibility: Visibility = Visibilities.PUBLIC,
isStatic: Boolean = false,
isSuspend: Boolean = false,
isFakeOverride: Boolean = false,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED
): IrSimpleFunction =
addFunction {
@@ -191,6 +190,7 @@ fun IrDeclarationContainer.addFunction(
this.modality = modality
this.visibility = visibility
this.isSuspend = isSuspend
this.isFakeOverride = isFakeOverride
this.origin = origin
}.apply {
if (!isStatic) {