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

io.kaitai.struct.DocClassCompiler.scala Maven / Gradle / Ivy

package io.kaitai.struct

import io.kaitai.struct.format._
import io.kaitai.struct.precompile.CalculateSeqSizes
import io.kaitai.struct.translators.RubyTranslator

abstract class DocClassCompiler(classSpecs: ClassSpecs, topClass: ClassSpec) extends AbstractCompiler {
  val provider = new ClassTypeProvider(classSpecs, topClass)
  val translator = new RubyTranslator(provider)

  // TODO: move it into SingleOutputFile equivalent
  val out = new StringLanguageOutputWriter(indent)
  def outFileName(topClass: ClassSpec): String
  def indent: String
  // END move to SingleOutputFile

  def nowClass: ClassSpec = provider.nowClass
  def nowClassName = provider.nowClass.name

  override def compile: CompileLog.SpecSuccess = {
    fileHeader(topClass)
    compileClass(topClass)
    fileFooter(topClass)

    CompileLog.SpecSuccess(
      "",
      List(CompileLog.FileSuccess(
        outFileName(topClass),
        out.result
      ))
    )
  }

  def compileClass(curClass: ClassSpec): Unit = {
    provider.nowClass = curClass

    classHeader(curClass)

    // Sequence
    compileSeq(curClass)

    // Instances
    curClass.instances.foreach { case (_, instSpec) =>
      instSpec match {
        case pis: ParseInstanceSpec =>
          compileParseInstance(curClass, pis)
        case vis: ValueInstanceSpec =>
          compileValueInstance(vis)
      }
    }

    // Enums
    curClass.enums.foreach { case(enumName, enumColl) => compileEnum(enumName, enumColl) }

    // Recursive types
    curClass.types.foreach { case (_, intClass) => compileClass(intClass) }

    classFooter(curClass)
  }

  def compileSeq(curClass: ClassSpec): Unit = {
    seqHeader(curClass)

    CalculateSeqSizes.forEachSeqAttr(curClass, (attr, seqPos, sizeElement, sizeContainer) => {
      compileSeqAttr(curClass, attr, seqPos, sizeElement, sizeContainer)
    })

    seqFooter(curClass)
  }

  def fileHeader(topClass: ClassSpec): Unit
  def fileFooter(topClass: ClassSpec): Unit

  def classHeader(classSpec: ClassSpec): Unit
  def classFooter(classSpec: ClassSpec): Unit

  def seqHeader(classSpec: ClassSpec): Unit
  def seqFooter(classSpec: ClassSpec): Unit

  def compileSeqAttr(classSpec: ClassSpec, attr: AttrSpec, seqPos: Option[Int], sizeElement: Sized, sizeContainer: Sized): Unit
  def compileParseInstance(classSpec: ClassSpec, inst: ParseInstanceSpec): Unit
  def compileValueInstance(vis: ValueInstanceSpec): Unit
  def compileEnum(enumName: String, enumColl: EnumSpec): Unit
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy