/** * */ package com.mysema.rdfbean.object; import java.util.ArrayList; import java.util.List; import javax.annotation.Nullable; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.commons.EmptyVisitor; /** * @author tiwe * */ public class ConstructorVisitor extends EmptyVisitor { private boolean inConstructor = false; private final List<List<String>> constructors = new ArrayList<List<String>>(); @Nullable private List<String> parameters; private int counter = 0; @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { close(); inConstructor = name.equals("<init>"); if (inConstructor) { counter = 0; parameters = new ArrayList<String>(); } return super.visitMethod(access, name, desc, signature, exceptions); } @Override public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { if (inConstructor && index >= counter) { if (!name.equals("this")) { parameters.add(name); } counter = index + 1; } super.visitLocalVariable(name, desc, signature, start, end, index); } public void close() { if (inConstructor && !parameters.isEmpty()) { constructors.add(parameters); parameters = null; } inConstructor = false; } public List<List<String>> getConstructors() { return constructors; } }