gpt4 book ai didi

c# - Roslyn Analyzer 分析命名空间

转载 作者:行者123 更新时间:2023-11-30 15:20:26 24 4
gpt4 key购买 nike

我们有一些准则,我们希望如何使用我们的 namespace ,并且对它们也有访问限制。因为有时开发人员会做错,所以我们需要分析这些规则。目前我们正在用 nDepend 做这件事,效果很好。但是,有人必须监督这个过程,找到违反这些规则的人并强制他修复它,这个过程非常耗时。因此,在开发过程中或至少在构建当前更改之后立即得到通知会非常好。这应该是 roslyn 分析器的工作。

在过去的 3 个小时里,我对 roslyn 进行了 self 介绍,但我对功能列表及其工作方式有点不知所措。也许你可以给我一个提示,我怎样才能实现我想要的。

我们正在谈论一个具有 >1m 行代码和近 35000 种类型的解决方案。所以性能确实很重要。

我想做的事情:

  1. 获取当前类(class)
  2. 获取当前类的命名空间
  3. 获取所有使用过的类型及其全名

如果我能做到这一点,剩下的就相对容易了。我玩过它,也许我需要打开类的当前项目和编译。但是打开这个非常耗时,因此性能会很差。

最佳答案

Roslyn 分析器可以注册一堆不同的代码操作,例如。在“整个文件”级别,方法、每个语法节点或符号。根据您确切要分析的内容,其中任何一个都可能适用于您。特别是,正如您所指出的,您很关心性能。查看AnalysisContext.Register*Action()方法,您可以添加可能的“ Hook ”。

得到你想要的东西:

1 获取当前类(class)

基本上,对于其中任何一个,您应该能够获取当前类(如果注册语法节点或符号操作),或所有声明的类(例如,注册编译操作或语法树操作)。但最简单的选择是为类节点注册一个语法节点分析,你可以这样做:

context.RegisterSyntaxNodeAction(AnalyzeClassNode, SyntaxKind.ClassDeclaration);

其中 AnalyzeClassNode 是分析类声明的 Action 。这将接收一个额外的上下文(SyntaxNodeAnalysisContext),其中包含类声明语法节点。

2 获取当前类的命名空间

为此,您需要语义模型。假设您使用了 RegisterSyntaxNodeAction 方法,并声明了一个方法 AnalyzeClassNode,那么在正文中,您可以这样做:

var classNode = context.Node;
var model = context.SemanticModel;
var classSymbol = model.GetDeclaredSymbol(classNode);

你得到命名空间符号:

var @namespace = classSymbol.ContainingNamespace;

.MetadataName 将为您提供字符串形式的命名空间。

3 获取所有使用过的类型及其全名

这要复杂得多,而且实际上取决于您要在此实现的目标。真正得到诸如“所有依赖类型或导入”之类的东西。您应该遍历整个类节点,获取每个有用节点的符号(我不知道这会带来什么),并检查它的命名空间或完整的元数据名称。

或许,您可以详细说明一下,看看这是否是正确的方法。


顺便看看"Learn Roslyn Now" ,一个包含大量 Roslyn 教程的网站。具体来说,您需要查看第 3 部分(语法节点)、第 7 部分(符号)和第 10 部分(分析器介绍)。

关于c# - Roslyn Analyzer 分析命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40191168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com