如果在声明类型之前引用类型,如何在 Xtext IDE 中显示错误
How to show an error in the Xtext IDE if a type is referenced before it is declared
我们有一个自定义 Xtext-based DSL,并通过 Xtend 从用这个 DSL 编写的文档生成 C++ 代码。这是 DSL 的一个简单示例:
component CMP
{
type A
{
B member_1;
}
type B
{
string member_1;
}
}
最终,为每个 component
元素生成一个包含 C++ 结构(基于 type
元素)的 header 文件。现在出现以下问题:在我的 DSL 中 A
和 B
可以正确解析(即使 B
晚于 A
声明)。但是当我们生成 C++ 代码并执行类似 resource.contents.filter(TypeElement)
的操作以遍历所有 type
元素时,它们将按照文档中声明的顺序交付。这会导致生成的 C++ header 出现编译器错误,因为 B
的声明晚于 A
,并且在没有前向声明的情况下无法由编译器解析。
我想要的是在这种情况下显示 IDE 中的错误(即,如果存在对 type
的引用,该引用将在文档的后面出现)。是否有针对此类场景的某种标准验证器?如果没有,处理这个问题的最恰当方法是什么?
提前致谢!
前向引用没有标准验证器。您需要根据交叉引用目标的值自行定义一个。将 ILocationInFileProvider
注入您的验证器以获取引用实例的区域并将其与引用所有者的区域进行比较。这将起到检测前向引用的作用。
我们有一个自定义 Xtext-based DSL,并通过 Xtend 从用这个 DSL 编写的文档生成 C++ 代码。这是 DSL 的一个简单示例:
component CMP
{
type A
{
B member_1;
}
type B
{
string member_1;
}
}
最终,为每个 component
元素生成一个包含 C++ 结构(基于 type
元素)的 header 文件。现在出现以下问题:在我的 DSL 中 A
和 B
可以正确解析(即使 B
晚于 A
声明)。但是当我们生成 C++ 代码并执行类似 resource.contents.filter(TypeElement)
的操作以遍历所有 type
元素时,它们将按照文档中声明的顺序交付。这会导致生成的 C++ header 出现编译器错误,因为 B
的声明晚于 A
,并且在没有前向声明的情况下无法由编译器解析。
我想要的是在这种情况下显示 IDE 中的错误(即,如果存在对 type
的引用,该引用将在文档的后面出现)。是否有针对此类场景的某种标准验证器?如果没有,处理这个问题的最恰当方法是什么?
提前致谢!
前向引用没有标准验证器。您需要根据交叉引用目标的值自行定义一个。将 ILocationInFileProvider
注入您的验证器以获取引用实例的区域并将其与引用所有者的区域进行比较。这将起到检测前向引用的作用。