Roslyn:在具有代码修复项目的诊断中的当前工作区

5

如何在具有代码修复的诊断程序中获取有关当前工作空间(例如项目路径、解决方案路径)的信息?

我正在实现类型为 ISyntaxNodeAnalyzer 的诊断。

我需要访问 SymbolFinder.FindImplementationsAsync,但是要这样做,我需要 Solution 实例。

编辑:我的代码看起来像这样:

var syntax = (LocalDeclarationStatementSyntax) node;
var type = syntax.Declaration.Type;
var typeSymbol = semanticModel.GetTypeInfo(type).ConvertedType;

我想查找typeSymbol的所有用法/引用。TypeSymbol表示源代码中的类。

为此,我想使用SymbolFinder,但SymbolFinder的方法需要Solution的实例...在早期版本的Roslyn中,Document作为诊断的方法参数,您可以进入项目和解决方案。

2个回答

7

在实现诊断分析器时,目前没有获取工作区或进行多项目分析的方法,因为这些需要能够仅使用命令行编译器针对单个编译运行。但是,一旦确定了诊断,您可以在代码修复提供程序中执行此操作。

如果您只想查找一个类实现另一个类的所有位置,则可以实现ICompilationStartedAnalyzer和ICompilationEndedAnalyzer来创建一个编译范围的诊断分析器,并在决定诊断之前检查所有声明。


我能否从实际的诊断或文档实例中获取到解决方案实例?Roslyn 的旧版本将文档作为方法参数。 - Michal Adda
或者我能否只获取当前正在诊断的解决方案的路径? - Michal Adda
你无法访问那些内容 - 在编译器级别上,甚至不能保证这些东西的存在。如果您更新问题以解释您希望诊断执行什么操作,我们可以提供更好的指导。 - Jason Malinowski

2
如果您确实需要这样做,可以通过反射来实现,但是不能保证在所有环境或任何未来版本中都能正常工作...我只在Windows环境中进行了测试。
public static class RoslynExtensions
{
    public static Solution GetSolution(this SyntaxNodeAnalysisContext context)
    {
        var workspace = context.Options.GetPrivatePropertyValue<object>("Workspace");
        return workspace.GetPrivatePropertyValue<Solution>("CurrentSolution");
    }

    public static T GetPrivatePropertyValue<T>(this object obj, string propName)
    {
        if (obj == null)
        {
            throw new ArgumentNullException(nameof(obj));
        }

        var pi = obj.GetType().GetRuntimeProperty(propName);

        if (pi == null)
        {
            throw new ArgumentOutOfRangeException(nameof(propName), $"Property {propName} was not found in Type {obj.GetType().FullName}");
        }

        return (T)pi.GetValue(obj, null);
    }
}

从分析器中这样调用:

public override void Initialize(AnalysisContext context)
{
    context.RegisterSyntaxNodeAction(AnalyzeConstDeclaration, SyntaxKind.FieldDeclaration);
}

public static void AnalyzeConstDeclaration(SyntaxNodeAnalysisContext context)
{
     var solution = context.GetSolution();
}

这不再起作用了 https://github.com/dotnet/roslyn/pull/2811 - Ali Foroughi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接