如何区分宏中的三重引号和单引号?
How to distinguish triple quotes from single quotes in macros?
我正在写一个宏 m(expr: String)
,其中 expr
是某种语言(不是 Scala)的表达式:
m("SOME EXPRESSION")
m("""
SOME EXPRESSION
""")
当我解析表达式时,我想在源文件中的适当位置报告错误消息。为此,我应该知道字符串文字本身的位置和文字的引号数(3 或 1)。不幸的是,我没有找到任何方法 returns 文字的引号数:
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")
}
}
}
我应该用什么代替 <TRIPLE QUOTES>
?
我能想到的唯一方法是访问源文件并检查三引号:
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)
我正在写一个宏 m(expr: String)
,其中 expr
是某种语言(不是 Scala)的表达式:
m("SOME EXPRESSION")
m("""
SOME EXPRESSION
""")
当我解析表达式时,我想在源文件中的适当位置报告错误消息。为此,我应该知道字符串文字本身的位置和文字的引号数(3 或 1)。不幸的是,我没有找到任何方法 returns 文字的引号数:
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")
}
}
}
我应该用什么代替 <TRIPLE QUOTES>
?
我能想到的唯一方法是访问源文件并检查三引号:
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)