Example #1
0
        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);
            }
        }
Example #2
0
        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);
        }
Example #3
0
 private static void CheckCustomFiles(
     CompilationAnalysisContext context, ConfigPod pod)
 {
Example #4
0
 private void StartAction(
     CompilationStartAnalysisContext context, ConfigPod pod)
 {
     context.RegisterSyntaxTreeAction(
         c => AnalyzeSyntaxTree(c, pod));
 }