Scalaコンパイラプラグインで新しいコードを生成するために、作業クラスを作成しました。次の論理的なステップは、それらのクラスを新しい存在しないパッケージに入れることです。 Javaでは、パッケージは基本的にディレクトリ名ですが、Scalaではパッケージがはるかに複雑に見えます。これまでのところ、コンパイラプラグインが新しいパッケージを作成する例は見つかりませんでした。ご理解の私の現在のレベルでScalaコンパイラプラグインで新しい* package *を作成する
、私は私が最初のパッケージのシンボルを作成する必要があるだろうと思うだろう:
parentPackage.newPackage(...)
// ...
以降PackageDefとパッケージのツリーを作成するよりも。しかし、PackageDefは、期待通りにシンボルをパラメータとして取っておらず、次を検索していません。
Scala newPackage PackageDef
何も役に立ちません。だから、私はこれらの2つのステップを一緒に行う必要はないようです。おそらく1つは私のためにコンパイラによって行われますが、私はどちらがわかりません。これまでのところ、私が持っていることは次のようになります。
val newPkg = parentPackage.newPackage(NoPosition, newTermName(name))
newPkg.moduleClass.setInfo(new PackageClassInfoType(new Scope,
newPkg.moduleClass))
newPkg.setInfo(newPkg.moduleClass.tpe)
parentPackage.info.decls.enter(newPkg)
// ...
val newPkgTree = PackageDef(Ident(newPkg.name), List(ClassDef(...)))
を?それは今のところよく見えます。既存のコンパイル単位にツリーを追加することをお勧めします。そうしないと、ツリーにコードが生成されません。 –
正直言って、私は覚えていない。私はScalaのメーリングリストに尋ねましたが、そこに具体的な回答もなかったので、私は基本的にプラグインを書くことをあきらめました。私は、ますます多くのコードを書いたばかりで、醜くなってきましたが、何も働いていませんでした。 –
メーリングリストリンク:http://groups.google.com/group/scala-language/browse_thread/thread/963923c78201f5e6私が必要とするのは、transform()またはtransformStats()にある最も簡単な例です。まったく関係のないクラスでは全く関係のないクラスです。現在のパッケージの内部ではなく、ルートパッケージレベルでツリーを追加する方法が必要です。 –