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