1.使用语法树

当我们要编写一个规则,例如 检测正值表达式的时候,如何编写有效的规则呢

Regex.Match("my text", @"\pXXX");

这里我们可以借助分析工具 Roslyn Syntax Visualizer,在 视图>其他窗口>Syntax Visualizer

当我们在ConsoleApp项目中编写如下代码

namespace ConsoleApp1
{class Program{static void Main(string[] args){Regex.Match("my text", @"\pXXX");} }
}

发现 SyntaxTree (以下称语法树)自动定位到对应的语法中

在语法树中

1 蓝色表示语法节点

2 绿色表示编译器读取源文件时所发现的语法令牌、各个词、数字和符号

3 红色表示琐碎内容,代表不是令牌的其他内容:空格、注释等。

 2.编写实例

新建RegexAnalyzerAnalyzer 类,继承DiagnosticAnalyzer,写法类似默认生成的 DiagnosticAnalyzer.cs

  public class RegexAnalyzerAnalyzer : DiagnosticAnalyzer{
        public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }public override void Initialize(AnalysisContext context){context.RegisterSyntaxNodeAction(AnalyzeNode, SyntaxKind.InvocationExpression);}
}

其中 AnalysisContext 如下:

RegisterSyntaxNodeAction 在分析特定类型的语法节点时触发
RegisterSymbolAction 在分析特定类型的符号时触发
RegisterSyntaxTreeAction 在分析文件的整棵语法树时触发
RegisterSemanticModelAction 在语义模型可用于整个文件时触发
RegisterCodeBlockStartAction
RegisterCodeBlockEndAction
在分析方法主体或其他代码块之前/之后触发

RegisterCompilationStartAction
RegisterCompilationEndAction
在分析整个项目之前/之后触发

11

具体判断代码

/// <summary>/// 1 首先他是一个表达式节点/// 2 他是Match方法/// 3 他是ystem.Text.RegularExpressions.Regex.Match下的方法/// 4 他有两个参数/// 5 第二个参数有值/// 6 使用Match捕捉第二个参数的正值表达式异常/// </summary>/// <param name="context"></param>private void AnalyzeNode(SyntaxNodeAnalysisContext context){var invocationExpr = (InvocationExpressionSyntax)context.Node;//InvocationExpressionSyntax 表达式特定节点var memberAccessExpr =invocationExpr.Expression as MemberAccessExpressionSyntax;if (memberAccessExpr?.Name.ToString() != "Match") return;//如果不是Match 返回var memberSymbol = context.SemanticModel.GetSymbolInfo(memberAccessExpr).Symbol as IMethodSymbol;//获取上下文memberAccessExpr的语义模型if (!memberSymbol?.ToString().StartsWith("System.Text.RegularExpressions.Regex.Match") ?? true) return;//如果memberAccessExpr不是System.Text.RegularExpressions.Regex.Match 返回var argumentList = invocationExpr.ArgumentList as ArgumentListSyntax;//获取节点参数 if ((argumentList?.Arguments.Count ?? 0) < 2) return;//参数小于2返回var regexLiteral =argumentList.Arguments[1].Expression as LiteralExpressionSyntax;//获取第二个参数内容if (regexLiteral == null) return;//第二个参数是null的返回var regexOpt = context.SemanticModel.GetConstantValue(regexLiteral);//获取参数的常量字符串if (!regexOpt.HasValue) return;//空值返回var regex = regexOpt.Value as string;//获取字符串if (regex == null) return;try{System.Text.RegularExpressions.Regex.Match("", regex);//使用System.Text.RegularExpressions.Regex.Match 如果异常抛出异常
            }catch (ArgumentException e){//ArgumentException异常 抛出定义的说明var diagnostic =Diagnostic.Create(Rule, regexLiteral.GetLocation(), e.Message);context.ReportDiagnostic(diagnostic);}}

参考:https://msdn.microsoft.com/zh-cn/library/dn879356

转载于:https://www.cnblogs.com/fishpro/p/7874992.html

建立标准编码规则(二)-DiagnosticAnalyzer 增加诊断分析代码相关推荐

  1. C语言密勒码的软件编码,密勒码的编码规则是什么?请画出代码序列11010010的密勒码波形?...

    相关题目与解析 CMI码的编码规则是什么?请画出代码序列11010010的CMI码波形? 数字双相码的编码规则是什么?请画出代码序列11010010的双相码波形? 简述双相码(曼彻斯特码)的编码规则并 ...

  2. 计算机考研中的编号,中国传媒大学研究生学号编码规则

    研究生层次各类教育的学号编码规则(来自校学籍管理的相关规定) <研究生层次各类教育的学号编码规则> 主要名词解释: 1.博士后流动站的进站研究人员----(简称博士后): 2.全日制博士研 ...

  3. 【ArcGIS风暴】CASS建立标准分幅图框并在ArcGIS中DOM批量分幅案例教程

    文章目录 一.CASS建立标准格网 二.ArcGIS中批量格网分幅 1. 加载数据 2. 图幅编号连接属性表 2. 批量分幅 一.CASS建立标准格网 参照:[CASS精品教程]CASS9.1生成标准 ...

  4. 已知一棵完全二叉树存于顺序表sa中,sa.elem[1..sa.length]含结点值,试编写算法由此顺序存储结构建立该二叉树的二叉链表。

    已知一棵完全二叉树存于顺序表sa中,sa.elem[1-sa.length]含结点值,试编写算法由此顺序存储结构建立该二叉树的二叉链表. 分析:由二叉树的性质可知,一个下标为i的节点若有左子树,则其左 ...

  5. gops —— Go 程序诊断分析工具

    GitHub: https://github.com/google/gops 一个用于列出和诊断分析系统中正在运行的 Go 程序的命令行工具 安装 go get -u github.com/googl ...

  6. gops —— Go 程序诊断分析工具 1

    GitHub: https://github.com/google/gops 一个用于列出和诊断分析系统中正在运行的 Go 程序的命令行工具 安装 go get -u github.com/googl ...

  7. 一维,二维条形码/条码的编码规则

    编码规则 唯一性:同种规格同种产品对应同一个产品代码,同种产品不同规格应对应不同的产品代码.根据产 品的不同性质,如:重量.包装.规格.气味.颜色.形状等等,赋予不同的商品代码. 永久性:产品代码一经 ...

  8. 新型基础测绘与实景三维中国建设技术文件【3】基础地理实体空间身份编码规则

    基础地理实体是新型基础测绘产品体系中的核心成果,是推动基础测绘工作转型升级的关键.与现有的测绘地理信息数据不同,基础地理实体具有多粒度.多模态.多层次,以及搭载结构化.半结构化和非结构化多样化信息的鲜 ...

  9. ASN.1 -- 编码规则

    描述ASN.1编码规则的标准 ITU-T Rec. X.690 | ISO/IEC 8825-1 (BER, CER and DER) ITU-T Rec. X.691 | ISO/IEC 8825- ...

最新文章

  1. Android之linux基础教学之七 中断下半部之软中断
  2. 近两年跟踪速度较快的算法小结
  3. linux下载哪个python版本-Linux下升级安装Python-3.6.2版本
  4. sort,uniq,fmt,wc,提取开头和结尾的命令的使用
  5. Leetcode 150. 逆波兰表达式求值 解题思路及C++实现
  6. 微博“异地多活”部署经验谈
  7. 高并发01_synchronized
  8. Springboot + Mybatis + Ehcache
  9. Ubuntu链接服务器
  10. Ubuntu设置root登录
  11. X86和X86_64和AMD64的由来
  12. 斯坦福机器学习公开课笔记--神经网络的学习
  13. Java中类与对象的定义与使用
  14. 工程力学(18)—压杆稳定
  15. 【TensorFlow】tf.expand_dims()函数
  16. Java:一个帝国的诞生(请仔细看完,你会感叹这是一个奇迹)
  17. 今天是没有python的一天(大物实验‘利用牛顿环测量曲率半径’报告和大物复习)
  18. kubeadm修改证书有效期
  19. c语言中优先级劣后级,基金优先级与劣后级的区别是什么 看完你就明白了
  20. 【LaTex】 - 对齐符号的用法,换行符\\的用法,Misplaced 错误怎么解决

热门文章

  1. 迦瓦栈队 团队第六周项目总结
  2. VS2015新建MFC工程默认存储位置,默认位置修改
  3. 【渝粤教育】广东开放大学 国际法 形成性考核 (37)
  4. Python 基础代码
  5. 《图像处理实例》 之 局部极值提取
  6. 大话Ceph--RBD那点事儿
  7. 视频基础知识—720P/1080i/1080P
  8. C++模拟与高精度——乒乓球
  9. poj3349——Snowflake Snow Snowflakes
  10. 查看本机MAC地址的方法