当前位置:网站首页>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 的区别
边栏推荐
猜你喜欢

Sum of four squares, laser bombs

世间几乎所有已知蛋白质结构,都被DeepMind开源了

uni-app 从零开始-生命周期(二)

Qt的QItemDelegate使用

leetcode: 255 Verify preorder traversal sequence binary search tree

1403. Minimum Subsequence in Non-Increasing Order

LeetCode_模拟_中等_498.对角线遍历

程序猿七夕礼物-如何30分钟给女朋友快速搭建专属语聊房

CCF GLCC officially opened | Kyushu Cloud open source experts bring generous bonuses to help universities promote open source

FRED Application: Capillary Electrophoresis System
随机推荐
vim 常用操作命令
leetcode: 250. Count subtrees of equal value
eNSP-小型网络拓扑(DNS、DHCP、网站服务器、无线路由器)
Makefile 语法及使用笔记
技术分享| 融合调度系统中的电子围栏功能说明
饿了么智能头盔专利获授权,进一步提升骑手安全保障
Win10无法访问移动硬盘怎么解决
xampp安装包含的组件有(php,perl,apche,mysql)
Cisco-小型网络拓扑(DNS、DHCP、网站服务器、无线路由器)
Sum of four squares, laser bombs
物联网应用发展趋势
Next -21- 添加相册系列 - 1- 框架设置
代码随想录笔记_动态规划_1049最后一块石头的重量II
Oracle database user creation, restart, import and export
How to automatically renew the token after it expires?
[Problem solving] QT update component appears "To continue this operation, at least one valid and enabled repository is required"
This week to discuss the user experience: Daedalus Nemo to join Ambire, explore the encryption of the ocean
How to install postgresql and configure remote access in ubuntu environment
Bluetooth Technology|In the first half of the year, 1.3 million charging piles were added nationwide, and Bluetooth charging piles will become the mainstream of the market
C# SolidWorks二次开发---工程图简单版标注孔信息