如何解决通过语言服务器协议显式调用 Xtext Generator
我有一个使用 Xtext 和语言服务器协议的 DSL 项目。
现在我想从客户端(在我的例子中是 VS Code)触发一个在服务器上执行的生成器。 不是自动(我知道怎么做),而是由用户通过 VS Code 命令明确触发。
我知道 Xtext 中的 IExecutableCommandService 并且我知道如何连接它。 但是我不知道如何从给定的文件路径中检索相应的资源:
@Override
public Object execute(ExecuteCommandParams params,ILanguageServerAccess access,CancelIndicator cancelIndicator) {
if ("c4.generator.type".equals(params.getCommand())) {
// fileURI passed from client to the server
String fileURI = ((JsonPrimitive)params.getArguments().get(0)).getAsString();
// This is where I stuck
Resource resource = whatAPItoCallToRetrieveResourceFromFile(fileURI);
// Call the generator then
doGenerate(resource);
}
return "Unknown Command";
}
用例与此博客中描述的相同:https://dietrich-it.de/xtext/2011/10/15/xtext-calling-the-generator-from-a-context-menu/ 但描述仅适用于 Eclipse(不使用 lsp)。
解决方法
如果您已经拥有正确的 URI,您应该能够使用 XtextResourceSet
来访问资源:
final XtextResourceSet rs = new XtextResourceSet();
final Resource r = rs.getResource(fileURI,true);
doGenerate(r);
否则,您可以使用 access.doReadIndex
访问 Xtext 索引并遍历所有资源以搜索感兴趣的资源:
final XtextResourceSet rs = new XtextResourceSet();
final Function<ILanguageServerAccess.IndexContext,Boolean> func = (
ILanguageServerAccess.IndexContext ctxt) -> {
for (final IResourceDescription rd: ctxt.getIndex().getAllResourceDescriptions()) {
if(<check_rd>) {
Resource r = rs.getResource(rd.getURI(),true);
doGenerate(r);
}
}
return true;
};
access.doReadIndex(func);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。