VSCode扩展不更新语言服务器中的语义模型



我在eclipse中创建了一个Xtext语法和语言服务器,它被构建并添加到vscode扩展中。我已经实现了以下代码来启动语言服务器。

import * as path from 'path';
import { workspace, ExtensionContext } from 'vscode';
import {
LanguageClient,
LanguageClientOptions,
ServerOptions,
Trace,
TransportKind
} from 'vscode-languageclient/node'; // Use this dependency for version >= 7.0.0
export function activate(context: ExtensionContext) {

const executable = 'prototype.dsl.ide.bat';
const languageServerPath =  path.join('server', 'bin', executable);
const serverLauncher = context.asAbsolutePath(languageServerPath);
const serverOptions: ServerOptions = {
run: {
command: serverLauncher,
args: ['-trace', '-log', 'debug'],
transport: TransportKind.ipc
},
debug: {
command: serverLauncher,
args: ['-trace', '-log', 'debug'],
transport: TransportKind.ipc
}
};
const config = workspace.getConfiguration();
const clientOptions: LanguageClientOptions = {
documentSelector: [{ scheme: 'file', language: 'tst' }],
synchronize: {
fileEvents: workspace.createFileSystemWatcher('**/*.*,**/*.tst')
},
initializationOptions: {
config
}
};
const languageClient = new LanguageClient('lspLanguageClient', 'Language Server', serverOptions, clientOptions);
languageClient.start();
languageClient.trace = Trace.Verbose;
let disposable = languageClient.start();

context.subscriptions.push(disposable);
}

在vscode中测试实现,并检测到语法规则。

我遇到的问题是,在vscode中,保存时对文档的更改只会第一次反映在语言服务器中,所有后续的修改和保存都不会反映在语言服务中

我设法解决了我的问题,服务器使用以下方法访问文档资源。

@Override
public void didSave(DidSaveTextDocumentParams params) {
URI uri = URI.createURI(params.getTextDocument().getUri());
XtextResource resource = (XtextResource) getWorkspaceManager().getProjectManager(uri).getResource(uri);
EList<EObject> modelObjects = resource.getContents();
System.out.println("SAVING MODEL " + " (" + resource.getContents().size() + ") -> "
+ ((Greetings) modelObjects.get(0)).getGreetings().get(1).getName())

}

上面的代码在eclipse中测试时有效,但在vscode扩展中使用时无效。

我更改了上面的代码以使用以下代码获得资源,它在eclipse和vscode扩展中都有效。

...
getLanguageServerAccess().doRead(params.getTextDocument().getUri(),
(ILanguageServerAccess.Context context) -> {
Resource resource = context.getResource();
System.out.println("SAVING MODEL " + " (" + resource.getContents().size() + ") -> "
+ ((Greetings) modelObjects.get(0)).getGreetings().get(1).getName())
return null;
});
...

最新更新