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

class.MyRecordDump.scala Maven / Gradle / Ivy

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

import artisanal.pickle.maker._
import org.objectweb.asm._
import Opcodes._

import scala.reflect.internal.pickling.ByteCodecs
import scala.reflect.ScalaSignature

object MyRecordDumper {

  def dump(mySig: artisanal.pickle.maker.ScalaSig, caseClassName: String, fieldData: List[EnrichedField]): Array[Byte] = {

    val cw = new ClassWriter(ClassWriter.COMPUTE_MAXS) //, ClassWriter.COMPUTE_FRAMES); //now visit max's args don't matter
    var fv: FieldVisitor = null
    var mv: MethodVisitor = null
    var av0: AnnotationVisitor = null
    val ctorReturnType = "(" + fieldData.map(fd => fd.typeData.typeDescriptor).mkString + ")V"

    ClassHeader(cw, caseClassName).dump
    ScalaSigAnnotation(cw, av0, mySig).dump
    Fields(cw, fieldData).dump

    if (fieldData.length == 1) {
      AndThen(cw, mv, caseClassName, fieldData).dump;
      Compose(cw, mv, caseClassName, fieldData).dump;
    }
    else {
      Tupled(cw, mv, caseClassName, fieldData).dump;
      Curried(cw, mv, caseClassName).dump
    }

    Constructor(cw, mv, caseClassName, fieldData).dump 

    val name = {
      if (caseClassName.contains('/')) caseClassName.dropWhile(c => c != '/').drop(1)
      else caseClassName
    }
    Copy(cw, mv, caseClassName, fieldData).dump
    CopyDefault(cw, mv, caseClassName, fieldData).dump
    ProductPrefix(cw, mv, name, fieldData).dump
    ProductArity(cw, mv, fieldData).dump
    ProductElement(cw, mv, caseClassName, fieldData).dump
    ProductIterator(cw, mv).dump
    CanEqual(cw, mv, caseClassName).dump
    HashCode(cw, mv, caseClassName, fieldData).dump
    ToString(cw, mv).dump
    Equals(cw, mv, caseClassName, fieldData).dump
    Init(cw, mv, caseClassName, fieldData, ctorReturnType).dump

    cw.toByteArray()
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy