3
私はScalaコンパイラプラグインでクラスを生成しようとしています。 I特性テストを持っている、とクラスTestWrapperを必要とする、およそ次のように:Scala Compiler Pluginの合成クラスのコンストラクタパラメータを定義しますか?
class TestWrapper(wrapped: Test) extends Test { ... }
私はこのようなコンストラクタのパラメータを定義:
val pName = newTermName("wrapped")
val paramSym = myNewClass.newValueParameter(owner.pos.focus, pName)
paramSym.setInfo(wrapped.tpe).setFlag(SYNTHETIC)
val param = ValDef(paramSym)
を、後でCLASSDEF:
ClassDef(myNewClass, NoMods, List(List(param)), List(Nil),
members, owner.pos)
パラメータを受け取る。現在、私が得るものは:
// Scala source: Test.scala
[[syntax trees at end of generatewrappers]]
package test {
<synthetic> class TestWrapper extends Object with test.Test {
<synthetic> val wrapped: test.Test = _;
def this(wrapped: test.Test): test.TestWrapper = {
TestWrapper.super.this();
()
};
<synthetic> def m3: Int = TestWrapper.this.wrapped.m3;
};
コンパイラは、パラメータと同じ名前のフィールドを自動的に生成しているようです。私が見ていないのは、パラメータからフィールドへの割り当てですが、私はそれが「暗黙的」であると想定していました。私はよりテストの具体的なインスタンスと、このTestWrapperをインスタンス化しますが、M3を呼び出すと例外が発生することができます
実際には3種類のものである必要があり、「ラップ」java.lang.NoSuchFieldError: wrapped
at test.TestWrapper.m3(Test.scala:1)
...
:
1) A constructor parameter
2) An class instance field
3) A getter for the class instance field
コンパイラの出力
<synthetic> val wrapped: test.Test = _;
未定義とは対照的に、それが、なぜなら「= _」で、定義される:すべての後フィールドがあることを示しています"= ..."がないとき
私は何が分かりませんか?