我有两个相关的问题,我知道如何“通过脚”解决(使用自定义验证器和范围提供程序)。但我很惊讶他们没有在xtext中开箱即用,所以无论如何我都会问(如果我错过了什么)。
我有这个DSL:
Model:
'package' name=QualifiedName
imports+=Import*
entities+=Entity*;
Import:
'import' importedNamespace=QualifiedName;
Entity:
name=ID '{'
references += Reference*
'}';
Reference:
name=ID':'entitiy=[Entity]
;
QualifiedName:
ID('.'ID)*
;
除了在同一个文件中定义多个实体之外,我希望能够定义在同一个包中“活动”的多个文件。我在这里有两个问题:
1)我发现没有明显的方法可以轻松地从当前包中自动导入所有元素。所以如果我有一个文件
package com.test
EntityA {}
和第二个
package com.test
import com.test.EntityA // fails if I remove this line
EntityB{
refToA:EntityA // I could make qualified names work here.
// But that is not the goal.
}
对EntityA
的引用无法解析,除非我明确导入它(这是我想要避免的),尽管它们位于同一名称空间中。
那么:有没有办法轻松启用“当前”包的outimports?
2)我启用了org.eclipse.xtext.validation.NamesAreUniqueValidator
,它适用于同一文件中定义的实体。但是,如果我重新定义这样的导入实体
package com.test
import com.test.EntityA
EntityB{
refToA:EntityA
}
EntityA {}
我没有得到预期的验证错误。在没有编写我自己的验证器的情况下,我可以做些什么吗?
THX。
答案 0 :(得分:0)
要使自动导入工作,您需要使用Xbase和
Model:
'package' name=QualifiedName
importSection=XImportSection?
要使用Xbase,请将其附加到您的语法:with org.eclipse.xtext.xbase.Xbase
有关详细信息,请参阅http://www.lorenzobettini.it/2013/01/the_ximportsection_in_xbase_2_4/。
第二个只能用您自己的验证器AFAIK来解决。原因是你可以使用允许的语法:
import com.test.EntityA as X
private EntityA extends X {}