簡體   English   中英

與宏中的子類匹配

[英]Matching against subclasses in macro

我需要將字符串值轉換為實際類型,所以我決定嘗試宏方式來執行此操作。 我有一堆數據類型:

sealed abstract class Tag(val name: String)
case object Case1 extends Tag("case1")
case object Case2 extends Tag("case2")
case object Case3 extends Tag("case3")
etc...

我想寫一個簡單的解析器:

val tag: Tag = TagResolver.fromString("case2")

該行應分別返回Case2 我經理要做以下事情:

def typeFromString(c: Context)(name: c.Expr[String]): c.Expr[Tag] = {
    import c.universe._
    val tag = typeTag[Tag]
    val accSymb = tag.tpe.typeSymbol.asClass
    val subclasses = accSymb.knownDirectSubclasses // all my cases

    subclasses.map { sub =>
      val name = sub.typeSignature.member(newTermName("name")).asMethod // name field
      ???
    }
  }

但是如何匹配name: c.Expr[String]name字段的值匹配,如果匹配則返回相應的標簽?

我認為沒有可靠的方法,因為knownDirectSubclasses可以引用尚未編譯的類,因此我們無法評估它們。

如果您可以將這些值作為注釋放在類上,那么即使在當前編譯運行中編譯類(通過Symbol.annotations API),也可以讀取這些注釋。 但請注意,knownDirectSubclasses存在已知問題: https ://issues.scala-lang.org/browse/SI-7046。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM