LSP4E连接Xtext语言服务器后,编辑器不显示验证错误如何解决?
针对你遇到的LanguageClientImpl.publishDiagnostics因diagnosticConsumer为空抛出NPE,导致验证错误无法显示的问题,可从以下几个方向排查修复:
自定义LaunchConfigurationLanguageServerDefinition初始化DiagnosticConsumer
默认情况下LaunchConfigurationLanguageServerDefinition不会自动初始化diagnosticConsumer,你可以创建该类的自定义子类,重写createLanguageClient方法,手动注入诊断消费者。示例代码如下:public class CustomLaunchConfigServerDefinition extends LaunchConfigurationLanguageServerDefinition { // 构造方法继承父类 @Override protected LanguageClient createLanguageClient(ILanguageServerStreamConnectionProvider provider, IProgressMonitor monitor) { LanguageClientImpl client = (LanguageClientImpl) super.createLanguageClient(provider, monitor); // 初始化DefaultDiagnosticConsumer,关联当前编辑器的问题视图和标记 client.setDiagnosticConsumer(new DefaultDiagnosticConsumer()); return client; } }然后用这个自定义类替换原有的
LaunchConfigurationLanguageServerDefinition注册你的语言服务器。切换至ExtensionLanguageServerDefinition
若你的场景允许,改用ExtensionLanguageServerDefinition来定义语言服务器——该类型会自动完成diagnosticConsumer的初始化流程,完全匹配你参考的Xtext文档中的配置方式,从根源避免NPE问题。升级lsp4e版本
你当前使用的lsp4e 0.13.13版本可能存在LaunchConfigurationLanguageServerDefinition未初始化诊断消费者的已知问题。尝试升级到0.14.x及以上版本,新版本可能修复了该初始化逻辑的漏洞,无需额外自定义代码即可解决问题。手动绑定DiagnosticConsumer到语言客户端
在注册语言服务器的代码逻辑中,找到创建LanguageClientImpl实例的位置,手动调用setDiagnosticConsumer方法设置诊断消费者,确保该实例不为空。比如在关联content-type与启动配置的代码后,追加:LanguageClientImpl client = ...; // 获取已创建的LanguageClientImpl实例 client.setDiagnosticConsumer(new DefaultDiagnosticConsumer());
内容的提问来源于stack exchange,提问作者Alejandro González

