Java Xtext验证在多个插件上拆分
我希望根据加载的插件有不同的验证活动Java Xtext验证在多个插件上拆分,java,validation,dependency-injection,eclipse-plugin,xtext,Java,Validation,Dependency Injection,Eclipse Plugin,Xtext,我希望根据加载的插件有不同的验证活动 mylang.database插件应该提供如下警告 mylangElement { id = "helloWorld" //Warning id should start with an upper case } 而mylang.server插件应该像 mylangElement { id = "helloWorld" //Warning id must not exceed 8 letters
mylang.database
插件应该提供如下警告
mylangElement {
id = "helloWorld" //Warning id should start with an upper case
}
而mylang.server
插件应该像
mylangElement {
id = "helloWorld" //Warning id must not exceed 8 letters
}
(如果两个插件都存在,则可能两者都有)
推荐的方法是什么
- 如果插件存在,root
validator会改变行为(yikes)mylang
- 使用基本的eclipse验证扩展点(慢?)
- 编写API,以便插件可以向根
validator注册额外的验证mylang
- 有一种方法是由
提供的,带有整洁的xtext
注释@Check
是否考虑简单地挂入XTeX已经使用的验证机制中。我假设你所说的“加载”是指包含验证器的插件被激活(因此插件被激活)
然后您可以执行类似的操作(在activator start中) 使用myvalidatorpublic class MyValidator extends AbstractDeclarativeValidator {
public static final String INVALID_NAME = "invalidName";
@Override
protected List<EPackage> getEPackages() {
return Collections.singletonList(MyDslPackage.eINSTANCE);
}
@Check
public void checkGreeting(Greeting g) {
if (!Character.isUpperCase(g.getName().charAt(0))) {
warning("Name should start with a capital", MyDslPackage.Literals.GREETING__NAME, INVALID_NAME);
}
}
}
公共类MyValidator扩展了AbstractDeclarativeValidator{
公共静态最终字符串无效\u NAME=“invalidName”;
@凌驾
受保护的列表getEPackages(){
返回集合.singletonList(MyDslPackage.eINSTANCE);
}
@检查
公共空支票问候语(问候语g){
if(!Character.isUpperCase(g.getName().charAt(0))){
警告(“名称应以大写字母开头”,MyDslPackage.Literals.GREETING\u Name,无效的\u Name);
}
}
}
或者,您可以创建如下所示的类
public class MyValidator extends AbstractDeclarativeValidator {
public static final String INVALID_NAME = "invalidName";
@Override
protected List<EPackage> getEPackages() {
return Collections.singletonList(MyDslPackage.eINSTANCE);
}
@Check(CheckType.FAST)
public void checkFast(EObject g) {
// TODO
}
@Check(CheckType.NORMAL)
public void checkNormal(EObject g) {
// TODO
}
@Check(CheckType.EXPENSIVE)
public void checkExpensive(EObject g) {
// TODO
}
}
公共类MyValidator扩展了AbstractDeclarativeValidator{
公共静态最终字符串无效\u NAME=“invalidName”;
@凌驾
受保护的列表getEPackages(){
返回集合.singletonList(MyDslPackage.eINSTANCE);
}
@检查(CheckType.FAST)
公共无效检查快速(EObject g){
//待办事项
}
@检查(检查类型。正常)
公共无效检查正常(EOObject g){
//待办事项
}
@支票(支票类型。昂贵)
公共无效检查(EOObject g){
//待办事项
}
}
在MyDslRuntime或类似的首选uimodule中绑定它
class MyDslUiModule extends AbstractMyDslUiModule {
@SingletonBinding(eager=true) def Class<? extends MyValidator> bindMyValidator() {
return MyValidator
}
}
类MyDslUiModule扩展了AbstractMyDslUiModule{
@SingletonBinding(eager=true)def类
class MyDslUiModule extends AbstractMyDslUiModule {
@SingletonBinding(eager=true) def Class<? extends MyValidator> bindMyValidator() {
return MyValidator
}
}