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 = _;
,並且它被定義,因爲,在「= _」,而不是未定義,當沒有「= ...」
那麼,我錯過了什麼?