Повторное использование аннотаций на основе макросов Scala - PullRequest
0 голосов
/ 11 июля 2019

Рассмотрим аннотацию на основе макросов Scala, такую ​​как @ memoise из macmemo .Для аннотации требуется два аргумента: максимальный размер кэша и время жизни, например,

@memoize(maxSize = 20000, expiresAfter = 2 hours)

Скажем, вы хотите создать аннотацию @cacheall, эквивалентную @memoize(maxSize = Int.MaxValue, expiresAfter = 100 days), чтобы уменьшитьи имеют единую точку параметризации.

Существует ли стандартная схема для такого типа повторного использования?Очевидно,

class cacheall extends memoize(Int.MaxValue, 100 days)

не будет работать из-за разбора аргумента во время компиляции в макросе.

1 Ответ

1 голос
/ 11 июля 2019

Стандартный шаблон - сделать вашу аннотацию макро-аннотацией, которая расширяется, включает необходимую аннотацию с необходимыми параметрами.

import scala.annotation.StaticAnnotation
import scala.language.experimental.macros
import scala.reflect.macros.blackbox

class cacheall extends StaticAnnotation {
  def macroTransform(annottees: Any*): Any = macro cacheallMacro.impl
}

object cacheallMacro {
  def impl(c: blackbox.Context)(annottees: c.Tree*): c.Tree = {
    import c.universe._

    val memoize = q"""
      new _root_.com.softwaremill.macmemo.memoize(
        _root_.scala.Int.MaxValue, {
          import _root_.scala.concurrent.duration._
          100.days 
      })"""

    annottees match {
      case q"${mods: Modifiers} def $tname[..$tparams](...$paramss): $tpt = $expr" :: _ =>
        q"${mods.mapAnnotations(memoize :: _)} def $tname[..$tparams](...$paramss): $tpt = $expr"
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...