当前位置: 首页 > news >正文

Eclipse LSP服务的代码分析

Eclipse的c/c++语法服务组件分为三部分插件,从顶层到底层依次是cdt-lsp,lsp4e,lsp4j。其中 lsp4j是lsp协议的java实现,是可以脱离eclipse运行的。lsp4e主要作用是将eclipse的编辑器与lsp4j绑定,cdt-lsp的主要作用是配置clangd的路径。Lsp4j是基础,lsp4e是核心,cdt-lsp是用于配置lsp4e。

org.eclipse.lsp4e.LanguageServerWrapper类是启动clangd可执行程序,多线程监听输入输出的核心。
LanguageServerWrapper的启动

  1. LanguageServerWrapper.start
    HandlerProxy.setEnabled(Object) line: 229方法会在编辑器打开的时候调用

  2. 创建lspStreamProvider
    LanguageServerWrapper.start()方法会调用lspStreamProvider.start(),lspStreamProvider.start()会读取cdt-clangd插件配置的clangd路径和clangd的启动参数,然后启动一个Process。

  3. 创建LanguageServer对象
    启动lspStreamProvider之后,LanguageServerWrapper会创建一个org.eclipse.lsp4j.jsonrpc.Launcher.Builder对象,通过此对象用于配置和创建LanguageServer对象。

  4. 创建StreamMessageProducer对象
    为了实现从Process的标准输出里读取jsonrpc的返回值,创建了一个StreamMessageProducer对象,该对象是读取jsonrpc返回值创建ResponseMessage对象的核心方法。

  5. 创建StreamMessageConsumer对象
    为了往Process的标准输入里面写入一个json对象,创建了一个StreamMessageConsumer对象,该对象的作用是将RequestMessage写入到Process的标准输入。

  6. 创建ConcurrentMessageProcessor对象
    为了持续读取Process的标准输入输出,使用MessageProducer, MessageConsumer作为参数创建了一个ConcurrentMessageProcessor的Runable类并将其放在线程池里面执行。

RequestMessage和ResponseMessage
以鼠标覆盖代码以获得api提示为例介绍,lsp4e插件是如何与clangd可执行程序交互的。

  1. 配置LSPTextHover
    将LSPTextHover与编辑器绑定,使得编辑器获取鼠标覆盖事件时调用LSPTextHover。

  2. 调用getHoverInfo

  3. 创建RequestMessage对象

  1. 发送RequestMessage

  1. 调用StreamMessageConsumer,将RequestMessage对象写入到Process的标准输入

  2. 接收clangd的输出
    发送了RequestMessage对象之后,clangd会输出一些字符串,此时另一个线程的int c = input.read();语句解除等待。

从input里面读取字符串,将该字符串使用GSON解析为ResponseMessage对象

处理获取的message对象。callback.consume(message);

在创建RequestMessage对象时,需要为其赋予一个ID,clangd输出的字符串也有哟个ID,该ID与RequestMessage的ID一致,因此就可以确定ResponseMessage与RequestMessage的一一对应关系。

  1. 将ResponseMessage返回到getHoverInfo方法

  2. 编辑器展示string的提示

http://www.gsyq.cn/news/1618577.html

相关文章:

  • 从MySQL到分布式:一个考试系统数据库的演进之路
  • [hot100]三数之和
  • Codex 中转站怎么配置?Node.js + Codex + CC Switch 完整教程
  • 原来DNS这么简单!全网最通俗的BIND配置教程(附主从复制)
  • 国产IM下一城:混合办公的性能与合规平衡术
  • Linux多线程--cleanup push/pop
  • Claude Code内置隐藏木马近3个月,官方回滚难消中国用户信任危机
  • 当AI写出百万行代码:金融科技的下一站是“可控智能”
  • 学生会议记录软件帮你记录更快更准整理更省心
  • idea卡顿 idea设置了Maximum Heap Size 但current value还是小值
  • 有哪些适合硕士、从开题至定稿的一体化 AI 写作工具推荐?
  • TLS Connect 如何解决了关于证书有效期缩短的问题?
  • Yaskawa XU-ACP130-B11晶圆预对准器
  • Java计算机毕设之基于 Java 的在线学术文献收纳检索系统的设计与实现 基于 Java 的电子书目文献资源管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 【实战分享】.NET 10 + ABP WebAPI 项目发布部署至 Docker Desktop 避坑与实践记录
  • Java毕业设计-基于 SpringBoot 的宠物医院医疗设备与疫苗管理系统的设计与实现 基于 SpringBoot 的宠物医院综合管理系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 半导体硅片制造|纯技术专家线晋升 CTO 完整路径 薪资 关键领域
  • 数据中台建设中“平台优先“vs“治理优先“的技术路线之争
  • 如何完全掌握Cursor Pro破解工具:终极免费使用AI编程助手指南
  • 下载 | Windows Server 2022官方原版ISO映像!(6月更新、标准版、数据中心版、20348.5256)
  • AI工程实践:从问题定义到baseline模型的落地链路
  • 2026中考英语词汇用什么 App 复习?重点看课标词汇、错词巩固和复习反馈
  • vllm与sgLang
  • 机器人即服务(RaaS)时代来了:机器人租赁平台的技术架构与落地实践
  • 90%的iPhone用户都踩过的坑:弹窗、发烫、掉电池,根源全在这
  • unordered_map 与 unordered_set 使用技巧(C++哈希容器高性能实战全解)
  • 2026年门店小程序平台怎么选?预约、核销和会员储值能力对比
  • 景观设计师转型AI:2个月掌握大模型的实战路径
  • STM32与AD74413R构建高精度数据采集系统
  • 把AI流式响应当成编译问题:用状态机消灭200空白