簡體   English   中英

具有伴侶的類的Scala宏擴展:找不到類型

[英]Scala macro expansion of class with companion: type not found

我正在嘗試在案例類上定義一個宏注釋,該注釋會擴展為帶有伴隨對象的類,但是我遇到了一些問題。

我可以創建一個與類同名的對象,並在其上定義方法。 但是,當我嘗試使用類的類型名作為方法的返回值或參數類型時,出現“未找到:類型”

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

object termMacro {

def impl(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = {
    import c.universe._
    val inputs = annottees.map(_.tree).toList

    val (cls, comp) = annottees.map(_.tree) match {

        case cd@q"$mods class $tpname[..$tparams] $ctorMods(...$paramss) extends { ..$_ } with ..$_ { $self => ..$stats }" :: tail =>

            val paramnames = paramss.head.map {
                case q"$mods val $name: $tpt = $default" => name
            }

            val ctorparams = List(paramss.head ++ Seq(
                q"val position: SourcePosition = (0,0)"
            ))

            val ctorname = TermName(tpname.decodedName.toString)
            //val clstype  =
            (
                q"""
                        import ast.Term
                        case class $tpname(...$ctorparams) extends Term { $self =>
                            def children() = {
                                List(..$paramnames)
                            }

                            ..$stats
                        }
                 """,
                q"""
                        object $ctorname {
                            def unapply(t: $tpname): Option[(Int, Int)] = {
                                Some(Tuple2(3, 4))
                            }
                    }
                """
            )

        case head :: tail =>
            c.abort(c.enclosingPosition, s"The @Term annotation is for case classes, found $head")
    }

    c.error(c.enclosingPosition, showRaw(cls) + "\n" + showRaw(comp))
    c.Expr[Any](Block(List(cls, comp), Literal(Constant(()))))
}
}

例如,用法是: @term case class A(x: Term) extends Term ,並且給了我編譯器錯誤“未找到:在該定義的@term位置鍵入A'”。

我將位置縮小到對象定義中的unapply方法。

任何幫助表示贊賞。 我對scala宏非常陌生,因此也歡迎進一步提出建議。

附帶問題:有關在IntelliJ / Gradle項目中調試宏的任何建議?

q"import foo; class Bar"會創建一個塊,因此宏注釋將無意間將class Bar替換為{ import foo; class Bar } { import foo; class Bar } ,這使Bar成為本地類,該本地類從塊的外部是不可見的。

暫無
暫無

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

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