2016-09-13 1 views
0

注釈付きの特性が与えられた場合、その特性を実装する抽象クラスを生成するにはどうすればよいですか?だから、注釈付きの特性を拡張する抽象スカラクラスをプログラムで生成する方法は?

、マイライブラリで、私はそれを次のように次のようなものを挿入したい...次のユーザーの特性...

@Neuron 
trait SomeTrait { 
    // ... 
} 

を与えられた:私は知っている

abstract class SomeTraitImpl extends SomeTrait 

注意与えられた形質については何もなし、それには@Neuronと注釈されている。

質問Using Scala traits with implemented methods in Javaの答えで説明されているコンセプトを実装してASMでこれを実行しようとしましたが、このコンセプトはScalaコンパイラがバイトコードとして発行するものの表面のみをスクラッチします。私がvar、val、lazy val、abstract overrideなどのすべての可能な組み合わせをマスターすることに成功したとしても、Scalaコンパイラの次のリリースで壊れる可能性は高いです。

私はコンパイル時マクロを書くべきではないかと思われます。しかし、私はScalaのマクロのドキュメントの上に頭を下げています。どんなヒントもありがとうございます!

+0

'@Neuron'アノテーションなしでコードを修正しますか?だから '@Nonon trait SomeTrait'は変わりませんが、' SomeTraitImpl extends SomeTraitImpl extends SomeTrait'はどこかに作成されますよね? – dveim

+0

はい、元の特性はそのまま残しておき、新しい 'SomeTraitImpl'をその隣に挿入するだけです。 –

+0

'@Neuron trait SomeTrait'を持つプロジェクトが' SomeTraitImpl'のプロジェクトとは別にコンパイルされていたとします(マクロはコンパイル時に機能することに注意してください)。 'SomeTraitImpl'のコードはどのように生成されますか?考えられる回避策 - 2番目のプロジェクトでもう1つのマクロ 'NeuronGenerator'を使用すると、' @ Neuron'を見つけてASTを生成するのが最善です。あなたのケースで可能ですか? – dveim

答えて

0

これを行う正しい方法は、Macro Paradiseコンパイラプラグインを使用して@Neuronmacro annotationにし、マクロを実装してコード変換を行うことです。結果のコードは、私が書いた依存性注入のフレームワークであるNeuron DIの一部になりました。

関連する問題