2018-8-10-Roslyn-节点的-Span-和--FullSpan-有什么区别
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
Roslyn 节点的 Span 和 FullSpan 有什么区别
|
lindexi
|
2018-08-10 19:16:52 +0800
|
2018-7-22 17:1:20 +0800
|
Roslyn MSBuild 编译器
|
本文告诉大家在使用 Roslyn 分析代码时,使用的 Span 和 FullSpan 有什么区别
在开始读本文之前,希望大家已经了解部分关于 Roslyn 的知识,如果是通过搜索进来的,大概就是已经知道基础的写法了。如果是通过本渣的推荐看到本文,本渣会详细告诉大家如何做。
准备
先写出一个简单的类用来分析
using System; namespace BebehersoSerdar
{
class Foo
{
/// <summary>
/// 设置或获取NawraSaw
/// </summary>
public string NawraSaw { get; set; } public void RorgiWhiseaSawrear()
{
Console.WriteLine(NawraSaw);
} public void TurlouDismemteeka()
{
// 输出一个值
Console.WriteLine(NawraSaw);// 代码需要多写没有用的注释 // 下一句代码
}
}
}
创建语法树
把前面这个文件拿出来,用这个文件来创建语法树
var file = new FileInfo(@"D:\lindexi\roslyn\BebehersoSerdar\BebehersoSerdar\Foo.cs");
string content;
using (var stream = new StreamReader(file.OpenRead()))
{
content = stream.ReadToEnd();
}
var tree = CSharpSyntaxTree.ParseText(content);
文件的路径就是刚才写的代码文件
通过 CSharpSyntaxTree.ParseText 就可以拿到语法树
访问语法树
为了访问语法树,需要创建一个类继承 CSharpSyntaxWalker 这里创建的类是 DowkurTicesoo 请看代码
public class DowkurTicesoo : CSharpSyntaxWalker
{ }
本文说道了这里还没有告诉大家 Span 是什么,这个属性就是对应文本的第多少个字符开始和字符的长度。通过 Span 可以找到代码对应的文本。
所以在这里需要多创建一个方法,用来把 Span 转换为字符串
public DowkurTicesoo(string content, SyntaxWalkerDepth depth = SyntaxWalkerDepth.Node) : base(depth)
{
Content = content;
} private string Content { get; } public string GetText(TextSpan span)
{
return Content.Substring(span.Start, span.Length);
}
访问方法
这里直接就告诉大家如何访问方法,因为只有在方法里面才可以比较直观看到 Span 和 FullSpan 的不同
通过重写方法就可以拿到一个类的所有方法,请看代码
public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
{
base.VisitMethodDeclaration(node);
}
在方法这里打断点可以看到进来两次,因为存在两个方法 RorgiWhiseaSawrear 和 TurlouDismemteeka 会进来两遍
先直接把方法的 Span 和 FullSpan 输出出来,请看代码
public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
{
Console.WriteLine(GetText(node.Span));
Console.WriteLine(GetText(node.FullSpan));
base.VisitMethodDeclaration(node);
}
这时运行可以看到这个输出
可以看到 Span 和 FullSpan 的一个不同是 Span 是从方法的第一个代码字符开始,和 Span 不同的是 FullSpan 是从方法的距离上一个代码结束开始的字符到方法结束的最后的字符
访问表达式
在另一个方法 TurlouDismemteeka 可以看到两个属性拿到的值的不同,因为这个方法里调用表达式,所以需要使用下面的方法拿到值
public override void VisitExpressionStatement(ExpressionStatementSyntax node)
{
Console.WriteLine(GetText(node.Span));
Console.WriteLine(GetText(node.FullSpan));
base.VisitExpressionStatement(node);
}
对于 RorgiWhiseaSawrear 方法,两个属性的输出只有很少的不同
Console.WriteLine(NawraSaw);
Console.WriteLine(NawraSaw);
\r\n
也就是 Span 就是去掉了 RorgiWhiseaSawrear 的前后空白,上面的 \r\n 是告诉大家这里还有一个换行符
但是对于 TurlouDismemteeka 就可以看到明显的不相同,第二个属性可以拿到注释
Console.WriteLine(NawraSaw);
// 输出一个值
Console.WriteLine(NawraSaw);// 代码需要多写没有用的注释
\r\n
在 VisualStudio 可以看到的转换 FullSpan 的值是 " // 输出一个值\r\n Console.WriteLine(NawraSaw);// 代码需要多写没有用的注释\r\n"
可以看到注释下一句代码没有被引用,但是如果在 TurlouDismemteeka 的第一句代码多加一些换行,在 FullSpan 是可以转换
public void TurlouDismemteeka()
{ // 输出一个值
Console.WriteLine(NawraSaw);// 代码需要多写没有用的注释 // 下一句代码
}
这时从 VisualStudio 转换是多了换行"\r\n // 输出一个值\r\n Console.WriteLine(NawraSaw);// 代码需要多写没有用的注释\r\n",也就是引号后面多了\r\n的换行
不同
实际上在很多的方法里,使用 Span 和 FullSpan 都是没有什么区别。
用一句话来说明就是 Span 就只包括代码,而 FullSpan 包括了代码和代码附近的注释。
对于不同的结点的 Span 是不会存在值的冲突,但是对于 FullSpan 是存在多个节点的覆盖。
实际上使用 Span 转换字符串和使用 FullSpan 转换字符串的方法就和使用 ToString 差不多,请看 Roslyn NameSyntax 的 ToString 和 ToFullString 的区别
2018-8-10-Roslyn-节点的-Span-和--FullSpan-有什么区别的更多相关文章
- 4 cdh 5.12 centos 6.10三节点安装
4 cdh 5.12 centos 6.10 三节点安装 [root@hadoop1 opt]# cat /etc/redhat-release CentOS release 6.10 (Final ...
- 用Docker在一台笔记本电脑上搭建一个具有10个节点7种角色的Hadoop集群(上)-快速上手Docker
如果想在一台电脑上搭建一个多节点的Hadoop集群,传统的方式是使用多个虚拟机.但这种方式占用的资源比较多,一台笔记本能同时运行的虚拟机的数量是很有限的.这个时候我们可以使用Docker.Docker ...
- 申请Office 365一年免费的开发者账号攻略(2018年10月份版本)
要进行Office 365开发,当然需要有完整的Office 365环境才可以.为了便于广大开发人员快速地启动这项工作,微软官方给所有开发人员提供了免费的一年开发者账号 那么如何申请Office ...
- IntelliJ IDEA 最新激活码(截止到2018年10月14日)
IntelliJ IDEA 注册码: EB101IWSWD-eyJsaWNlbnNlSWQiOiJFQjEwMUlXU1dEIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYX ...
- 新手C#SQL Server使用记录2018.08.10
主键(PrimaryKey):主键就是每个数据行(记录)的唯一标识,不会有重复值的列(字段)才能当做主键.一个表可以没有主键,但是这样会很难处理表,因此一般情况表都要设置主键. 主键有两张选用策略,分 ...
- 01 mybatis框架整体概况(2018.7.10)-
01 mybatis框架整体概况(2018.7.10)- F:\廖雪峰 JavaEE 企业级分布式高级架构师课程\廖雪峰JavaEE一期\第一课(2018.7.10) maven用的是3.39的版本 ...
- 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H)
目录 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H) 竞赛事件相关 竞赛链接 竞赛题目 总结 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H) 竞赛事件相关 竞赛 ...
- 富士康的盈利秒杀99%的A股公司:3星|《三联生活周刊》2018年10期
三联生活周刊·最美的数学:天才为何成群到来(2018年10期) 本期专题是数学和成都,我都跳过去没看.其他内容也还有点意思. 总体评价3星. 以下是本期一些内容的摘抄,#号后面是kindle电子版中的 ...
- Burn Down Chart(2018.6.4~2018.6.10)
Burn Down Chart (2018.6.4~2018.6.10) 娄雨禛[前端部分] 曾子轩[后端部分+燃尽图] 前端 1. 娄雨禛+李鑫 1)在总工程中完成跳转,实现图片显示,并发布到Git ...
- [转帖]单集群10万节点 走进腾讯云分布式调度系统VStation
单集群10万节点 走进腾讯云分布式调度系统VStation https://www.sohu.com/a/227223696_355140 2018-04-04 08:18 云计算并非无中生有的概念, ...
随机推荐
- Docx 生成word文档
1.生成word代码 /// <summary> /// 生成word文档 /// </summary> /// <param name="tempPath&q ...
- line-height:150%/1.5em与line-height:1.5的区别
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- No module named zope.interface error 的解决
在 import zope.interface 时,出现错误 No module named zope.interface error根据 http://stackoverflow.com/quest ...
- IDEA设置谷歌浏览器和火狐浏览器打开
我们在软件的功能栏中选择file,然后使用鼠标点击settings,进入到软件的详细设置界面 进入后,我们可以看到很多设置项,然后我们使用鼠标依次点击左侧的tools和web browsers,进 ...
- NOIP2017到都不签签记
day 0: 校内开运动会,但是还是在机房学习了一天. 感觉上并没有多大用处,主要只是活跃一下思维而已. 然后就晚上上车出发去酒店. 下了个游戏王. 晚上叫了波宅急送,然后硬是腐了一个晚上. day ...
- IO流7 --- FileWriter写出数据的操作 --- 技术搬运工(尚硅谷)
FileWriter字符输出 @Test public void test3(){ File file = new File("hello1.txt"); FileWriter f ...
- 外观模式(Facade)(门面模式、子系统容易使用)
外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式.该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低 ...
- MySQL--python关联MySQL、练习题
1.python关联MySQL pymysql: 安装:pip3 install pymysql 1.0:连接到数据库中 import pymysql conn = pymysql.connect( ...
- MYSQL基础常识
所有的数据库名.表名.表字段都是区分大小写的.所以在使用mysql命令时需要输入正确的名称 MYSQL命令终止符是分号; 1.MYSQL的连接:mysql -u root -p(\q或exit退出); ...
- tcpdump命令介绍
命令格式为:tcpdump [-nn] [-i 接口] [-w 储存档名] [-c 次数] [-Ae] [-qX] [-r 文件] [所欲捕获的数据内容] 参数: -nn,直接以 IP 及 Port ...