我正在尝试使用xtext编写代码生成器。在相应的DSL中声明了类型的实例,可以通过自定义作用域通过这些实例引用属性(例如,请参见代码)。链接是直接从引用元素到属性执行的,因此没有有关周围实例的信息-但是对于代码生成,我确实需要在DSL文件中添加的限定名称。还有其他可能性,以便我可以确定通过哪个实例引用了实际功能吗?
我的第一个想法是在代码生成时调用ScopeProvider,它可以工作,但不会对两个相同类型的实例做出反应,因为选择了第一个匹配的Attribute-因此,如果有多个实例,生成器将无法区分是哪个实例
第二个想法是包含来自相应DSL文件的信息,但是我不知道如何进行这项工作。我已经进行了很多搜索,是否有可能从当前模型中获取相应的DSL文件,但是找不到任何有用的答案。
第三个想法是将实例作为引用字段中的隐藏字段包括在内-但我也找不到该方法的任何解决方案。
语法的小提取(简体):
Screen:
(features += ScreenFeature)*
;
ScreenFeature:
name=ID ':' type=[ClientEntity]
;
ClientEntity:
(features += Feature)*
;
Feature:
name=ID ':' type=DefaultValue
;
DefaultValue:
'String'|'int'|'double'|'boolean'
;
ChangeViewParam:
param=[ScreenFeature|QualifiedName] ':' value=[ScreenFeature|QualifiedName]
;
DSL-示例:
ClientEntity Car {
id : int
name : String
}
Screen Details {
car : Car
car2 : Car
[...]
car2.id : car.id
}
第一种方法的生成输出(行:car2.id:car.id):
car.id:car.id
预期:
car2.id:car.id
希望您能理解我的问题并有解决该问题的想法。感谢您的帮助!
答案 0 :(得分:0)
您可以使用
org.eclipse.xtext.nodemodel.util.NodeModelUtils.findNodesForFeature(EObject, EStructuralFeature)
获取YourDslPackage.Literals.CHANGE_VIEW_PARAM__PARAM
的节点(应该是一个),并要求输入其文本。
或者,您可以将param=[ScreenFeature|QualifiedName]
分成两个引用