如何通过实例的自定义范围生成代码?

时间:2019-09-04 09:13:03

标签: code-generation xtext scoping emf xtend

我正在尝试使用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

希望您能理解我的问题并有解决该问题的想法。感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用

org.eclipse.xtext.nodemodel.util.NodeModelUtils.findNodesForFeature(EObject, EStructuralFeature)获取YourDslPackage.Literals.CHANGE_VIEW_PARAM__PARAM的节点(应该是一个),并要求输入其文本。

或者,您可以将param=[ScreenFeature|QualifiedName]分成两个引用