/* * 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 mockit.internal.util.*; import static mockit.external.asm.Opcodes.*; import static mockit.internal.expectations.mocking.MockedTypeModifier.*; public final class SubclassGenerationModifier extends BaseSubclassGenerator { public SubclassGenerationModifier( @Nonnull Class<?> baseClass, @Nonnull Type mockedType, @Nonnull ClassReader classReader, @Nonnull String subclassName, boolean copyConstructors) { super(baseClass, classReader, mockedType, subclassName, copyConstructors); } @Override @SuppressWarnings("AssignmentToMethodParameter") protected void generateMethodImplementation( @Nonnull String className, int access, @Nonnull String name, @Nonnull String desc, @Nullable String signature, @Nullable String[] exceptions) { if (signature != null && mockedTypeInfo != null) { signature = mockedTypeInfo.genericTypeMap.resolveReturnType(className, signature); } mw = cw.visitMethod(ACC_PUBLIC, name, desc, signature, exceptions); if (ObjectMethods.isMethodFromObject(name, desc)) { generateEmptyImplementation(desc); } else { generateDirectCallToHandler(mw, className, access, name, desc, signature); generateReturnWithObjectAtTopOfTheStack(desc); mw.visitMaxs(1, 0); } } }