2017-08-10 10 views
0

SpotifyのScioライブラリのマクロ注釈を使用しています。私はString型の変数を定義し、このように注釈を付けたいと思います:Scalaマクロ:変数に割り当てられた文字列リテラルが一致しません

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) 
    } 

これが一致しない理由の質問です変数は、文字列ですか?そして、最初の例を動作させる方法があれば?

答えて

3

問題は、文字列変数の値が、マクロの実行時にコンパイル時に使用できないことがあることです。それは何だった場合:

理論的には
val schemaString = doSomeComplexFunction() 
@BigQueryType.fromSchema(schemaString) class BigQuery 

、多分マクロはvalが定義されている場所を検索し、それは単にリテラル値を割り当てられている場合、それが動作するようにできますが、あなたが考え始める場合でも、それが複合体を得ることができる可能性が範囲について。

だから、おそらく、最初の例を動作させる方法はありません。

関連する問題