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

io.getquill.quotation.QuatLiftable.scala Maven / Gradle / Ivy

The newest version!
package io.getquill.quotation

import io.getquill.quat.Quat

import scala.reflect.macros.whitebox.Context

trait QuatLiftable {
  val mctx: Context
  val serializeQuats: Boolean

  import mctx.universe.{Block => _, Constant => _, Function => _, Ident => _, If => _, _}

  // Liftables are invariant so want to have a separate liftable for Quat.Product since it is used directly inside Entity
  // which should be lifted/unlifted without the need for casting.
  implicit val quatProductLiftable: Liftable[Quat.Product] = Liftable[Quat.Product] {
    // If we are in the JVM, use Kryo to serialize our Quat due to JVM 64KB method limit that we will run into of the Quat Constructor
    // if plainly lifted into the method created by our macro (i.e. the 'ast' method).
    case quat: Quat.Product if (serializeQuats) => q"io.getquill.quat.Quat.Product.fromSerialized(${quat.serialize})"
    case Quat.Product.WithRenamesCompact(name, tpe, fields, values, renamesFrom, renamesTo) =>
      q"io.getquill.quat.Quat.Product.WithRenamesCompact.apply($name, $tpe)(..$fields)(..$values)(..$renamesFrom)(..$renamesTo)"
  }

  implicit val quatProductTypeLiftable: Liftable[Quat.Product.Type] = Liftable[Quat.Product.Type] {
    case Quat.Product.Type.Concrete => q"io.getquill.quat.Quat.Product.Type.Concrete"
    case Quat.Product.Type.Abstract => q"io.getquill.quat.Quat.Product.Type.Abstract"
  }

  implicit val quatLiftable: Liftable[Quat] = Liftable[Quat] {
    case quat: Quat.Product if (serializeQuats) => q"io.getquill.quat.Quat.fromSerialized(${quat.serialize})"
    case Quat.Product.WithRenamesCompact(name, tpe, fields, values, renamesFrom, renamesTo) =>
      q"io.getquill.quat.Quat.Product.WithRenamesCompact.apply($name, $tpe)(..$fields)(..$values)(..$renamesFrom)(..$renamesTo)"
    case Quat.Value             => q"io.getquill.quat.Quat.Value"
    case Quat.Null              => q"io.getquill.quat.Quat.Null"
    case Quat.Generic           => q"io.getquill.quat.Quat.Generic"
    case Quat.Unknown           => q"io.getquill.quat.Quat.Unknown"
    case Quat.BooleanValue      => q"io.getquill.quat.Quat.BooleanValue"
    case Quat.BooleanExpression => q"io.getquill.quat.Quat.BooleanExpression"
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy