如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?
OK, 废话不多说,这些天在写C#代码时突然对于IDE提示有了一些想法,之前也有了解过,不过并没有深入。
先看个截图:
一段再简单不过的代码了,大家注意看到 count 字段下面的绿色波浪线了吗,我们通常为理解一个 warning ,鼠标移上去:
提示“声明了该字段但没有使用过” 当然,这对项目代码编译没有什么影响。不过,我想了一下,如果我们可以重写IDE的编译器,把我们的一些规则写进去,对于团队
的代码review其实是很高效的一件事情。我们通常的代码review会有滞后,都是通过提交PR或代码评审,如果我们把这个检查在开发人员写代码的时候第一时间提示出来或给error提示,实现所见即所得,应该是一件很值得做的事情吧。
言归正传,我们要实现这一目的,“Roslyn” 就出场了,可以理解为 .NET Compiler Platform,一个.NET编译平台。以前我们看“Roslyn” 是这样的:
源码 -> 编译-> 程序集, 然而这里的编译其实是不透明的,也称“黑盒状态”。但微软开源之后,我们了解里面其实有这些细节:
API包括Syntax、Symbol等 ,今天不细讲这些内容,后面再写分析器的时候我会给大家罗列出来用法。
下面我们看如何准备环境(安装Roslyn):
1. 安装VS要勾选.NET Compiler Platform
2.VS2019 16.3以上版本 .NET Framework4.8 (老版本的vs似乎也可以 我没有尝试过)
3. 打开VS,新建项目-》 选择Analyzer with Code Fix 模板,如下图:
4. 项目创建后,可以看到右边Solution窗口有三个项目:
正常情况下默认启动项目为 Analyzer1.Vsix (VS扩展插件 不了解的同学可以去学习一下vs自定义插件)
5. 我们直接暴力一点,F5运行调试,项目运行后,会重新启动一个新的VS实例:
细心的同学可以看到,此时我的窗口是启动了俩个VS, 一个可以理解为“母体”,一个则是母体Copy出来的一份(这样形容应该好理解)
6. 在创建出来的VS实例窗口,我们还是按照之前的做法,新建一个控制台应用程序:
可以看到实例VS创建出来的控制台应用程序,类名 Program有提示,意思是不能小写,然后旁边有个黄色的灯泡,大概可以猜出来点击黄色灯泡可以解决
当前提示的问题,应该就是转换为大写。那么,这个简单的检查代码是如何写出来的呢?
7. 调试“母体”,在母体VS 类名为Analyzer1Analyzer 的静态方法AnalyzeSymbol打断点:
打完断点后,我在实例的VS窗口删除了类Program 的最后一个字母m,母体断点被触发,这段代码可以看到就是一个简单的检查判断,最后创建一个Rule
报给给前端的编辑器。基本上后续重写编译平台都是使用Diagnostic.Create方法,不同的则是你要写特定的逻辑来检查你团队的代码。
当然,这里分为俩个部分,一个是诊断(IDE提示,如绿色波浪线),一个是解决(黄色小灯泡里实现解决代码)
今天大概就是这样一个简单的Demo,其实里面挺复杂,后续会给大家主角讲一下AnalyzeSymbol类里的一些模型以及主要API.
PS:Roslyn源码已经在github上公开,感兴趣的可以看看源码,地址:https://github.com/dotnet/roslyn 里面代码还是很有价值的。
另外,提供一个Roslyn学习地址:https://github.com/ironcev/awesome-roslyn
如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?的更多相关文章
- (二)如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?
上一篇我们讲了如何建立一个简单的Roslyn分析项目如分析检查我们的代码. 今天我们主要介绍各个项目中具体的作用以及可视化分析工具. 还是这种截图,可以看到解决方案下一共有三个项目. Analyzer ...
- 利用SpringBoot+Logback手写一个简单的链路追踪
目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...
- Roslyn如何实现简单的代码提示
假如需要实现一个代码编辑器,其中一个很重要的功能是实现代码提示,类似VS的代码智能提示.下面用Roslyn编译器来实现一个简单的代码提示功能. 代码提示,首先必须需要知道对象的类型信息,然后通过迭代获 ...
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
- 利用windows.h头文件写一个简单的C语言倒计时
今天写一个简单的倒计时函数 代码如下: #include<stdio.h> #include<windows.h> int main() { int i; printf(&qu ...
- 【阿菜做实践】利用go语言写一个简单的Pow样例
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简单demo.开发IDE用的是JB Golang. 整个项目的文件结构如下: PoWdem ...
- 动手写一个简单版的谷歌TPU-指令集
系列目录 谷歌TPU概述和简化 基本单元-矩阵乘法阵列 基本单元-归一化和池化(待发布) TPU中的指令集 SimpleTPU实例: (计划中) 拓展 TPU的边界(规划中) 重新审视深度神经网络中的 ...
- 一步一步写一个简单通用的makefile(三)
上一篇一步一步写一个简单通用的makefile(二) 里面的makefile 实现对通用的代码进行编译,这一章我将会对上一次的makefile 进行进一步的优化. 优化后的makefile: #Hel ...
- 利用JSP编程技术实现一个简单的购物车程序
实验二 JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP ...
随机推荐
- Python 之父的解析器系列之七:PEG 解析器的元语法
原题 | A Meta-Grammar for PEG Parsers 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫("Python猫"公众 ...
- 蓝桥杯 algo122 未名湖的烦恼 简单题
#include <iostream> using namespace std; int m, n, ans; void solve(int m, int n, int cnt) { &a ...
- 代码审计之CSRF原理及修复
在平时的测试中,csrf也是比较容易发现的,主要就是看它对一个操作,有没有检测其时效性(这样表述可能不太准确),一般的防护方法就是添加token来进行校验,并及时对其进行失效处理. 以下所有代码都是我 ...
- Mybaits-从零开始-Hello World(暂不考虑命名规范化)
1.mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- 小鸟初学Shell编程(七)变量引用及作用范围
变量引用 那么定义好变量,如何打印变量的值呢?举例下变量引用的方式. ${变量名}称作为对变量的引用 echo ${变量名}查看变量的值 ${变量名}在部分情况下可以省略成 $变量名 [root@li ...
- MySQL 分页查询优化
有时在处理偏移量非常大的分页时候查询时,例如LIMIT 1000,10这样的查询,这时MySQL需要查询1010条记录然后只返回最后10条,前面1000条记录都被抛弃,这样的代价非常高.要优化这种查询 ...
- springboot新版本(2.0.0+)自定义ErrorController中使用ErrorAttributes
2.0.0之前使用: @Autowired private ErrorAttributes errorAttributes; private Map<String, Object> get ...
- 浅析java垃圾回收机制
什么是java程序中的垃圾?什么这些垃圾又是怎样被回收的?为什么会被回收?不进行回收又会怎样?这些问题都是我们要在这篇博客中要解决的问题! 大家都知道,在c语言中,作为程序员,必须得考虑到去怎样回收已 ...
- DrawerLayout(抽屉效果)
DrawerLayout是V4包下提供的一种左滑右滑抽屉布局效果. 实现效果如下: 因为是官方提供的,所以使用起来也相对的比较简单. DrawerLayout 提供 1.当界面弹出的时候,主要内容区会 ...
- 视频转换器 Wondershare Video Converter Ultimate v11.5.1 中文便携版
Wondershare Video Converter Ultimate 是万兴公司出品的一款多功能音视频转换.DVD 刻录软件.视频下载软件.有了它,您可以随时随地观看.下载.编辑.转换.刻录视频, ...