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

时间:2015-09-14 13:59:39

标签: c# visual-studio-2015 roslyn

我正在尝试编写一个代码分析器,用于查找Visual Studio 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程序集中的FindReferences方法。但看起来该程序集已被弃用。

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

在任何人建议重复发帖之前,此帖子不会与thisthisthis重复。我的帖子专门针对Roslyn编译器的分析器。

1 个答案:

答案 0 :(得分:5)

Roslyn诊断分析仪目前不允许您进行解决方案范围(即跨项目)分析,这就是我们没有给您Solution对象的原因。这部分是出于性能方面的考虑:如果你试图在任何地方调用FindReferencesAsync,那么你的CPU就会非常紧张。对于CodeLens,我们使用了多少CPU的反馈,我们并不希望10个诊断消耗相同数量的CPU。 (想象一下你可怜的笔记本电池......)

如果您对此更加有限,请查找他们所在的项目中未使用的内部类型,请查看this analyzer we wrote awhile back