0

あるオブジェクトから別のオブジェクトへのタイプセーフな変換を行うための DSL を作成しようとしています。

src classA
dst classB

map valueA to valueB with ConverterX
map valueC to valueD with ConverterY

結果は次のようになります。

class Converter
{
public void convert(ClassA a, ClassB b)
{
 a.setValueA(ConverterX.convert(b.getValueB))
 b.setValueC(ConverterY.convert(b.getValueD))

}
}

そのためのコードを生成したいだけですが、既に定義したクラスにアクセスできません。その理由は、デフォルトのコンバーターを使用できるようにするためです。パラメータの型を取得できる場合にのみ、デフォルト コンバータの実装を選択できます。

4

2 に答える 2

1

Xtext のドキュメントが示唆するように、JvmTypeReference に固執することができます。関連する型が JvmDeclaredType にキャスト可能な jvmTypeRef.getType() から JvmType を取得できます。JvmTypeReference を使用してすべての Bean プロパティ (クラス メンバー) のリストを取得するヘルパー メソッドを次に示します。

public List<String> getFieldNamesForClass(JvmTypeReference jvmTypeRef) {
    List<String> result = new ArrayList<String>();
    if (jvmTypeRef.getType() instanceof JvmDeclaredType) {
        JvmDeclaredType declaredType = (JvmDeclaredType)jvmTypeRef.getType();
        for (JvmField field : declaredType.getDeclaredFields()) {
            result.add(field.getSimpleName());
        }
    }
    return result;
}

出力は文字列のリスト、ファイル名ですが、JvmField/JvmMember インスタンスを返すように簡単に変更できます。

bitbucket.org/espinosa/deepclonedsl で私の DeepCloneDSL を確認してください

于 2012-12-17T00:24:37.787 に答える
0

JvmTypeReference の代わりに JvmDeclaredType を使用して問題を解決しました。JvmTypeReference はフィールドとメソッドへのアクセスを提供しませんが、JvmDeclaredType は提供します。JvmDeclaredType に存在する QualifiedName を知ることで、JvmTypeReference を生成することもできます。

于 2012-09-17T13:05:28.487 に答える