-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNamespaceResolvingAnalyzer.cs
65 lines (55 loc) · 2.55 KB
/
NamespaceResolvingAnalyzer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Collections.Immutable;
using System.IO;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Diagnostics;
namespace NamespaceResolver
{
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class NamespaceResolvingAnalyzer : DiagnosticAnalyzer
{
private const string DiagnosticId = "NR0001";
private static readonly LocalizableString Title = "Namespace resolver";
private static readonly LocalizableString MessageFormat = "Namespace must match file location";
private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(
DiagnosticId,
Title,
MessageFormat,
"Naming",
DiagnosticSeverity.Warning,
isEnabledByDefault : true);
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
public override void Initialize(AnalysisContext context)
{
context.RegisterCompilationStartAction((compilationContext) =>
{
compilationContext.RegisterSyntaxTreeAction((syntaxTreeContext) =>
{
var semModel = compilationContext.Compilation.GetSemanticModel(syntaxTreeContext.Tree);
var filePath = syntaxTreeContext.Tree.FilePath;
if (filePath == null)
return;
var parentDirectory = System.IO.Path.GetDirectoryName(filePath);
var parentDirectoryWithDots = parentDirectory.Replace(Path.DirectorySeparatorChar, '.');
var namespaceNodes = syntaxTreeContext.Tree
.GetRoot()
.DescendantNodes()
.OfType<NamespaceDeclarationSyntax>();
foreach (var ns in namespaceNodes)
{
var symbolInfo = semModel.GetDeclaredSymbol(ns) as INamespaceSymbol;
var name = symbolInfo.ToDisplayString();
if (!parentDirectoryWithDots.EndsWith(name, StringComparison.OrdinalIgnoreCase))
{
syntaxTreeContext.ReportDiagnostic(Diagnostic.Create(
Rule, ns.Name.GetLocation(), parentDirectoryWithDots));
}
}
});
});
}
}
}