私は非常に似たようなことをしています。基本的な考え方は、モデルは何らかのオブジェクトのリストを公開する必要があり、そのリストを文字列テンプレート内で使用するというものです。たとえば、非常に頭がおかしい実装があるとしましょう。Java を使用するのは、それが私が最もよく知っていることだからです。あなたはアイデアを得る必要があります。
https://gist.github.com/894632
public class GeneratedClass {
private String accessModifier;
private String name;
private String superClass;
private List<Method> methods;
}
public class Method {
private String comments;
private String name;
private String accessModifier;
private Type returnType;
private List<Argument> arguments;
private String body;
}
public class Argument {
private Type type;
private String name;
}
public class Type {
private String name;
}
私のテンプレートには、次のようなものがあります。
group Java;
class(accessModifier, name, superclass, methods)::=<<
$accessModifier$ class $name$ extends $superclass$ {
$methods:method(); separator="\n"$
}
>>
method(method)::=<<
/**
$method.comments$
*/
$method.accessModifier$ $method.returnType.name$ $name$ ($method.arguments:argument(); separator=","$) {
$method.body$
}
>>
argument(argument)::=<<
$argument.type.name$ $argument.name$
>>
重要なのは、私が持っているメソッド オブジェクトごとにテンプレートを機能的に適用することです。それ$methods:method()
がそうです。空のリストがある場合、テンプレートはまったく呼び出されません。これにより、可変サイズの問題が処理されます。メソッド定義内で同様のことを行います。($method.arguments:argument(); separator=","$)
. これにより、予想どおり、括弧の間にメソッド パラメーターのコンマ区切りリストが作成されます。