如何对语言服务器中的文件系统事件做出反应

我正在为VS Code的自定义语言编写语言服务器协议扩展。我正在使用OmniSharp语言服务器API用C#编写服务器部分。

我在实现DidChangeWatchedFile功能时遇到麻烦。即使我实现了 IDidChangeWatchedFilesHandler 接口,也不会从客户端或服务器发送通知。

根据规范,应该有一个 DidChangeWatchedFilesRegistrationOptions 接口,该接口可以注册自定义文件事件,但在OmniSharp的任何地方都找不到此接口。我希望能够对在工作区中更改/添加/删除特定文件并且未在编辑器中打开文件的情况做出反应(因此不能由 DidChangeTextDocument 处理程序处理)。

任何提示/建议都将受到欢迎。

谢谢!

lixuanpei 回答:如何对语言服务器中的文件系统事件做出反应

我只需要自己弄清楚!假设您有扩展主机和语言服务器,这来自两个地方:

  1. 在扩展主机(extension.ts)中,您需要创建LanguageClientOptions并设置synchronize属性。这是直接来自vscode扩展示例的示例:

    https://github.com/microsoft/vscode-extension-samples/blob/master/lsp-sample/client/src/extension.ts#L39-L46

  2. 只需在服务器(server.ts)中为onDidChangeWatchedFiles添加一个回调,该回调也来自扩展示例:

    https://github.com/microsoft/vscode-extension-samples/blob/master/lsp-sample/server/src/server.ts#L173-L176

如果添加或删除文件系统观察程序捕获的文件,则应该看到事件弹出。

仅需要注意的另一件事是,您需要进行一系列更改,并且必须处理每个更改。以下是我为扩展程序处理的方式。

import { FileChangeType } from 'vscode-languageserver';

connection.onDidChangeWatchedFiles(async _change => {
  // Monitored files have change in VSCode
  connection.console.log('We received an file change event');

  // process each change
  for (let i = 0; i < _change.changes.length; i++) {
    const change = _change.changes[i];
    switch (change.type) {
      case FileChangeType.Created:
        await idl.addDocumentSymbols(change.uri);
        break;
      case FileChangeType.Deleted:
        await idl.removeDocumentSymbols(change.uri);
        break;
      case FileChangeType.Changed:
        await idl.updateDocumentSymbols(change.uri);
        break;
      default:
        // do nothing
        break;
    }
  }

  // detect and send problems
  idl.detectProblems(true);
});
本文链接:https://www.f2er.com/2840423.html

大家都在问