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

发布于 2025-01-09 17:02:16 字数 1747 浏览 4 评论 0原文

我在 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 中保存对文档的更改仅第一次反映在语言服务器中,所有后续修改和保存都不会反映在语言服务器中。

I created an Xtext grammar and Language server in eclipse, this was built and added to a vscode extension. I have implemented the below code to start up the language server.

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);
}

Testing the implementation in vscode works and the grammar rules are detected.

The issue I am having is that in vscode on save the changes to the document only reflect in the language server the first time, all subsequent modifications and saves are not reflected in the language server.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

栖迟 2025-01-16 17:02:16

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

@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;
    });
...

I managed to solve my issue, the server was accessing the document resource using the below method.

@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())


}

The above code works when testing in eclipse, but not when used in a a vscode extension.

I changed the above code to get the resource using the following and it worked in both eclipse and vscode extension.

...
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;
    });
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文