001package io.ebean.enhance.querybean;
002
003import io.ebean.enhance.asm.ClassVisitor;
004import io.ebean.enhance.asm.Label;
005import io.ebean.enhance.asm.Opcodes;
006
007/**
008 * Changes the existing constructor to remove all the field initialisation as these are going to be
009 * initialised lazily by calls to our generated methods.
010 */
011public class TypeQueryAssocMainConstructor extends BaseConstructorAdapter implements Opcodes, Constants {
012
013  private final ClassInfo classInfo;
014
015  private final ClassVisitor cv;
016
017  private final String desc;
018
019  private final String signature;
020
021  /**
022   * Construct for a query bean class given its associated entity bean domain class and a class visitor.
023   */
024  public TypeQueryAssocMainConstructor(ClassInfo classInfo, ClassVisitor cv, String desc, String signature) {
025    super();
026    this.cv = cv;
027    this.classInfo = classInfo;
028    this.desc = desc;
029    this.signature = signature;
030  }
031
032  @Override
033  public void visitCode() {
034
035    mv = cv.visitMethod(ACC_PUBLIC, "<init>", desc, signature, null);
036    mv.visitCode();
037    Label l0 = new Label();
038    mv.visitLabel(l0);
039    mv.visitLineNumber(1, l0);
040    mv.visitVarInsn(ALOAD, 0);
041    mv.visitVarInsn(ALOAD, 1);
042    mv.visitVarInsn(ALOAD, 2);
043    mv.visitVarInsn(ALOAD, 3);
044    mv.visitMethodInsn(INVOKESPECIAL, TQ_ASSOC_BEAN, "<init>", "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/String;)V", false);
045    Label l1 = new Label();
046    mv.visitLabel(l1);
047    mv.visitLineNumber(2, l1);
048    mv.visitInsn(RETURN);
049    Label l2 = new Label();
050    mv.visitLabel(l2);
051    mv.visitLocalVariable("this", "L"+classInfo.getClassName()+";", "L"+classInfo.getClassName()+"<TR;>;", l0, l2, 0);
052    mv.visitLocalVariable("name", "Ljava/lang/String;", null, l0, l2, 1);
053    mv.visitLocalVariable("root", "Ljava/lang/Object;", "TR;", l0, l2, 2);
054    mv.visitLocalVariable("prefix", "Ljava/lang/String;", null, l0, l2, 3);
055    mv.visitLocalVariable("depth", "I", null, l0, l2, 4);
056    mv.visitMaxs(4, 5);
057    mv.visitEnd();
058  }
059
060}