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

module.ModuleApply.scala Maven / Gradle / Ivy

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

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

case class ModuleApply(cw_MODULE: ClassWriter, var mv_MODULE: MethodVisitor, caseClassName: String, fieldData: List[EnrichedField]) {
  def dump = {

    if (fieldData.map(fd => fd.fieldType).exists(ft => ft.takesTypeArgs)) {
      mv_MODULE = cw_MODULE.visitMethod(ACC_PUBLIC, "apply", "(" + fieldData.map(fd => fd.typeData.typeDescriptor).mkString + ")L" + caseClassName + ";", "(" + fieldData.map(fd => fd.typeData.unerasedTypeDescriptor).mkString + ")L" + caseClassName + ";", null);
    }
    else {
      mv_MODULE = cw_MODULE.visitMethod(ACC_PUBLIC, "apply", "(" + fieldData.map(fd => fd.typeData.typeDescriptor).mkString + ")L" + caseClassName + ";", null, null)
    }

    mv_MODULE.visitCode();
    mv_MODULE.visitTypeInsn(NEW, caseClassName);
    mv_MODULE.visitInsn(DUP);

    var argIndex = 1

    fieldData.map(fd => fd.typeData.loadInstr).foreach(lI => {
      if (lI == DLOAD | lI == LLOAD) {
        mv_MODULE.visitVarInsn(lI, argIndex);
        argIndex += 2
      }
      else {
        mv_MODULE.visitVarInsn(lI, argIndex);
        argIndex += 1;
      }
    })

    mv_MODULE.visitMethodInsn(INVOKESPECIAL, caseClassName, "", "(" + fieldData.map(fd => fd.typeData.typeDescriptor).mkString + ")V");
    mv_MODULE.visitInsn(ARETURN);
    mv_MODULE.visitMaxs(5, 4);
    mv_MODULE.visitEnd();

  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy