Gen 1.0

Gen 1.0

测试已验证
Lang语言 Obj-CObjective C
许可证 BSD
发布最后发布2014年12月

未知归属维护。



Gen 1.0

  • Matt Mower

Gen - Objective-C代码生成器

Gen框架实现了在开发Statec期间构建的一个Objective-C代码生成器的主要部分。我不声称它是完整的,但它支持Objective-C类的多数特性,包括协议和属性。

Gen提供了一组类,如GenClassGenProtocolGenMethod,可用于对一组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运行得相当好,尽管我必须承认它的输出很冗长,还有我还没有时间重构的粗糙边缘。