如何利用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
最新文章
- Nginx图片剪裁模块探究
- Masonry控制台打印约束冲突问题解决
- 根据用户IP获得所在城市
- SUSE Linux下新建Weblogic 10.3非admin服务
- LeetCode 笔记26 Maximum Product Subarray
- 算法训练 Torry的困惑
- Nginx/LVS/HAProxy负载均衡软件的优缺点详解
- [SAP ABAP开发技术总结]DIALOG屏幕流逻辑
- IMPLEMENTED IN PYTHON +1 | CART生成树
- 【android】java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused
- zongjie
- hdoj 1874 畅通工程续(单源最短路+dijkstra)
- 微信小程序基础之常用控件text、icon、progress、button、navigator
- 最大似然估计与期望最大化(EM)算法
- SharePoint 已在此服务器场中安装 ID 为 XXXXXXXXX 的功能。请使用强制属性显式地重新安装此功能。解决方法
- 初识KNN
- Session、Cookie、Cache、Token分别是什么及区别
- ionic 项目中ios上遇到的软键盘输入法自动弹出的问题
- html元素不可见的三种方式
- 从浏览器地址栏输入URL到浏览器呈现数据全过程解析
热门文章
- ASP.NET Core 3.0 : 二十四. 配置的Options模式
- C++进程间通讯方式
- vscode中自动补全<;?php?>;
- 从零开始入门 K8s | 应用配置管理
- 部份css样式详解(附实际应用)
- zookeeper 都有哪些使用场景?
- 设计模式之UML类图以及类间关系
- 如何解决myeclipse2014突然无法打开的问题
- 【ASP.NET-中级】SQLHelper数据访问公共类
- springcloud --- spring cloud sleuth和zipkin日志管理(spring boot 2.18)