当前位置:网站首页>Roslyn 节点的 Span 和 FullSpan 有什么区别
Roslyn 节点的 Span 和 FullSpan 有什么区别
2022-08-04 14:49:00 【林德熙】
本文告诉大家在使用 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 的区别
边栏推荐
- vim common operation commands
- Next -21- 添加相册系列 - 1- 框架设置
- How to automatically renew the token after it expires?
- Find My技术|防止你的宠物跑丢,苹果Find My技术可以帮到你
- 华为云 & 达达,帮有情人“一键送达”
- I love Tanabata hahaha
- [The Art of Hardware Architecture] Study Notes (1) The World of Metastability
- 1403. 非递增顺序的最小子序列
- Kyushu Cloud attended the Navigator Online Forum to discuss the current status, challenges and future of 5G MEC edge computing
- Database recovery
猜你喜欢
【 HMS core 】 【 Media 】 online video editing service 】 【 material can't show, or network anomalies have been Loading state
技术分享| 融合调度系统中的电子围栏功能说明
Go 语言快速入门指南: 变量和常量
leetcode: 212. Word Search II
16、学习MySQL 正则表达式
C# SolidWorks二次开发---工程图简单版标注孔信息
ping的原理
【北亚数据恢复】IBM System Storage存储lvm信息丢失数据恢复方案
Win10无法访问移动硬盘怎么解决
[The Art of Hardware Architecture] Study Notes (1) The World of Metastability
随机推荐
【 HMS core 】 【 Media 】 online video editing service 】 【 material can't show, or network anomalies have been Loading state
如何和程序员谈恋爱
leetcode:212. 单词搜索 II
【Today in History】August 4: First female Turing Award winner; NVIDIA acquires MediaQ; first Cybersecurity Challenge completed
Almost all known protein structures in the world are open sourced by DeepMind
leetcode: 251. Expanding 2D Vectors
Find My Technology | Prevent your pet from getting lost, Apple Find My technology can help you
编译型与解释型编程语言的区别
Theory 1: Deep Learning - Detailed Explanation of the LetNet Model
属于程序猿的浪漫
Workaround without Project Facets
FRED Application: Capillary Electrophoresis System
leetcode: 259. Smaller sum of three numbers
[深入研究4G/5G/6G专题-50]: URLLC-16-《3GPP URLLC相关协议、规范、技术原理深度解读》-10-高可靠性技术-1-低编码率编码调制方案MCS与高可靠性DRB
How to automatically renew the token after it expires?
7 天能找到 Go 工作吗?学学 Go 数组和指针试试
[Opportunity Enlightenment-60]: "Soldiers, Stupid Ways"-1- Opening: "Death" and "Life" are the way of heaven
Phasecraft连下两城,助力英国量子技术商业化加速!
【问题解决】QT更新组件出现 “要继续此操作,至少需要一个有效且已启用的储存库”
快解析结合友加畅捷U+