如何在validator中获取项目内所有模型文件的名称与URI?
完全可以直接在Validator类中完成该需求,不需要额外创建独立的文件读取类,利用Xtext内置的资源访问API即可实现,无需自行实现文件遍历逻辑。
实现前提
你使用的是Xtext框架开发自定义DSL,Xtext的Validator默认继承自AbstractDeclarativeValidator,可直接通过依赖注入获取框架内置的资源管理组件。
具体实现步骤
- 首先在你的自定义Validator类中注入两个核心组件:
@Inject private IResourceDescriptionsProvider resourceDescriptionsProvider; @Inject private IProjectConfigProvider projectConfigProvider;
- 在校验方法中通过当前校验对象获取全项目模型URI,示例代码如下:
@Check public void checkCrossFileReference(MyDslRootElement element) { Resource currentRes = element.eResource(); // 获取当前资源所属项目配置 IProjectConfig projectConfig = projectConfigProvider.getProjectConfig(currentRes.getResourceSet()); if (projectConfig == null) { return; } // 从全局索引获取所有模型资源描述 IResourceDescriptions allResDesc = resourceDescriptionsProvider.getResourceDescriptions(currentRes.getResourceSet()); List<URI> allModelUris = new ArrayList<>(); for (IResourceDescription desc : allResDesc.getAllResourceDescriptions()) { URI uri = desc.getURI(); // 过滤仅保留你的DSL后缀的模型文件 if ("mydsl".equals(uri.fileExtension())) { allModelUris.add(uri); } } // 此时allModelUris已包含当前项目内所有.mydsl格式模型文件的URI }
注意事项
- 该方法获取的是Xtext全局索引中的资源,和项目增量构建状态完全同步,比自行通过IO读取文件可靠性更高,不会出现文件修改后缓存不一致的问题
- 如果需要读取依赖项目的模型文件,无需修改注入逻辑,仅调整过滤规则即可
- 若出现只能拿到当前文件URI的情况,检查你的Xtext项目是否关闭了全局索引功能,默认生成的Xtext项目均为开启状态
内容的提问来源于stack exchange,提问作者R4de
相关产品推荐
相关产品推荐

