All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mockit.internal.expectations.injection.ParameterNameExtractor Maven / Gradle / Ivy

There is a newer version: 2.5.0
Show newest version
/*
 * Copyright (c) 2006-2013 Rogério Liesenfeld
 * This file is subject to the terms of the MIT license (see LICENSE.txt).
 */
package mockit.internal.expectations.injection;

import mockit.external.asm4.*;
import mockit.internal.*;
import mockit.internal.state.*;

final class ParameterNameExtractor extends ClassVisitor
{
   private final boolean forMethods;
   private String classDesc;
   private int methodAccess;
   private String methodName;
   private String methodDesc;

   ParameterNameExtractor(boolean forMethods) { this.forMethods = forMethods; }

   String extractNames(Class classOfInterest)
   {
      String className = classOfInterest.getName();
      classDesc = className.replace('.', '/');

      if (!ParameterNames.hasNamesForClass(classDesc)) {
         ClassReader cr = ClassFile.createClassFileReader(classOfInterest);
         cr.accept(this, ClassReader.SKIP_FRAMES);
      }

      return classDesc;
   }

   @Override
   public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions)
   {
      boolean visitingAMethod = name.charAt(0) != '<';

      if (visitingAMethod == forMethods) {
         methodAccess = access;
         methodName = name;
         methodDesc = desc;
         return new MethodOrConstructorVisitor();
      }

      return null;
   }

   private final class MethodOrConstructorVisitor extends MethodVisitor
   {
      private String previousDesc;
      private int previousIndex;

      @Override
      public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index)
      {
         int parameterIndex = index;

         if ("J".equals(previousDesc) || "D".equals(previousDesc)) {
            parameterIndex = previousIndex + 1;
         }

         ParameterNames.registerName(classDesc, methodAccess, methodName, methodDesc, name, parameterIndex);
         previousIndex = parameterIndex;
         previousDesc = desc;
      }
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy