验证用户输入
Validate user input
我在我的 Xtext DSL 中实施了以下规则:
House:
'House' name=ID
description=STRING?
('height' height=DOUBLE heightUnit=UNIT)? &
('width' width=DOUBLE widthUnit=UNIT)? &
'end' 'House'
;
enum UNIT:
m = 'm' |
cm = 'cm'
;
它允许我使用基于该 DSL 的编辑器定义以下内容:
House MyHouse
"This is my house"
height 15.5 m
width 3000.2 cm
end MyHouse
如何验证用户定义的单位?例如,高度和宽度都应该有单位m,如果用户定义了不同的东西(例如cm),编辑器应该显示一个错误。
我查看了 this 网站,它描述了如何创建验证规则,但是我必须在哪里注册它们,以便它们可以正常工作?
更新: 正如 Ravens 在他 post 下的评论中所述,我使用了逆向工程并添加了 correspondig 包和 class,现在如下所示:
package com.language.validation
import com.language.mylanguage.House
import org.eclipse.xtext.validation.Check
class MylanguageValidator {
@Check
def unitCheck(House house) {
val hWidth = house.width
if (hWidth != null) {
if (!hWidth.equals("m")) {
val errorMsg = "House width must be defined in m";
// error method undefined
}
}
}
}
class的Package在插件项目com.language.mylanguage
里面。我正在尝试验证用户是否使用 m 作为单位。如果没有,应该会出现一条错误消息。方法 error()
未定义。我是否必须导入或扩展另一个 class?
在您的项目文件夹中有几个包,其中一个名为 yourDSLName.validation。
在这个包中有一个 xtend class 必须指定所有验证规则。
所以在那里你以
的形式添加你的测试方法
@Check
def unitCheck(House house) {
val hUnit = house.getHeigthUnit()
val wUnit = house.getWidthUnit()
if(hUnit != null && wUnit != null && !hUnit.equals(wUnit)) {
val errorMsg = "Units have to be the same!"
error(errorMsg, #Package.eINSTANCE.House_widthUnit)
}
}
注意:您必须将#Package 替换为您的 DSL 的 packageName。
更新:
您必须扩展 class "AbstractMyLanguageValidator"
问候乌鸦
您的语言的 mwe2 工作流程可能缺少 ValidatorFragment。此片段创建存根并为您执行 guice 绑定,因此您只需用逻辑填充 class。
我在我的 Xtext DSL 中实施了以下规则:
House:
'House' name=ID
description=STRING?
('height' height=DOUBLE heightUnit=UNIT)? &
('width' width=DOUBLE widthUnit=UNIT)? &
'end' 'House'
;
enum UNIT:
m = 'm' |
cm = 'cm'
;
它允许我使用基于该 DSL 的编辑器定义以下内容:
House MyHouse
"This is my house"
height 15.5 m
width 3000.2 cm
end MyHouse
如何验证用户定义的单位?例如,高度和宽度都应该有单位m,如果用户定义了不同的东西(例如cm),编辑器应该显示一个错误。
我查看了 this 网站,它描述了如何创建验证规则,但是我必须在哪里注册它们,以便它们可以正常工作?
更新: 正如 Ravens 在他 post 下的评论中所述,我使用了逆向工程并添加了 correspondig 包和 class,现在如下所示:
package com.language.validation
import com.language.mylanguage.House
import org.eclipse.xtext.validation.Check
class MylanguageValidator {
@Check
def unitCheck(House house) {
val hWidth = house.width
if (hWidth != null) {
if (!hWidth.equals("m")) {
val errorMsg = "House width must be defined in m";
// error method undefined
}
}
}
}
class的Package在插件项目com.language.mylanguage
里面。我正在尝试验证用户是否使用 m 作为单位。如果没有,应该会出现一条错误消息。方法 error()
未定义。我是否必须导入或扩展另一个 class?
在您的项目文件夹中有几个包,其中一个名为 yourDSLName.validation。
在这个包中有一个 xtend class 必须指定所有验证规则。
所以在那里你以
@Check
def unitCheck(House house) {
val hUnit = house.getHeigthUnit()
val wUnit = house.getWidthUnit()
if(hUnit != null && wUnit != null && !hUnit.equals(wUnit)) {
val errorMsg = "Units have to be the same!"
error(errorMsg, #Package.eINSTANCE.House_widthUnit)
}
}
注意:您必须将#Package 替换为您的 DSL 的 packageName。
更新:
您必须扩展 class "AbstractMyLanguageValidator"
问候乌鸦
您的语言的 mwe2 工作流程可能缺少 ValidatorFragment。此片段创建存根并为您执行 guice 绑定,因此您只需用逻辑填充 class。