我们有一些指导方针,我们希望如何使用命名空间,以及对它们的访问限制。由于开发人员有时会这样做,我们需要分析这些规则。目前我们正在使用nDepend这样做,这是很好的。但是,有人必须对此进行调整的过程,去违反这些规则并迫使他修复它的人,非常耗时。因此,在开发过程中或至少在构建当前更改之后立即注意到这将是非常好的。这应该是roslyn分析仪的工作。
过去3个小时我已经将自己介绍给了roslyn,但我对功能列表以及它们的工作方式有点不知所措。也许你可以给我一个提示,我怎么能达到我想要的目的。
我们正在谈论一个包含> 1m代码行和近35000种类型的解决方案。所以性能确实很重要。
我想做什么:
如果我能够做到这一点,剩下的就相对容易了。我已经玩过它了,也许我需要打开的类和编译的当前项目。但打开这个非常耗时,因此性能会非常难看。
答案 0 :(得分:4)
Roslyn分析器可以注册一系列不同的代码操作,例如。在"整个文件"级别,方法,每个语法节点或符号。根据您正在尝试分析的内容,这些内容可能适用于您。特别是,正如您所指出的,您关注的是性能。请参阅AnalysisContext.Register*Action()
方法,了解可能的"钩子"你可以添加。
获得你想要的东西:
基本上,对于其中任何一个,您应该能够获取当前类(如果注册语法节点或符号操作)或所有声明的类(例如,注册编译操作或语法树操作)。但最简单的选择是为类节点注册语法节点分析,你可以这样做:
context.RegisterSyntaxNodeAction(AnalyzeClassNode, SyntaxKind.ClassDeclaration);
其中AnalyzeClassNode
是分析类声明的操作。这将获得一个额外的上下文(SyntaxNodeAnalysisContext
),其中包含类声明语法节点。
为此,您需要语义模型。我们假设您使用了RegisterSyntaxNodeAction
方法,并声明了方法AnalyzeClassNode
,然后在正文中,您可以执行此操作:
var classNode = context.Node;
var model = context.SemanticModel;
var classSymbol = model.GetDeclaredSymbol(classNode);
您可以使用以下命令获取命名空间符号:
var @namespace = classSymbol.ContainingNamespace;
.MetadataName
会将命名空间作为字符串。
这个事情要复杂得多,而且取决于你在这里想要实现的目标。要真正得到类似"所有依赖类型或导入"。您应该遍历整个类节点,获取每个有用节点的符号(我不知道这将带来什么),并检查它的命名空间或完整的元数据名称。
也许,您可以对此进行详细说明,以了解这是否是正确的方法。
顺便说一下,查看"Learn Roslyn Now",这是一个包含Roslyn教程的网站。具体来说,您要签出第3部分(语法节点),7(符号)和10(分析器简介)。