我在做一些非常相似。基本思想是你的模型必須公開一些對象的列表,然後在你的字符串模板中使用這個列表。例如,假設我有一個非常聰明的實現。我將使用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=","$)
。這將在圓括號之間創建逗號分隔的方法參數列表,就像您期望的那樣。