Xtext 禁用特定产品的验证检查

Xtext disable validation check for specfic product

我有两个产品。例如 A 和 B。在 A 产品中,我需要启用一个存在于 AValidator.xtend 文件中的验证,而 B 产品取决于 A,因此当我 运行 B 产品需要禁用该检查时警告。

AValidator.xtend:

@Check
def validateElement(Element e)
{
    warning('''Element «e.name» missing in files.''', e,         package.Literals.NAMED__NAME)
}

同样的检查不应该用于 BProduct。

是否有任何覆盖功能可以做这些?

非常感谢。

有两种方法可以解决这个问题:

  • 您可以添加一个系统 属性(可能是 boolean 标志)以启用此功能。在 A 的 ini 文件中,您启用该选项。 B中你省略了。

  • 您可以将插件拆分为一个库,然后拆分为两个您在产品中使用的插件。

拆分插件是这样的:

您需要创建一个新插件并将所有共享代码复制到其中。它还可以包含两种产品相同的验证代码。将验证码命名为 SharedValidator

在此插件中,您需要重命名 DslRuntimeModuleDsl 是您的语法名称,它扩展了包含验证绑定的 AbstractDslRuntimeModule)。将其重命名为 SharedDslRuntimeModule.

然后您为产品 A 创建一个插件。它包含特定的验证。这个 class 需要扩展 SharedValidator

您还需要创建一个扩展 SharedDslRuntimeModule 的绑定,这样您就可以绑定新的验证器 class.

这是大概的轮廓。您还必须 copy/change 几个其他文件(例如 DslStandaloneSetupplugin.xml),但是当您修复编译错误时,这些更改应该会变得很明显。

...也许flag更简单

此问题的解决方案是创建扩展点。

我已经使用一种方法在 AProduct 验证器插件中创建了一个扩展点,其名称为 IProdcutEnabled 接口。

并在 BProduct 验证器插件中添加了该扩展点。

然后是 AProduct 验证器 class,验证我检查了扩展点是否被任何产品使用。如果已使用,则不显示警告。