Dostęp do ścieżki pliku można uzyskać od SyntaxTreeAction
przy użyciu Tree.FilePath
off of SyntaxTreeContext
.
Po uzyskaniu ścieżki można następnie przeanalizować i porównać ją z nazwą wszystkich nazw węzłów NamesSpaceDeclarationSyntax
w drzewie.
Niestety, nie sądzę, że istnieje sposób, aby uzyskać dostęp do domyślnej przestrzeni nazw dla projektu w tym czasie.
Oto krótka próbka, którą zrzuciłem, która robi to, co może. Przetwarzanie/porównywanie ścieżki do przestrzeni nazw jest prymitywne i prawdopodobnie istnieje lepszy sposób na zrobienie tego, ale to powinno zacząć.
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));
}
}
});
});
}
To nie sprawdzi zagnieżdżonych deklaracji 'namespace'. – SLaks
@SLaks Nice catch, naprawiony. –
To wciąż jest złe; 'ns.Name' nie zawiera zewnętrznych bloków. – SLaks