【问题标题】:How to distinguish triple quotes from single quotes in macros?如何区分宏中的三引号和单引号?
【发布时间】:2015-07-03 08:01:59
【问题描述】:

我正在编写一个宏 m(expr: String),其中 expr 是某种语言(不是 Scala)的表达式:

m("SOME EXPRESSION")

m("""
  SOME EXPRESSION
""")

当我解析表达式时,我想在源文件中的正确位置报告错误消息。为了实现这一点,我应该知道字符串文字本身的位置以及文字的引号数量(3 或 1)。不幸的是,我没有找到任何返回文字引号数量的方法:

import scala.language.experimental.macros
import scala.reflect.macros.blackbox.Context

object Temp {
  def m(s: String) : String = macro mImpl

  def mImpl(context: Context)(s: context.Expr[String]): context.universe.Tree = {
    import context.universe._

    s match {
      case l @ Literal(Constant(p: String)) =>
        if (l.<TRIPLE QUOTES>) {
          ...
        } else {
          ...
        }

      case _ =>
        context.abort(context.enclosingPosition, "The argument of m must be a string literal")
    }
  }
}

我应该用什么代替&lt;TRIPLE QUOTES&gt;

【问题讨论】:

标签: scala macros


【解决方案1】:

我能想到的唯一方法是访问源文件并检查三引号:

l.tree.pos.source.content.startsWith("\"\"\"",l.tree.pos.start)

您还需要编辑匹配的案例:

case l @ Expr(Literal(Constant(p: String))) =>

这里有一些解释的版本:

val tree: context.universe.Tree = l.tree
val pos: scala.reflect.api.Position = tree.pos
val source: scala.reflect.internal.util.SourceFile = pos.source
val content: Array[Char] = source.content
val start: Int = pos.start
val isTriple: Boolean = content.startsWith("\"\"\"",start)

【讨论】:

    猜你喜欢
    • 2016-06-10
    • 1970-01-01
    • 2021-08-29
    • 2016-08-31
    • 2017-11-10
    相关资源
    最近更新 更多