【问题标题】:Get the solution for analyzer获取分析仪解决方案
【发布时间】:2017-04-04 01:41:53
【问题描述】:

我正在为 Visual Studio 创建一个分析器,并且我需要 SymbolFinder.FindSourceDefinitionAsync(ISymbol, Solution) 所需的解决方案属性,以确保我确实在我想要的类型上进行操作。

public static async Task<ITypeSymbol> GetBaseScenario(ITypeSymbol type)
    {
        if (type == null)
            return null;

        var origType = await SymbolFinder.FindSourceDefinitionAsync(type, _solution);
        if (BaseScnSymbols.Contains(origType) || BaseVersionScnSymbols.Contains(origType))
            return origType as ITypeSymbol;

        return null;
    }

我可以获得语义模型,编译,但我无法获得解决方案。 我怎样才能得到解决方案?有没有更好的方法来解决这个问题?

【问题讨论】:

  • 你想达到什么目的?可能有一种方法可以在没有解决方案的情况下做到这一点。
  • 我已经在answer here 上发布了如何操作

标签: c# roslyn roslyn-code-analysis


【解决方案1】:

您不能也通常不应尝试在分析期间访问解决方案。这是为了性能和正确性。 This answer 仍然适用。如果您描述您的实际情况,通常有一种方法无法获得解决方案。

【讨论】:

  • 好吧,在 MethodDeclarationSyntax 中,我找到了所有具有特定 BaseType 的符号。我想在creationExpression、初始化程序、赋值和调用中提取与这些符号相关的所有硬编码值。我正在使用 await SymbolFinder.FindDerivedClassesAsync(namedTS, _solution) 来获取从想要的 BaseType 派生的所有符号,但现在我没有解决方案让我循环每个符号 BaseType.OriginalDefinition 以查找符号是否源自它。我说清楚了吗?要我编辑问题吗?
【解决方案2】:

据我所知,获得解决方案符号的唯一方法是通过其物理路径使用MSBuildWorkspace.OpenSolutionAsync 加载它。

【讨论】:

  • 不会因为对象实例不同而造成符号/语法节点之间的不匹配吗?
  • 恐怕我不明白你的意思。
  • 我想说的是,如果我手动打开解决方案,它将与我从 DiagnosticAnalyzer 的上下文中获得的语​​义模型无关,这意味着 SymbolFinder.FindSourceDefinitionAsync( ) 不会将给定的符号与 SourceDefinition 匹配。我错了吗?
  • 似乎没有直接的方法可以做你想做的事。我发现了这个问题:stackoverflow.com/questions/23203206/…,这是一个类似的问题。不过,它已有 2 年多的历史了,因此该主题可能已经取得了一些进展。
  • 我想我必须尝试另一种方法。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2019-07-21
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
相关资源
最近更新 更多