2011-10-23 3 views
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 = _; 

未定義とは対照的に、それが、なぜなら「= _」で、定義される:すべての後フィールドがあることを示しています"= ..."がないとき

私は何が分かりませんか?

答えて

2

次の行を追加する必要がありました。

myNewClass.info.decls.enter(paramSym) 

Duh!

関連する問題