通过语言服务器协议显式调用 Xtext 生成器

Invoking Xtext Generator via Language Server Protocol explicitly

我有一个使用 Xtext 和语言服务器协议的 DSL 项目。

现在我想从客户端(在我的例子中是 VS 代码)触发一个生成器在服务器上执行。 不是自动的(我会知道该怎么做),而是由用户通过 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);