Visual Studio代码分析器:查找零引用的类型

本文关键字:引用 类型 查找 Studio 代码 分析器 Visual | 更新日期: 2023-09-27 18:12:44

我正在尝试编写一个代码分析器,该分析器查找visualstudio 2015解决方案中未从任何其他类型引用的类型。

我的问题是我不知道如何找到未引用类型的列表。

我已经尝试通过DOM,你可以从下面的代码中看到,但我不知道在哪里导航,目前的代码已经看起来很慢。

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Diagnostics;
using System.Collections.Immutable;
using System.Linq;
namespace AlphaSolutions.CodeAnalysis
{
    [DiagnosticAnalyzer(LanguageNames.CSharp)]
    public class ZeroReferencesDiagnosticAnalyzer : DiagnosticAnalyzer
    {
        public const string DiagnosticId = "ZeroReferences";
        private static DiagnosticDescriptor rule = new DiagnosticDescriptor(
            DiagnosticId,
            title: "Type has zero code references",
            messageFormat: "Type '{0}' is not referenced within the solution",
            category: "Naming",
            defaultSeverity: DiagnosticSeverity.Warning,
            isEnabledByDefault: true,
            description: "Type should have references."
            );
        public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
        {
            get
            {
                return ImmutableArray.Create(rule);
            }
        }
        public override void Initialize(AnalysisContext context)
        {
            context.RegisterSyntaxNodeAction(this.AnalyzeSyntaxNode, SyntaxKind.ClassDeclaration);
        }
        private void AnalyzeSyntaxNode(SyntaxNodeAnalysisContext obj)
        {
            var classDeclaration = obj.Node as ClassDeclarationSyntax;
            if(classDeclaration == null)
            {
                return;
            }
            var identifierNameSyntaxes = classDeclaration
                .DescendantNodes()
                .OfType<IdentifierNameSyntax>()
                .ToArray()
                ;
            if (identifierNameSyntaxes.Length == 0)
            {
                return;
            }
            //SymbolFinder.FindReferencesAsync(namedTypeSymbol, solution);
        }
    }
}

我也尝试过SymbolFinder.FindReferencesAsync(namedTypeSymbol, solution),但我不知道如何获得Solution的参考。

Microsoft Answers上的一个回复甚至建议使用Roslyn.Services汇编中的finpreferences方法。但是看起来这个程序集已经被弃用了。

我知道CodeLens计数引用,访问计数器可能是一个更好的解决方案,但我猜这是不可能的。

在有人建议重复帖子之前,这篇文章不是重复这个,这个或这个。我的帖子是专门针对Roslyn编译器的分析器。

Visual Studio代码分析器:查找零引用的类型

Roslyn诊断分析器目前不允许您进行解决方案范围(即跨项目)分析,这就是为什么我们不给您Solution对象。这在一定程度上是出于性能考虑:如果你试图在任何地方调用FindReferencesAsync,你的CPU将会被捆绑得很紧。对于CodeLens,有大量关于我们使用多少CPU的反馈,我们不希望10个诊断都消耗相同数量的CPU。(想象一下你那可怜的笔记本电池…)

如果您认为这是更有限的,比如寻找项目中未使用的内部类型,请查看我们不久前编写的这个分析器。