mockit.internal.expectations.mocking.InterfaceImplementationGenerator Maven / Gradle / Ivy
/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.internal.expectations.mocking;
import java.lang.reflect.Type;
import javax.annotation.*;
import mockit.external.asm.*;
import mockit.internal.classGeneration.*;
import static mockit.external.asm.Opcodes.*;
import static mockit.internal.expectations.mocking.MockedTypeModifier.*;
final class InterfaceImplementationGenerator extends BaseImplementationGenerator
{
@Nonnull private final MockedTypeInfo mockedTypeInfo;
private String interfaceName;
InterfaceImplementationGenerator(
@Nonnull ClassReader classReader, @Nonnull Type mockedType, @Nonnull String implementationClassName)
{
super(classReader, implementationClassName);
mockedTypeInfo = new MockedTypeInfo(mockedType);
}
@Override
public void visit(
int version, int access, @Nonnull String name, @Nullable String signature, @Nullable String superName,
@Nullable String[] interfaces)
{
interfaceName = name;
String classSignature = signature == null ? null : signature + mockedTypeInfo.implementationSignature;
super.visit(version, access, name, classSignature, superName, interfaces);
}
@Override
protected void generateMethodBody(
int access, @Nonnull String name, @Nonnull String desc, @Nullable String signature, @Nullable String[] exceptions)
{
mw = cw.visitMethod(ACC_PUBLIC, name, desc, signature, exceptions);
String className = null;
if (signature != null) {
String subInterfaceOverride = getSubInterfaceOverride(mockedTypeInfo.genericTypeMap, name, signature);
if (subInterfaceOverride != null) {
className = interfaceName;
desc = subInterfaceOverride.substring(name.length());
signature = null;
}
}
if (className == null) {
className = isOverrideOfMethodFromSuperInterface(name, desc) ? interfaceName : methodOwner;
}
generateDirectCallToHandler(mw, className, access, name, desc, signature);
generateReturnWithObjectAtTopOfTheStack(desc);
mw.visitMaxs(1, 0);
}
}