我有一组代表实体类型的概念 Hrrr。
示例概念:
有孩子的Loop
loopCount: IntegerProperty[1]
HttpRequest
有子女url: StringProperty[1]
,hostName: StringProperty[1]
这两个概念都扩展了AbstractTestElement
概念(它定义了常用属性,如名称,注释等)。
我想要生成Loop
和HttpRequest
到baseLanguage,如下所示:
循环:
Loop e = new Loop();
e.setProperty(new IntegerProperty("loopCount", node.loopCount));
的HttpRequest:
HttpRequest e = new HttpRequest();
e.setProperty(new StringProperty("url", node.url));
e.setProperty(new IntegerProperty("host", node.hostName));
我想要的是有一些通用的生成器模板,它涵盖setProperty
的这个通用逻辑,因此不会对不同类型的测试元素重复。
好吧,有些属性需要特定的测试元素处理,但是通常情况下属性是一对一翻译的,因此
这里的问题是:如何将元数据附加到Loop / HttpRequest概念配置? 什么是MPS惯用的方式?
1)虽然我可以使用"属性名称"作为名称放入new XXXProperty
,但理想情况下我会使用HttpRequest.HOST_PROPERTY_NAME
类型的引用,因此"属性的名称"是不够的。
2)我可能会发明我的概念的注释和注释属性,看起来MPS本身并没有使用这种方法。
3)(ab)使用概念行为返回<quotation new StringProperty("url", node.url) >
看起来更加尴尬。
答案 0 :(得分:0)
我宁愿不使用2.和3.因为这两种方法都会将生成器行为添加到您的语言的各个方面,而这些方面并不知道将如何生成事物。它基本上与您的发电机结构紧密相关。
如果你选择1,你仍然可以使用静态类方法。通过在生成器中创建一个新的rootnode,它是一个java类并包含所有字段。然后有通用生成器模板,减少IntegerProperty
等......如果他们有一个共同的超级概念,它应该相当容易。您只需确保在包含概念之前生成属性。这样,您仍然可以在父级中访问它的角色,并使用该信息来生成字段访问。