我在做一些非常相似。基本思想是你的模型必须公开一些对象的列表,然后在你的字符串模板中使用这个列表。例如,假设我有一个非常聪明的实现。我将使用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=","$)
。这将在圆括号之间创建逗号分隔的方法参数列表,就像您期望的那样。