Gen - Objective-C代码生成器
Gen框架实现了在开发Statec期间构建的一个Objective-C代码生成器的主要部分。我不声称它是完整的,但它支持Objective-C类的多数特性,包括协议和属性。
Gen提供了一组类,如GenClass
,GenProtocol
和GenMethod
,可用于对一组Objective-C类和协议进行建模。在方法级别,代码使用模板字符串插入。
这是一个从Statec源代码创建类的示例
- (GenClass *)stateBaseClass {
// Create the base class <FooState> for the states
GenClass *class = [[GenClass alloc] initWithName:[NSString stringWithFormat:@"%@%@State",
[[self machine] prefix],
[[self machine] name]]];
GenProperty *nameProperty = [[GenProperty alloc] initWithType:@"NSString*"
name:@"name"
attributes:GenPropertyStrong | GenPropertyReadonly];
[class addProperty:nameProperty];
GenMethod *initializer = [[GenMethod alloc] initWithScope:GenInstanceScope
returnType:@"id"
selector:@selector(initWithName:)];
[initializer addArgument:[[GenArgument alloc] initWithType:@"NSString*"
name:@"name"]];
[[initializer body] append:
@" self = [super init];\n"
@" if( self ) {\n"
@" _name = name;\n"
@" }\n"
@" return self;\n"
];
[class addMethod:initializer];
return class;
}
最后,一切都被封装在一个了解如何编写相应.m/.h文件及其内容的GenCompilationUnit
对象中。在方法体级别上,它分解为实质上的stringWithFormat:在实际中,尝试用模型表示代码中的方法结构变得繁琐,回报甚微,我发现将它们作为格式字符串编写更加简单。
实际上,Gen运行得相当好,尽管我必须承认它的输出很冗长,还有我还没有时间重构的粗糙边缘。