验证用户输入

时间:2015-09-23 10:13:45

标签: java eclipse-plugin eclipse-rcp dsl xtext

我在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评论中所述,我使用了逆向工程并添加了对应的包和类,现在看起来如下:

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
            }
        }
    }
}

该类的包位于插件项目com.language.mylanguage内。我试图验证,如果用户使用 m 作为单位。如果没有,则应显示错误消息。方法error()未定义。我是否必须导入或扩展另一个类?

2 个答案:

答案 0 :(得分:1)

在项目文件夹中,您有一些软件包,其中一个名为yourDSLName.validation 在这个包中有一个xtend类,其中必须指定所有验证规则。 所以在那里你以

的形式添加你的测试方法
@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。

<强>更新
你必须扩展类“AbstractMyLanguageValidator”   
  
问候乌鸦

答案 1 :(得分:1)

您的语言的mwe2工作流可能缺少ValidatorFragment。这个片段创建了存根并为你做了guice绑定,所以你只需要用逻辑填充类。