罗斯林的完全限定命名空间元数据错误



我正在尝试制作一个代码分析器来检查完全限定的 using 语句。 这个链接非常有用,也是我解决方案的基础(如何从 Roslyn 中的 using 指令获取完全限定的命名空间?(,但是当我尝试访问 using 指令的符号位置时,我遇到了问题。 我的代码如下所示:

private static void AnalyzeModel(SemanticModelAnalysisContext semanticModelAnalysisContext)
{
var semanticModel = semanticModelAnalysisContext.SemanticModel;
var root = semanticModel.SyntaxTree.GetRoot();
// compare each using statement's name with its fully qualified name
foreach (var usingDirective in root.DescendantNodes().OfType<UsingDirectiveSyntax>())
{
var symbol = semanticModel.GetSymbolInfo(usingDirective.Name).Symbol;
var fullyQualifiedName = symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
if (fullyQualifiedName.Contains(GlobalTag))
{
fullyQualifiedName = fullyQualifiedName.Substring(GlobalTag.Length);
}
if (usingDirective.Name.ToString() != fullyQualifiedName)
{
// for each name that is not fully qualified, produce a diagnostic.
var diagnostic = Diagnostic.Create(Rule, symbol.Locations[0], symbol.Name);
semanticModelAnalysisContext.ReportDiagnostic(diagnostic);
}
}
}

问题是symbol.Locations[0]仅包含元数据中的项目,而不包含源中的项目。 这会导致以下错误:

Assert.IsTrue failed. Test base does not currently handle diagnostics in metadata locations.

我的单元测试中的源代码如下所示:

private const string incorrectSourceCode = @" namespace System { using IO; using Threading; }";

为什么symbol.Locations中没有源中的项目? 还有其他地方可以得到这个位置吗? 我尝试使用symbol.ContainingSymbol.Locations[0]symbol.ContainingNamespace.Locations[0],但这些并不是指我感兴趣的特定用途。我已经为此拔头发几个小时了,一些清晰度将不胜感激。

提前感谢!

Symbol包含MetadateLocation,所以如果你想查看SourceLocation只需从适当的SyntaxNode中检索它:

var diagnostic = Diagnostic.Create(Rule, usingDirective.Name.GetLocation(), symbol.Name)

而不是

var diagnostic = Diagnostic.Create(Rule, symbol.Locations[0], symbol.Name)

相关内容

  • 没有找到相关文章

最新更新