如何知道是否在解决方案中声明了符号

本文关键字:声明 符号 解决方案 何知道 是否 | 更新日期: 2023-09-27 18:06:27

在Roslyn DiagnosticAnalyzer中分析c#源代码时,我有一个ITypeSymbol。如何确定此类型是在源代码中声明还是仅通过程序集引用引用?

我目前的解决方案是检查符号是否有任何DeclaringSyntaxReferences。这在Visual Studio中非常有效。然而,当我在MsBuild执行中进行分析时,我的结果并不准确。问题是MsBuild一个接一个地构建每个项目,所以如果类型符号在另一个项目中声明,那么DeclaringSyntaxReferences将为空。

是否有办法区分"项目引用"answers"程序集引用"?

如何知道是否在解决方案中声明了符号

希望这个方法有帮助:

private bool GetSource(ISymbol symbol, out string filePath)
{
    var baseLocation = symbol.Locations.FirstOrDefault();
    filePath = "SPECIFY CURRENT SYNTAX TREE FILE PATH";
    if (baseLocation == null)
        return false;
    var baseLocationPath = baseLocation.ToString();
    if (baseLocationPath.Contains("SourceFile("))
    {
        baseLocationPath = baseLocation.ToString().Replace("SourceFile(", "");
        filePath = baseLocationPath.Substring(0, baseLocationPath.LastIndexOf("[", StringComparison.Ordinal));
    }
    else if (baseLocationPath.Contains("MetadataFile("))
    {
        baseLocationPath = baseLocation.ToString().Replace("MetadataFile(", "");
        filePath = baseLocationPath.Substring(0, baseLocationPath.LastIndexOf(".dll", StringComparison.Ordinal) + 4);
    }
    return baseLocation.IsInSource;
}