[JS IR] Skip export annotations while generating default stubs

This commit is contained in:
Shagen Ogandzhanian
2020-12-14 14:49:22 +01:00
parent 7efc95705a
commit 32cc95a3b0
5 changed files with 35 additions and 13 deletions
@@ -235,8 +235,16 @@ private fun IrTypeParameter.copySuperTypesFrom(source: IrTypeParameter, srcToDst
} }
} }
fun IrAnnotationContainer.copyAnnotations(): List<IrConstructorCall> {
return annotations.map { it.deepCopyWithSymbols(this as? IrDeclarationParent) }
}
fun IrAnnotationContainer.copyAnnotationsWhen(filter: IrConstructorCall.() -> Boolean): List<IrConstructorCall> {
return annotations.mapNotNull { if (it.filter()) it.deepCopyWithSymbols(this as? IrDeclarationParent) else null }
}
fun IrMutableAnnotationContainer.copyAnnotationsFrom(source: IrAnnotationContainer) { fun IrMutableAnnotationContainer.copyAnnotationsFrom(source: IrAnnotationContainer) {
annotations += source.annotations.map { it.deepCopyWithSymbols(this as? IrDeclarationParent) } annotations += source.copyAnnotations()
} }
fun makeTypeParameterSubstitutionMap( fun makeTypeParameterSubstitutionMap(
@@ -50,6 +50,8 @@ open class DefaultArgumentStubGenerator(
return null return null
} }
open protected fun IrFunction.resolveAnnotations() = copyAnnotations()
private fun lower(irFunction: IrFunction): List<IrFunction>? { private fun lower(irFunction: IrFunction): List<IrFunction>? {
val newIrFunction = val newIrFunction =
irFunction.generateDefaultsFunction( irFunction.generateDefaultsFunction(
@@ -58,7 +60,8 @@ open class DefaultArgumentStubGenerator(
skipExternalMethods, skipExternalMethods,
forceSetOverrideSymbols, forceSetOverrideSymbols,
defaultArgumentStubVisibility(irFunction), defaultArgumentStubVisibility(irFunction),
useConstructorMarker(irFunction) useConstructorMarker(irFunction),
irFunction.resolveAnnotations()
) ?: return null ) ?: return null
if (newIrFunction.isFakeOverride) { if (newIrFunction.isFakeOverride) {
return listOf(irFunction, newIrFunction) return listOf(irFunction, newIrFunction)
@@ -384,7 +387,8 @@ open class DefaultParameterInjector(
skipExternalMethods, skipExternalMethods,
forceSetOverrideSymbols, forceSetOverrideSymbols,
defaultArgumentStubVisibility(declaration), defaultArgumentStubVisibility(declaration),
useConstructorMarker(declaration) useConstructorMarker(declaration),
emptyList()
) ?: return null ) ?: return null
log { "$declaration -> $stubFunction" } log { "$declaration -> $stubFunction" }
@@ -485,7 +489,8 @@ private fun IrFunction.generateDefaultsFunction(
skipExternalMethods: Boolean, skipExternalMethods: Boolean,
forceSetOverrideSymbols: Boolean, forceSetOverrideSymbols: Boolean,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
useConstructorMarker: Boolean useConstructorMarker: Boolean,
copiedAnnotations: List<IrConstructorCall>
): IrFunction? { ): IrFunction? {
if (skipInlineMethods && isInline) return null if (skipInlineMethods && isInline) return null
if (skipExternalMethods && isExternalOrInheritedFromExternal()) return null if (skipExternalMethods && isExternalOrInheritedFromExternal()) return null
@@ -495,7 +500,7 @@ private fun IrFunction.generateDefaultsFunction(
// If this is an override of a function with default arguments, produce a fake override of a default stub. // 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 }) if (overriddenSymbols.any { it.owner.findBaseFunctionWithDefaultArguments(skipInlineMethods, skipExternalMethods) != null })
return generateDefaultsFunctionImpl( return generateDefaultsFunctionImpl(
context, IrDeclarationOrigin.FAKE_OVERRIDE, visibility, true, useConstructorMarker context, IrDeclarationOrigin.FAKE_OVERRIDE, visibility, copiedAnnotations, true, useConstructorMarker
).also { defaultsFunction -> ).also { defaultsFunction ->
context.mapping.defaultArgumentsDispatchFunction[this] = defaultsFunction context.mapping.defaultArgumentsDispatchFunction[this] = defaultsFunction
context.mapping.defaultArgumentsOriginalFunction[defaultsFunction] = this context.mapping.defaultArgumentsOriginalFunction[defaultsFunction] = this
@@ -508,7 +513,8 @@ private fun IrFunction.generateDefaultsFunction(
skipExternalMethods, skipExternalMethods,
forceSetOverrideSymbols, forceSetOverrideSymbols,
visibility, visibility,
useConstructorMarker useConstructorMarker,
it.owner.copyAnnotations()
)?.symbol as IrSimpleFunctionSymbol? )?.symbol as IrSimpleFunctionSymbol?
} }
} }
@@ -526,7 +532,7 @@ private fun IrFunction.generateDefaultsFunction(
// binaries, it's way too late to fix it. Hence the workaround. // binaries, it's way too late to fix it. Hence the workaround.
if (valueParameters.any { it.defaultValue != null }) { if (valueParameters.any { it.defaultValue != null }) {
return generateDefaultsFunctionImpl( return generateDefaultsFunctionImpl(
context, IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER, visibility, false, useConstructorMarker context, IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER, visibility, copiedAnnotations, false, useConstructorMarker
).also { ).also {
context.mapping.defaultArgumentsDispatchFunction[this] = it context.mapping.defaultArgumentsDispatchFunction[this] = it
context.mapping.defaultArgumentsOriginalFunction[it] = this context.mapping.defaultArgumentsOriginalFunction[it] = this
@@ -539,6 +545,7 @@ private fun IrFunction.generateDefaultsFunctionImpl(
context: CommonBackendContext, context: CommonBackendContext,
newOrigin: IrDeclarationOrigin, newOrigin: IrDeclarationOrigin,
newVisibility: DescriptorVisibility, newVisibility: DescriptorVisibility,
copiedAnnotations: List<IrConstructorCall>,
isFakeOverride: Boolean, isFakeOverride: Boolean,
useConstructorMarker: Boolean useConstructorMarker: Boolean
): IrFunction { ): IrFunction {
@@ -601,7 +608,7 @@ private fun IrFunction.generateDefaultsFunctionImpl(
} }
// TODO some annotations are needed (e.g. @JvmStatic), others need different values (e.g. @JvmName), the rest are redundant. // TODO some annotations are needed (e.g. @JvmStatic), others need different values (e.g. @JvmName), the rest are redundant.
newFunction.copyAnnotationsFrom(this) newFunction.annotations += copiedAnnotations
return newFunction return newFunction
} }
@@ -326,8 +326,8 @@ class ExportModelGenerator(val context: JsIrBackendContext) {
return Exportability.NotNeeded return Exportability.NotNeeded
if (function.origin == IrDeclarationOrigin.BRIDGE || if (function.origin == IrDeclarationOrigin.BRIDGE ||
function.origin == JsLoweredDeclarationOrigin.BRIDGE_TO_EXTERNAL_FUNCTION || function.origin == JsLoweredDeclarationOrigin.BRIDGE_TO_EXTERNAL_FUNCTION ||
function.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER || function.origin == JsLoweredDeclarationOrigin.OBJECT_GET_INSTANCE_FUNCTION ||
function.origin == JsLoweredDeclarationOrigin.OBJECT_GET_INSTANCE_FUNCTION function.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER
) { ) {
return Exportability.NotNeeded return Exportability.NotNeeded
} }
@@ -7,10 +7,12 @@ package org.jetbrains.kotlin.ir.backend.js.lower
import org.jetbrains.kotlin.backend.common.BodyLoweringPass import org.jetbrains.kotlin.backend.common.BodyLoweringPass
import org.jetbrains.kotlin.backend.common.deepCopyWithVariables import org.jetbrains.kotlin.backend.common.deepCopyWithVariables
import org.jetbrains.kotlin.backend.common.ir.copyAnnotationsWhen
import org.jetbrains.kotlin.backend.common.ir.isOverridableOrOverrides import org.jetbrains.kotlin.backend.common.ir.isOverridableOrOverrides
import org.jetbrains.kotlin.backend.common.lower.DefaultArgumentStubGenerator import org.jetbrains.kotlin.backend.common.lower.DefaultArgumentStubGenerator
import org.jetbrains.kotlin.backend.common.lower.DEFAULT_DISPATCH_CALL import org.jetbrains.kotlin.backend.common.lower.DEFAULT_DISPATCH_CALL
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.backend.js.utils.JsAnnotations
import org.jetbrains.kotlin.ir.builders.IrBlockBodyBuilder import org.jetbrains.kotlin.ir.builders.IrBlockBodyBuilder
import org.jetbrains.kotlin.ir.builders.irCall import org.jetbrains.kotlin.ir.builders.irCall
import org.jetbrains.kotlin.ir.builders.irGet import org.jetbrains.kotlin.ir.builders.irGet
@@ -20,6 +22,7 @@ import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
import org.jetbrains.kotlin.ir.util.isAnnotation
import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.util.patchDeclarationParents
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
@@ -29,6 +32,10 @@ class JsDefaultArgumentStubGenerator(override val context: JsIrBackendContext) :
override fun needSpecialDispatch(irFunction: IrSimpleFunction) = irFunction.isOverridableOrOverrides override fun needSpecialDispatch(irFunction: IrSimpleFunction) = irFunction.isOverridableOrOverrides
override fun IrFunction.resolveAnnotations(): List<IrConstructorCall> = copyAnnotationsWhen {
!(isAnnotation(JsAnnotations.jsExportFqn) || isAnnotation(JsAnnotations.jsNameFqn))
}
override fun IrBlockBodyBuilder.generateHandleCall( override fun IrBlockBodyBuilder.generateHandleCall(
handlerDeclaration: IrValueParameter, handlerDeclaration: IrValueParameter,
oldIrFunction: IrFunction, oldIrFunction: IrFunction,
@@ -279,10 +279,10 @@ tailrec fun IrElement.getPackageFragment(): IrPackageFragment? {
} }
} }
fun IrConstructorCall.isAnnotation(name: FqName) = symbol.owner.parentAsClass.fqNameWhenAvailable == name
fun IrAnnotationContainer.getAnnotation(name: FqName): IrConstructorCall? = fun IrAnnotationContainer.getAnnotation(name: FqName): IrConstructorCall? =
annotations.find { annotations.find { it.isAnnotation(name) }
it.symbol.owner.parentAsClass.fqNameWhenAvailable == name
}
fun IrAnnotationContainer.hasAnnotation(name: FqName) = fun IrAnnotationContainer.hasAnnotation(name: FqName) =
annotations.any { annotations.any {