You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Theia编辑器中为CodeGen实现进度条:需获取执行进度值

实现Theia编辑器Java代码生成的进度条功能

针对你在Theia中通过LSP的IExecutableCommandService生成Java代码时需要实现进度条的需求,可通过以下步骤完成:

1. 后端LSP扩展进度通知能力

首先需要在后端LSP的命令实现中,利用LSP标准的Progress API在代码生成的关键节点发送进度更新:

  • 注入LSP的ProgressService来创建进度任务
  • 在代码生成的不同阶段(初始化、模板处理、代码生成等)上报进度百分比和状态信息
  • 示例代码(Java后端侧):
@Inject
private ProgressService progressService;

@Override
public CompletableFuture<Object> executeCommand(ExecuteCommandParams params, ProgressMonitor monitor) {
    // 创建带唯一标识的进度任务,用于前端区分
    try (ProgressTask task = progressService.createTask("java-code-gen-task", "生成Java代码")) {
        // 初始化阶段
        task.report(0, "初始化代码生成环境");
        // 执行初始化逻辑(如加载模板、连接数据源)...

        // 模板与数据源处理阶段
        task.report(30, "处理代码模板与业务数据");
        // 执行模板渲染、数据映射逻辑...

        // 代码文件生成阶段
        task.report(70, "生成并写入Java代码文件");
        // 执行文件生成、格式化逻辑...

        // 完成阶段
        task.report(100, "Java代码生成完成");
    }
    return CompletableFuture.completedFuture(Collections.emptyMap());
}

2. 前端Theia命令模块监听并渲染进度条

在Theia的命令贡献模块中,需要监听LSP发送的进度事件,并关联到前端进度组件:

  • 调用Theia的ProgressService创建UI进度条
  • 订阅LSP的进度更新事件,根据后端传入的唯一标识过滤并更新进度条状态
  • 示例代码(TypeScript前端侧):
import { CommandContribution, CommandRegistry, ProgressService } from '@theia/core/lib/common';
import { inject, injectable } from '@theia/core/shared/inversify';
import { LanguageClient } from '@theia/languages/lib/browser';

@injectable()
export class JavaCodeGenCommand implements CommandContribution {

    @inject(ProgressService)
    protected readonly progressService: ProgressService;

    @inject(LanguageClient)
    protected readonly languageClient: LanguageClient;

    registerCommands(registry: CommandRegistry): void {
        registry.registerCommand({
            id: 'java.code.generate',
            label: '生成Java代码'
        }, {
            execute: async () => {
                // 创建前端进度条组件
                const progress = await this.progressService.showProgress({
                    title: '生成Java代码',
                    cancellable: false
                });

                // 订阅LSP的进度更新事件,过滤指定任务标识
                const progressDisposable = this.languageClient.onProgress((params) => {
                    if (params.token === 'java-code-gen-task') {
                        const { percentage, message } = params.value;
                        progress.report({ message, percentage });
                        
                        // 进度完成后清理监听并关闭进度条
                        if (percentage === 100) {
                            progressDisposable.dispose();
                            progress.cancel();
                        }
                    }
                });

                // 调用后端LSP执行命令
                try {
                    await this.languageClient.sendRequest('workspace/executeCommand', {
                        command: 'java.generate.code',
                        arguments: []
                    });
                } catch (error) {
                    // 处理命令执行错误,更新进度条状态
                    progress.report({ message: '代码生成失败', percentage: 0 });
                    progressDisposable.dispose();
                    setTimeout(() => progress.cancel(), 2000);
                }
            }
        });
    }
}

3. 核心关联要点

  • 后端创建ProgressTask时指定的token(如java-code-gen-task)必须和前端过滤的标识一致,避免跨任务进度干扰
  • 确保使用的LSP版本支持Progress API(LSP 3.15及以上版本已包含该能力)
  • 若需要支持取消操作,可将进度条设置为cancellable: true,并在后端监听取消事件终止代码生成流程

内容的提问来源于stack exchange,提问作者Siddharth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:15:28