private static void DiagnosticConfig( CompilationAnalysisContext context, ConfigPod pod) { Location NewLocation(int row, int col) { var path = pod.Path; if (path is null) { return(Location.None); } var start = new LinePosition(row, col); return(Location.Create( path, new TextSpan(0, 0), new LinePositionSpan(start, start))); } if (pod.Exception is XmlException xmlException) { var row = xmlException.LineNumber - 1; var col = xmlException.LinePosition - 1; var diagnostic = Diagnostic.Create( Rule, NewLocation(row, col), xmlException.Message); context.ReportDiagnostic(diagnostic); return; } if (pod.Exception is BindException bindException) { var info = bindException.LineInfo; var localtion = info.HasLineInfo() ? NewLocation(info.LineNumber - 1, info.LinePosition - 1) : NewLocation(0, 0); var diagnostic = Diagnostic.Create( Rule, localtion, bindException.Message); context.ReportDiagnostic(diagnostic); return; } if (!(pod.Exception is null)) { var diagnostic = Diagnostic.Create( Rule, NewLocation(0, 0), pod.Exception.ToString()); context.ReportDiagnostic(diagnostic); return; } var errors = pod.RootConfig.Validate() .Select(e => e.ToTuple()); foreach (var(line, column, message) in errors) { var diagnostic = Diagnostic.Create( Rule, NewLocation(line - 1, column - 1), message); context.ReportDiagnostic(diagnostic); } }
private static void AnalyzeSyntaxTree( SyntaxTreeAnalysisContext context, ConfigPod pod) { var config = pod.RootConfig.LongLine; var maxLineLength = config.GetMaxLineLength(); bool Over(Location location) => location.GetLineSpan() .StartLinePosition .Character >= maxLineLength; var root = context.Tree.GetCompilationUnitRoot( context.CancellationToken); var firstTrivia = root.DescendantTrivia() .FirstOrDefault(t => t.IsKind(SyntaxKind.EndOfLineTrivia) && Over(t.GetLocation())); var firstToken = root.DescendantTokens(descendIntoTrivia: true) .FirstOrDefault( t => t.IsKind(SyntaxKind.XmlTextLiteralNewLineToken) && Over(t.GetLocation())); var list = new List <Location>(); if (firstTrivia != default) { list.Add(firstTrivia.GetLocation()); } if (firstToken != default) { list.Add(firstToken.GetLocation()); } if (list.Count == 0) { return; } list.Sort((location, another) => location.SourceSpan.Start - another.SourceSpan.Start); /* list[0] is safe. */ var first = list[0]; var diagnostic = Diagnostic.Create( Rule, first, maxLineLength); context.ReportDiagnostic(diagnostic); }
private static void CheckCustomFiles( CompilationAnalysisContext context, ConfigPod pod) {
private void StartAction( CompilationStartAnalysisContext context, ConfigPod pod) { context.RegisterSyntaxTreeAction( c => AnalyzeSyntaxTree(c, pod)); }