xtext:autoimport和-validate当前包

时间:2015-05-27 12:10:02

标签: xtext

我有两个相关的问题,我知道如何“通过脚”解决(使用自定义验证器和范围提供程序)。但我很惊讶他们没有在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。

1 个答案:

答案 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 {}