当前位置: 首页 > 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.jsqmd.com/news/1106607/

相关文章:

  • dde_autotest_euler开发者指南:如何快速扩展自定义测试方法与断言
  • 浏览器证书风险警告全解析:从HTTPS原理到实战排查指南
  • 从MySQL到分布式:一个考试系统数据库的演进之路
  • [hot100]三数之和
  • IoT物联网-时序数据库
  • (干货满满) Model Context Protocol(MCP) 完全指南从入门到精通,构建 AI 与外部世界的桥梁
  • 【毕业设计】基于 SpringBoot 的校园拾遗寻物互助系统的设计与实现 基于 SpringBoot 的大学生失物登记认领系统(源码+文档+远程调试,全bao定制等)
  • 如何5分钟搞定Windows和Office永久激活:一站式智能激活解决方案指南
  • 通用汽车底特律工厂裁员千余人,机器人替代人工背后是成本与效率的博弈
  • Codex 中转站怎么配置?Node.js + Codex + CC Switch 完整教程
  • 原来DNS这么简单!全网最通俗的BIND配置教程(附主从复制)
  • MIC-3392A2单板计算机
  • 我用 AI 做电商图踩过的 7 个坑,每个都是真金白银买来的
  • 国产IM下一城:混合办公的性能与合规平衡术
  • 为什么深度学习离不开矩阵计算?一篇看懂向量化与 Batch
  • Linux多线程--cleanup push/pop
  • Java毕业设计-基于 Java 的医院医疗设备管理系统的设计与实现 基于 Java 的医院医疗器械资产管控系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • idea卡顿 idea设置了Maximum Heap Size 但current value还是小值
  • 基于全域场介质扰动的光传播机理新模型研究
  • Claude Code内置隐藏木马近3个月,官方回滚难消中国用户信任危机
  • 学生会议记录软件帮你记录更快更准整理更省心
  • 当AI写出百万行代码:金融科技的下一站是“可控智能”
  • 有哪些适合硕士、从开题至定稿的一体化 AI 写作工具推荐?
  • TLS Connect 如何解决了关于证书有效期缩短的问题?
  • 想要找性价比合适的亮片胶,这几家口碑过硬的生产厂家推荐给你
  • 【Python工程化实战】变异测试(Mutation Testing):mutmut 验证测试套件有效性
  • Java毕业设计-基于 Java Web 的茶园文化宣传交流平台的设计与实现 基于 Java Web 的茶园茶农文化交流平台的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • Metasploit实战指南:从工具使用到渗透测试思维框架构建
  • 可以出具软件测试报告的第三方软件测评机构推荐
  • 编程知识点讲解怎么录屏?程序员高质量技术教学录屏避坑指南