Xtext 多重 DSL 交叉引用:如何检索正确的代理解析资源集

Xtext Multiple DSL cross referencing: How to retrieve correct proxy-resolved resourceset

我 运行 在 Xtext 2.7.2 配置 2 DSL 语言一起工作时遇到问题:

我有 2 个 DSL,文件扩展名为:.model 和 .type,一个项目可以在 src/model/ 文件夹下包含 2 种类型的文件。

.type 文件示例

entity ent2{
  name="avv"
}

.model 文件示例

block{
  using ent2
}

只是一个关于链接如何工作的简单示例。现在的情况是,在块 dsl returns 的 IGenerator class 中,具有 dsl 类型值的完全解析资源:

class BlockGenerator implements IGenerator {

    override void doGenerate(Resource resource, IFileSystemAccess fsa) {

        (Block)resource.getContents().get(0); //correct with entity type 
    }

}

但是在 Model.UI 项目中,我们尝试实现一个函数以从用户在工作区中选择的 IProject 获取资源集,假设 IProject 将传递给下面的 class:

@Inject
IResourceSetProvider resourceSetProvider;

protected BlockModel loadModelResource(IProject project) {
    ResourceSet rs = resourceSetProvider.get(project);

    File srcModelDirectory = new File(project.getLocation().toFile()
            .getAbsolutePath()
            + "/src/models/");

    File[] files = srcModelDirectory.listFiles(new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".model");
        }
    });

    File a = files[0];

    Resource resource = rs.getResource(URI.createURI(a.toString()), true);

    EcoreUtil.resolveAll(resource);

    return (BlockModel) resource.getContents().get(0);
}

然而这次,如果我们按照我在上面提到的相同示例,ent2 的名称为空。像往常一样检索注入器 UI 由 :

生成的项目
  public class BlockExecutableExtensionFactory extends  AbstractGuiceAwareExecutableExtensionFactory {

      @Override
      protected Bundle getBundle() {
        returnBlockActivator.getInstance().getBundle();
      }

      @Override
      protected Injector getInjector() {
        return BlockActivator.getInstance().getInjector(BlockActivator.ORG_BLOCK);
}

}

谁能帮我解决这个问题?我无法弄清楚 xtext 为 'entity' ent2

的所有值返回 null 背后的问题是什么

您应该使用 Eclipse 资源 API 而不是 java.io.File。像这样的东西应该可以找到所有文件。

IFolder folder = IProject.getFolder("src/model");
IResource[] members = folder.members();
for(IResource member: members) {
  if (member instanceof IFile && member.getFileExtension().equalsIgnoreCase("model") {
    file = (IFile)member;
    break;
  }
}

请查看 this 有关如何获取正确平台的常见问题解答条目:/Eclipse IFile 的资源 URI