当前位置:网站首页>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 的区别
边栏推荐
猜你喜欢
Lixia Action | Kyushu Yunzhang Jinnan: Open source is not a movement for a few people, popularization is the source
ping的原理
四平方和,激光炸弹
并发程序的隐藏杀手——假共享(False Sharing)
Leetcode: 215 disorderly to find the first big k element in the array
【历史上的今天】8 月 4 日:第一位图灵奖女性得主;NVIDIA 收购 MediaQ;首届网络安全挑战大赛完成
16、学习MySQL 正则表达式
leetcode:251. 展开二维向量
Almost all known protein structures in the world are open sourced by DeepMind
leetcode: 251. Expanding 2D Vectors
随机推荐
leetcode:241. 为运算表达式设计优先级
集合划分差最小问题(01背包)
G.登山小分队(暴力&dfs)
广告电商系统开发功能只订单处理
idea removes spark logs
leetcode: 250. Count subtrees of equal value
eNSP-小型网络拓扑(DNS、DHCP、网站服务器、无线路由器)
Android Sqlite3 basic commands
没有Project Facets的解决方法
Technology sharing | Mini program realizes audio and video calls
基本介绍PLSQL
16. Learn MySQL Regular Expressions
Win10无法访问移动硬盘怎么解决
Kyushu Cloud attended the Navigator Online Forum to discuss the current status, challenges and future of 5G MEC edge computing
The Internet of things application development trend
杭电校赛(ACM组队安排)
Technology sharing | Description of the electronic fence function in the integrated dispatching system
FRED Application: Capillary Electrophoresis System
Cisco - Small Network Topology (DNS, DHCP, Web Server, Wireless Router)
华为云 & 达达,帮有情人“一键送达”