c# – 如何使用Roslyn以编程方式从代码中删除区域?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何使用Roslyn以编程方式从代码中删除区域?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2437字,纯文字阅读大概需要4分钟。
内容图文
![c# – 如何使用Roslyn以编程方式从代码中删除区域?](/upload/InfoBanner/zyjiaocheng/789/e7908588ec5f4c9a95bd1a2fe4746c29.jpg)
我正在使用Roslyn从文本中解析C#代码.一些代码具有围绕多个类的区域.例:
#region Classes
public class MyClass
{
}
public class MyClass2
{
#region Methods
#endregion
}
#endregion
我想删除类周围的区域(上例中的“类”),但保留内部区域,就像上面示例中名为“Methods”的区域一样.我该怎么做呢?
解决方法:
区域相当特殊,因为它们不遵循通常的树形结构.例如,您可以创建一个这样的构造:
public class TestClass{
public void TestMethod(){
#region TestRegion
}
}
#endregion
这仍然有效.考虑到这一点,在分析区域时还有一个问题:它们是琐事中的节点.因此,要获取相关节点,您可以使用SyntaxRewriter(并传递构造函数“true”以启用琐事分析)或使用node.DescendantNodes(descendIntoTrivia:true)查找后代节点.
由于区域的开始和结束可能位于文件中的任何位置,因此您应始终在语法树的根目录开始分析,以确保您可以找到区域的结束/开始.
为了找到该区域,您可以覆盖VisitRegionDirectiveTrivia以及VisitEndRegionDirectiveTrivia.由于RegionTrivia的开始和结束彼此不了解,您需要自己匹配它们.在下面的例子中,我简单地计算了我已经传递了多少个区域,并注意了一个#endregion位置列表,这些位置在走出区域时应该被删除.
为了识别相关区域,我提供了两种方法:您可以使用区域名称或标识附加的节点是否为ClassDeclaration.
这两种方法都没有在类声明之前考虑诸如属性声明之类的情况.如果你想要处理这个问题,你需要看看兄弟节点,并检查它们是否在该区域的范围内开始.
private class RegionSyntaxRewriter : CSharpSyntaxRewriter
{
int currentPosition = 0;
private List<int> EndRegionsForDeletion = new List<int>();
private string deletedRegion;
private bool useRegionNameForAnalysis = false;
public RegionSyntaxRewriter(string deletedRegion) : base(true)
{
this.deletedRegion = deletedRegion;
}
public override SyntaxNode VisitRegionDirectiveTrivia(
RegionDirectiveTriviaSyntax node)
{
currentPosition++;
var regionText = node.ToFullString().Substring(8).Trim();
if (!useRegionNameForAnalysis &&
node.ParentTrivia.Token.Parent is ClassDeclarationSyntax)
{
EndRegionsForDeletion.Add(currentPosition);
return SyntaxFactory.SkippedTokensTrivia();
}
if (useRegionNameForAnalysis &&
regionText == deletedRegion)
{
EndRegionsForDeletion.Add(currentPosition);
return SyntaxFactory.SkippedTokensTrivia();
}
return base.VisitRegionDirectiveTrivia(node);
}
public override SyntaxNode VisitEndRegionDirectiveTrivia(
EndRegionDirectiveTriviaSyntax node)
{
var oldPosition = currentPosition;
currentPosition--;
if (EndRegionsForDeletion.Contains(oldPosition))
{
EndRegionsForDeletion.Remove(currentPosition);
return SyntaxFactory.SkippedTokensTrivia();
}
return base.VisitEndRegionDirectiveTrivia(node);
}
}
内容总结
以上是互联网集市为您收集整理的c# – 如何使用Roslyn以编程方式从代码中删除区域?全部内容,希望文章能够帮你解决c# – 如何使用Roslyn以编程方式从代码中删除区域?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。