我们有一个基于Xtext的自定义DSL,并通过Xtend从这个DSL编写的文档中生成C ++代码。以下是DSL的一个简单示例:
component CMP
{
type A
{
B member_1;
}
type B
{
string member_1;
}
}
最终,为每个type
元素生成包含C ++结构(基于component
元素)的头文件。现在出现以下问题:在我的DSL中A
和B
可以正确解析(即使B
的声明时间晚于A
)。但是当我们生成C ++代码并执行resource.contents.filter(TypeElement)
之类的迭代遍历所有type
元素时,它们的传递顺序与文档中声明的顺序相同。这会导致生成的C ++标头出现编译器错误,因为B
的声明时间晚于A
,并且在没有前向声明的情况下编译器无法解析。
我想要的是在这种情况下在IDE中显示错误(即,如果文档中稍后出现的type
存在引用)。这种情况是否有某种标准验证器?如果没有,那么处理这个问题最恰当的方法是什么?
提前谢谢!
答案 0 :(得分:2)
前向引用没有标准验证器。您需要根据交叉引用目标的值定义自己的一个。将ILocationInFileProvider
注入验证器以获取引用实例的区域,并将其与引用所有者的区域进行比较。这将成为检测前向引用的技巧。