Search in sources :

Example 1 with Bridge

use of org.jetbrains.kotlin.backend.common.bridges.Bridge in project kotlin by JetBrains.

the class FunctionCodegen method generateBridges.

public void generateBridges(@NotNull FunctionDescriptor descriptor) {
    if (descriptor instanceof ConstructorDescriptor)
        return;
    if (owner.getContextKind() == OwnerKind.DEFAULT_IMPLS)
        return;
    if (isAnnotationOrJvmInterfaceWithoutDefaults(descriptor.getContainingDeclaration(), state))
        return;
    // equals(Any?), hashCode(), toString() never need bridges
    if (isMethodOfAny(descriptor))
        return;
    boolean isSpecial = SpecialBuiltinMembers.getOverriddenBuiltinReflectingJvmDescriptor(descriptor) != null;
    Set<Bridge<Method>> bridgesToGenerate;
    if (!isSpecial) {
        bridgesToGenerate = ImplKt.generateBridgesForFunctionDescriptor(descriptor, getSignatureMapper(typeMapper), IS_PURE_INTERFACE_CHECKER);
        if (!bridgesToGenerate.isEmpty()) {
            PsiElement origin = descriptor.getKind() == DECLARATION ? getSourceFromDescriptor(descriptor) : null;
            boolean isSpecialBridge = BuiltinMethodsWithSpecialGenericSignature.getOverriddenBuiltinFunctionWithErasedValueParametersInJava(descriptor) != null;
            for (Bridge<Method> bridge : bridgesToGenerate) {
                generateBridge(origin, descriptor, bridge.getFrom(), bridge.getTo(), isSpecialBridge, false);
            }
        }
    } else {
        Set<BridgeForBuiltinSpecial<Method>> specials = BuiltinSpecialBridgesUtil.generateBridgesForBuiltinSpecial(descriptor, getSignatureMapper(typeMapper), IS_PURE_INTERFACE_CHECKER);
        if (!specials.isEmpty()) {
            PsiElement origin = descriptor.getKind() == DECLARATION ? getSourceFromDescriptor(descriptor) : null;
            for (BridgeForBuiltinSpecial<Method> bridge : specials) {
                generateBridge(origin, descriptor, bridge.getFrom(), bridge.getTo(), bridge.isSpecial(), bridge.isDelegateToSuper());
            }
        }
        if (!descriptor.getKind().isReal() && isAbstractMethod(descriptor, OwnerKind.IMPLEMENTATION, state)) {
            CallableDescriptor overridden = SpecialBuiltinMembers.getOverriddenBuiltinReflectingJvmDescriptor(descriptor);
            assert overridden != null;
            if (!isThereOverriddenInKotlinClass(descriptor)) {
                Method method = typeMapper.mapAsmMethod(descriptor);
                int flags = ACC_ABSTRACT | getVisibilityAccessFlag(descriptor);
                v.newMethod(JvmDeclarationOriginKt.OtherOrigin(overridden), flags, method.getName(), method.getDescriptor(), null, null);
            }
        }
    }
}
Also used : Method(org.jetbrains.org.objectweb.asm.commons.Method) Bridge(org.jetbrains.kotlin.backend.common.bridges.Bridge) PsiElement(com.intellij.psi.PsiElement)

Aggregations

PsiElement (com.intellij.psi.PsiElement)1 Bridge (org.jetbrains.kotlin.backend.common.bridges.Bridge)1 Method (org.jetbrains.org.objectweb.asm.commons.Method)1