/*
* Copyright (c) 2006-2011 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.internal;
import static java.lang.reflect.Modifier.*;
import mockit.external.asm.*;
import mockit.internal.filtering.*;
import mockit.internal.util.*;
import mockit.internal.startup.*;
import static mockit.external.asm.Opcodes.*;
public final class StubOutModifier extends BaseClassModifier
{
private final MockingConfiguration stubbingCfg;
private String superClassName;
public StubOutModifier(ClassReader cr, MockingConfiguration stubbingConfiguration)
{
super(cr);
stubbingCfg = stubbingConfiguration;
}
@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces)
{
superClassName = superName;
super.visit(version, access, name, signature, superName, interfaces);
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions)
{
if (
isAbstract(access) || (access & ACC_SYNTHETIC) != 0 || isNative(access) && !Startup.isJava6OrLater() ||
stubbingCfg != null && !stubbingCfg.matchesFilters(name, desc)
) {
return super.visitMethod(access, name, desc, signature, exceptions);
}
startModifiedMethodVersion(access, name, desc, signature, exceptions);
if ("<init>".equals(name)) {
generateCallToSuper();
}
generateEmptyImplementation(desc);
return null;
}
private void generateCallToSuper()
{
mw.visitVarInsn(ALOAD, 0);
String constructorDesc = SuperConstructorCollector.INSTANCE.findConstructor(superClassName);
pushDefaultValuesForParameterTypes(constructorDesc);
mw.visitMethodInsn(INVOKESPECIAL, superClassName, "<init>", constructorDesc);
}
}