Scala Compiler Pluginでは、既存の特性を実装する新しいクラスを作成しようとしています。これまでのところ、私のコードは次のようになります:Scala Compiler Pluginに新しいクラスを追加するには?
def trait2Impl(original: ClassDef, newName: String): ClassDef = {
val impl = original.impl
// Seems OK to have same self, but does not make sense to me ...
val self = impl.self
// TODO: implement methods ...
val body = impl.body
// We implement original
val parents = original :: impl.parents
val newImpl = treeCopy.Template(impl, parents, self, body)
val name = newTypeName(newName)
// We are a syntheic class, not a user-defined trait
val mods = (original.mods | SYNTHETIC) &~ TRAIT
val tp = original.tparams
val result = treeCopy.ClassDef(original, mods, name, tp, newImpl)
// Same Package?
val owner = original.symbol.owner
// New symbol. What's a Position good for?
val symbol = new TypeSymbol(owner, NoPosition, name)
result.setSymbol(symbol)
symbol.setFlag(SYNTHETIC)
symbol.setFlag(ABSTRACT)
symbol.resetFlag(INTERFACE)
symbol.resetFlag(TRAIT)
owner.info.decls.enter(symbol)
result
}
しかし、パッケージには追加されません。私はそれが実際にパッケージが生成を引き起こす特性の前に "横断"されたか、TypingTransformerの "def def transform(tree:Tree):Tree"メソッドがという1つしか返さないためであると思われます Tree、for受け取ったすべてのツリー。新しいツリーを実際に作成することはできませんが、変更するのは1つだけです。
既存のパッケージに新しいクラスを追加するにはどうすればよいですか?もし私が "transform(Tree)"を取得したときにパッケージを変換すると動作するかもしれませんが、パッケージの内容はまだ分かりませんので、新しいClassを生成することはできません。 。あるいは、Symbolの "Position"パラメータに関連しているかもしれませんか?
これまでのところ、ツリーが変更されていても、コンパイラプラグインで完全に新しいクラスが作成された例はありませんでした。
に変換しているのですか?私は似たようなものを持っているので、私は不思議に思っていました...私はあなたの形質の親にマッチする必要があると思います。つまり、PackageDefとTemplateを調べて、あなたの体のすべての特徴を見つけ出します。その後、変換されたPackageDefとTemplateを返すことができます –
はい、Scalaメーリングリストの助けを借りています。しかし、私はクラスを*同じパッケージにしか作成できないので、まだそこにはいません。物事を整理したら自分の質問に答えを投稿しようとします。 –
あなたの質問に今すぐお答えください!私は同じ質問があるので(https://github.com/iron9light/autoguice) – iron9light