Как отличить тройные кавычки от одинарных кавычек в макросах?
Я пишу макрос 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")
}
}
}
Что я должен поставить вместо <TRIPLE QUOTES>
?
Ответы
Ответ 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)