2011-10-24 2 views
8

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(...))) 
+0

を?それは今のところよく見えます。既存のコンパイル単位にツリーを追加することをお勧めします。そうしないと、ツリーにコードが生成されません。 –

+0

正直言って、私は覚えていない。私はScalaのメーリングリストに尋ねましたが、そこに具体的な回答もなかったので、私は基本的にプラグインを書くことをあきらめました。私は、ますます多くのコードを書いたばかりで、醜くなってきましたが、何も働いていませんでした。 –

+0

メーリングリストリンク:http://groups.google.com/group/scala-language/browse_thread/thread/963923c78201f5e6私が必要とするのは、transform()またはtransformStats()にある最も簡単な例です。まったく関係のないクラスでは全く関係のないクラスです。現在のパッケージの内部ではなく、ルートパッケージレベルでツリーを追加する方法が必要です。 –

答えて

関連する問題