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

class.methods.Init.scala Maven / Gradle / Ivy

The newest version!
package com.julianpeeters.caseclass.generator

import org.objectweb.asm._
import Opcodes._

case class Init(cw: ClassWriter, var mv: MethodVisitor, caseClassName: String, fieldData: List[EnrichedField], ctorReturnType: String) {
  def dump = {

    //init method
    if (fieldData.map(fd => fd.fieldType).exists(ft => ft.takesTypeArgs)) {
      mv = cw.visitMethod(ACC_PUBLIC, "", ctorReturnType, "(" + fieldData.map(fd => fd.typeData.unerasedTypeDescriptor).mkString + ")V", null);
    }
    else mv = cw.visitMethod(ACC_PUBLIC, "", ctorReturnType, null, null);
    mv.visitCode();

    var stackIndex = 1

    fieldData.map(fd => { 
      if (fd.typeData.loadInstr == DLOAD | fd.typeData.loadInstr == LLOAD) {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(fd.typeData.loadInstr, stackIndex);
        mv.visitFieldInsn(PUTFIELD, caseClassName, fd.fieldName, fd.typeData.typeDescriptor.toString);
        stackIndex += 2
      }
      else {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(fd.typeData.loadInstr, stackIndex);
        mv.visitFieldInsn(PUTFIELD, caseClassName, fd.fieldName, fd.typeData.typeDescriptor.toString);
        stackIndex += 1;
      }
    })

    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V");
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESTATIC, "scala/Product$class", "$init$", "(Lscala/Product;)V");
    mv.visitInsn(RETURN);
    mv.visitMaxs(2, 4);
    mv.visitEnd();

    cw.visitEnd();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy