Scala 宏:分配给变量的字符串文字不匹配

Scala macros: string literal assigned to a variable does not match

我正在使用来自 Spotify 的 Scio 库的宏注释。我想定义一个 String 类型的变量并这样注释:

val schemaString = """schema here"""
@BigQueryType.fromSchema(outputString) class BigQuery

这不会编译,但是,如果我直接注释 String,它会起作用:

@BigQueryType.fromSchema("""schema here""") class BigQuery

看代码,这样匹配就完成了here,本质上代码如下:

def str(tree: c.Tree) = tree match {
      // "string literal"
      case Literal(Constant(s: String)) => s
      // "string literal".stripMargin
      case Select(Literal(Constant(s: String)), TermName("stripMargin")) => s.stripMargin
      case _ => c.abort(c.enclosingPosition, errorMessage)
    }

问题是为什么这个不匹配变量,但是匹配字符串呢?如果有任何方法可以使第一个示例起作用?

问题是当执行宏时,字符串变量的值可能在编译时不可用。如果是:

val schemaString = doSomeComplexFunction()
@BigQueryType.fromSchema(schemaString) class BigQuery

理论上,也许宏可以搜索 val 的定义位置,如果它只是分配了一个字面值,则允许它工作,但如果您开始考虑范围,即使这样也会变得复杂。

所以不,可能无法让第一个示例起作用。