如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

OK, 废话不多说,这些天在写C#代码时突然对于IDE提示有了一些想法,之前也有了解过,不过并没有深入。

先看个截图:

如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

 

 

 一段再简单不过的代码了,大家注意看到 count 字段下面的绿色波浪线了吗,我们通常为理解一个 warning ,鼠标移上去:

如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

 

 

 提示“声明了该字段但没有使用过” 当然,这对项目代码编译没有什么影响。不过,我想了一下,如果我们可以重写IDE的编译器,把我们的一些规则写进去,对于团队

的代码review其实是很高效的一件事情。我们通常的代码review会有滞后,都是通过提交PR或代码评审,如果我们把这个检查在开发人员写代码的时候第一时间提示出来或给error提示,实现所见即所得,应该是一件很值得做的事情吧。

言归正传,我们要实现这一目的,“Roslyn” 就出场了,可以理解为 .NET Compiler Platform,一个.NET编译平台。以前我们看“Roslyn” 是这样的:

如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

 

 

 源码 -> 编译-> 程序集, 然而这里的编译其实是不透明的,也称“黑盒状态”。但微软开源之后,我们了解里面其实有这些细节:

如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

 

 

 

API包括Syntax、Symbol等 ,今天不细讲这些内容,后面再写分析器的时候我会给大家罗列出来用法。

下面我们看如何准备环境(安装Roslyn):

1. 安装VS要勾选.NET Compiler Platform

如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

 

 

 2.VS2019 16.3以上版本 .NET Framework4.8 (老版本的vs似乎也可以 我没有尝试过)

3. 打开VS,新建项目-》 选择Analyzer with Code Fix 模板,如下图:

如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

 

 

 

4. 项目创建后,可以看到右边Solution窗口有三个项目:

如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

 

 

 正常情况下默认启动项目为 Analyzer1.Vsix (VS扩展插件 不了解的同学可以去学习一下vs自定义插件)

5. 我们直接暴力一点,F5运行调试,项目运行后,会重新启动一个新的VS实例:

如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

 

 

 

 

 细心的同学可以看到,此时我的窗口是启动了俩个VS, 一个可以理解为“母体”,一个则是母体Copy出来的一份(这样形容应该好理解)

6. 在创建出来的VS实例窗口,我们还是按照之前的做法,新建一个控制台应用程序:

如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

 

 

可以看到实例VS创建出来的控制台应用程序,类名 Program有提示,意思是不能小写,然后旁边有个黄色的灯泡,大概可以猜出来点击黄色灯泡可以解决

当前提示的问题,应该就是转换为大写。那么,这个简单的检查代码是如何写出来的呢?

7. 调试“母体”,在母体VS 类名为Analyzer1Analyzer 的静态方法AnalyzeSymbol打断点:

如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

 

 

打完断点后,我在实例的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# timer使用


下一篇:斐波那契数列(递归)c#