您可以使用SyntaxTreeContext
以外的Tree.FilePath
訪問SyntaxTreeAction
的文件路徑。
一旦你有了路徑,你就可以解析並將其與樹中NamesSpaceDeclarationSyntax
節點的所有名稱進行比較。
不幸的是,我不認爲有一種方法可以在此時獲取項目的默認名稱空間。
這是一個快速樣本,我扔在一起,做到目前爲止它可以做到。處理/比較命名空間的路徑是基本的,可能有更好的方法來做到這一點,但這應該讓你開始。
public override void Initialize(AnalysisContext context)
{
context.RegisterCompilationStartAction((compilationSyntax) =>
{
compilationSyntax.RegisterSyntaxTreeAction((syntaxTreeContext) =>
{
var semModel = compilationSyntax.Compilation.GetSemanticModel(syntaxTreeContext.Tree);
var filePath = syntaxTreeContext.Tree.FilePath;
if (filePath == null)
return;
var namespaceNodes = syntaxTreeContext.Tree.GetRoot().DescendantNodes().OfType<NamespaceDeclarationSyntax>();
var parentDirectory = System.IO.Path.GetDirectoryName(filePath);
// This will only work on windows and is not very robust.
var parentDirectoryWithDots = parentDirectory.Replace("\\", ".").ToLower();
foreach (var ns in namespaceNodes)
{
var symbolInfo = semModel.GetDeclaredSymbol(ns) as INamespaceSymbol;
var name = symbolInfo.ToDisplayString();
if (!parentDirectoryWithDots.EndsWith(name.ToLower().Trim()))
{
syntaxTreeContext.ReportDiagnostic(Diagnostic.Create(
Rule, ns.Name.GetLocation(), parentDirectoryWithDots));
}
}
});
});
}
這不會檢查嵌套'命名空間'聲明。 – SLaks
@SLaks很好的捕獲,修復。 –
這仍然是錯誤的; 'ns.Name'將不包含外部塊。 – SLaks