SyntaxTreeAction
からファイルパスにアクセスするには、SyntaxTreeContext
のTree.FilePath
を使用します。
パスを取得したら、そのパスを解析し、ツリー内の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));
}
}
});
});
}
これはネストされた 'namespace'宣言をチェックしません。 – SLaks
@SLaksいいキャッチ、修正。 –
これはまだ間違っています。 'ns.Name'は外側のブロックを含みません。 – SLaks