vscode插件快餐教程(3) - Diagnostic

上一节我们介绍了语言扩展的大致情况,这一节我们开始深入一些细节。

诊断信息

语言扩展中一个重要的功能是代码扫描的诊断信息。这个诊断信息是以vscode.Diagnostic为载体呈现的。
我们来看一下vscode.Diagnostic类的成员和与相关类的关系:

以小到大,这些类为:

  • Position: 定位到一行上的一个字符的坐标
  • Range: 由起点和终点两个Position决定
  • Location: 一个Range配上一个URI
  • DiagnosticRelatedInformation: 一个Location配一个message
  • Diagnostic: 主体是一个message字符串,一个Range和一个DiagnosticRelatedInformation.

构造一个诊断信息

下面我们来构造一个诊断信息。
我们随便造一个BASIC语言的例子吧,保存为test.bas:

dim i as integerfor i = 1 to 10 step 1for i = 1 to 10 step 1print "*";next i
next i

这个例子中,循环控制变量在外循环和内循环中被重用,导致外循环失效。
出现问题的Range是第4行的第9字符到第10字符。位置是以0开始的,所以我们构造(3,8)到(3,9)这样两个Position为首尾的Range.

        new vscode.Range(new vscode.Position(3, 8), new vscode.Position(3, 9),)

有了Range,加上问题描述字符串,和问题的严重程序三项,就可以构造一个Diagnostic来。

    let diag1: vscode.Diagnostic = new vscode.Diagnostic(new vscode.Range(new vscode.Position(3, 8), new vscode.Position(3, 9),),'循环变量重复赋值',vscode.DiagnosticSeverity.Hint,)

诊断相关信息

上一节提到,有Range,有message,有严重程度这三项,就可以构造一个Diagnostic信息出来。

除此之外,还可以设置一些高级信息。
第一个是来源,比如来自eslint某版本,使用了某某规则之类的。这个可以写到Diagnostic的source属性中。

diag1.source = 'basic-lint';

第二个是错误码,有助于分类和查询。这个是code属性来表示的,既可以是一个数字,也可以是一个字符串。

diag1.code = 102;

第三个是相关信息。以上节例子来说,我们说i已经被赋值过了,那么可以进一步告诉开发者是在哪里被赋值过了。所以要有一个uri,能找到代码的地址。还要有一个Range,告诉在uri中的具体位置。前面介绍过了,这是一个vscode.Location结构。

    diag1.relatedInformation = [new vscode.DiagnosticRelatedInformation(new vscode.Location(document.uri,new vscode.Range(new vscode.Position(2, 4), new vscode.Position(2, 5))),'第一次赋值')];

下面我们把它们集合起来,针对上面的test.bas进行错误提示。主要就是将上面的提示信息写到传参进来的DiagnosticCollection中。

import * as vscode from 'vscode';
import * as path from 'path';export function updateDiags(document: vscode.TextDocument,collection: vscode.DiagnosticCollection): void {let diag1: vscode.Diagnostic = new vscode.Diagnostic(new vscode.Range(new vscode.Position(3, 8), new vscode.Position(3, 9),),'循环变量重复赋值',vscode.DiagnosticSeverity.Hint,);diag1.source = 'basic-lint';diag1.relatedInformation = [new vscode.DiagnosticRelatedInformation(new vscode.Location(document.uri,new vscode.Range(new vscode.Position(2, 4), new vscode.Position(2, 5))),'第一次赋值')];diag1.code = 102;if (document && path.basename(document.uri.fsPath) === 'test.bas') {collection.set(document.uri, [diag1]);} else {collection.clear();}
}

触发诊断信息的事件

下面我们在plugin的activate函数中增加到于刚才写的updateDiags函数的调用。

 const diag_coll = vscode.languages.createDiagnosticCollection('basic-lint-1');if (vscode.window.activeTextEditor) {diag.updateDiags(vscode.window.activeTextEditor.document, diag_coll);}context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor((e: vscode.TextEditor | undefined) => {if (e !== undefined) {diag.updateDiags(e.document, diag_coll);}}));

运行一下,在新启动的vscode中打开test.bas,然后在最后任意编辑一下代码,激活事情就可以触发。运行界面如下:

从中可以看到,第4行的i变量下面有一个提示,错误码102,source是basic-lint。第二行是DiagnosticRelatedInformation的信息。

vscode插件快餐教程(3) - Diagnostic相关推荐

  1. vscode插件快餐教程(10) - 设置

    vscode插件快餐教程(10) - 设置 在插件中,根据用户的环境和个性化的不同,需要增加一些配置项. 读写配置项 可以通过vscode.workspace.getConfiguration()方法 ...

  2. vscode插件快餐教程(5) - 代码补全

    vscode插件快餐教程(5) - 代码补全 上节我们介绍了lsp的基本框架和协议的三次握手. 下面我们先学习一个最简单的功能协议:给vscode发送一条通知. LSP窗口消息 在LSP协议中,跟窗口 ...

  3. vscode中配置LeetCode插件的教程(愉快刷题)

    转载于脚本之家,原链接为https://www.jb51.net/article/183720.htm 大家好,今早在B站看到up主的vscode里藏了leetcode插件,这才知道原来还有这款神器. ...

  4. vsCode安装使用教程和插件安装

    vsCode安装使用教程 vsCode是什么 vsCode安装 vsCode汉化 vsCode常用命令说明 vsCode左边图标说明 vsCode基本使用 前端常用插件 在vosCode中显示html ...

  5. vscode插件历史版本下载教程

    vscode插件历史版本下载教程 1.打开vscode插件市场 市场地址:https://marketplace.visualstudio.com/ 打开历史版本,发现只有几个,想要下载以前的找不到, ...

  6. HeyUI组件库发布vscode插件,PS教程: 如何开发vscode插件?

    前沿 HeyUI组件库,我们项目组已经用了一年多了. 一直没有对应的组件库插件,我一直耿耿于怀. 所以,抽时间查阅了vscode的插件开发教程,终于把vscode的插件完成了. 在此奉上我们的插件库链 ...

  7. vscode 全项目替换_利用vscode插件提升前端国际化开发效率

    1. 起因 国际化是我们目前开发工作中非常重要的一环.对于老项目,我们可以通过便捷的方式对中文文案进行批量国际化:但是对于新增的功能或者模块开发,一般还是开发同学对文案逐个进行国际化.我自己的开发流程 ...

  8. editor 插入图片之后将光标放到右侧_通过vscode插件自动上传剪贴板图片至aws s3

    vscode是我日常所使用的编辑器,包括在写这篇文章的时候.在编辑markdown文档的时候,总会遇到插入图片的问题.所以我就想实现一个简单的vscode插件,在运行时,可以将剪贴板里的图片上传到aw ...

  9. flutter开发vscode插件推荐(开发必备)

    这里是坚果前端小课堂,大家喜欢的话,可以关注我的公众号"坚果前端,",或者加我好友,获取更多精彩内容 vscode开发插件推荐 扩展是完成工作的快捷方式.许多扩展有助于减少重复性工 ...

  10. 无法跳转 vscode_爱了爱了,这个VSCode插件将极大提高你的工mo作yu效率

    前言 最近沉迷掘金不能自拔,一整天都在掘金上面刷呀刷,同时还在一边使用VSCode码代码.我突发奇想,能不能把掘金塞进VSCode里呢?在做之前,当然要做一下市场调查,市面上有另外两个掘金相关的插件, ...

最新文章

  1. 1024程序员节,你是我们要找的那条锦鲤吗?
  2. linux wm虚拟机网络,复制多台虚拟机及简单的网络配置
  3. 移动金融业务风控框架及设备风险识别的意义(上)
  4. mysql 数据库事务处理_MySQL数据库事务及其原理
  5. jdbc如何写csv文件_Java:将JDBC结果集作为CSV流化
  6. Unity3D自定义资源配置文件
  7. 关于insert语句的插入问题
  8. 基于TI Davinci架构的多核/双核开发快速扫盲(以OMAP L138为例),dm8168多核开发参考以及达芬奇系列资料user guide整理...
  9. 更改pip镜像源的多种方法
  10. python数据分析库pandas官方教程
  11. 【hdu 6438】Buy and Resell
  12. 生信分析学习笔记:(2)GO KEGG分析
  13. asp.net+mvc+html辅助,ASP.NET MVC使用Ajax的辅助的解决方法
  14. 计算机取消uefi启动项,如何使用老毛桃winpe删除或添加UEFI BIOS启动项?
  15. 相关分析-5种常用相关分析方法
  16. Linux之jkd、tomcat、mysql安装
  17. 北航网络安全期末考点参考
  18. 用AI“狙杀”威胁地球的天体 这个团队花5万美元做到了
  19. PX4源码分析2:飞控系统控制流程简述
  20. Verilog HDL四位加法器

热门文章

  1. C++中重载和重写的区别
  2. unity中计算三角形的外接圆
  3. CO BW成本报表建立小结
  4. html视频设置自动播放下一个,在html5中,如何使用video标签让两个不同的视频文件按顺序自动播放?...
  5. Anaconda安装torch
  6. js根据给定颜色生成更亮/暗/颜色
  7. mysql数据驱动测试_[ddt02篇]十年测试老鸟帮您解析:ddt结合excel,csv,mysql实现自动化测试数据驱动...
  8. 关于高速光耦6n137的使用总结_高速光耦6n137典型应用电路图汇总(多谐振荡/光电隔离器/光耦开关)...
  9. Elasticsearch报错received plaintext traffic on an encrypted channel, closing connection Netty4TcpChann
  10. 一套成熟的BPM系统应该有的功能