2011-10-23 55 views
3

我想在Scala編譯器插件中生成一個類。我有一個特質測試,並且需要一個類TestWrapper,大約是這樣的:爲Scala編譯器插件中的合成類定義構造函數參數?

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與測試的具體實例,但調用立方米導致異常:

java.lang.NoSuchFieldError: wrapped 
    at test.TestWrapper.m3(Test.scala:1) 
    ... 

「包裝」其實應該是3個不同的東西:

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) 

呃!

相關問題