Ejemplo n.º 1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Analyzer"/> class.
        /// </summary>
        /// <param name="templates">Templates.</param>
        /// <param name="opt">Options for LG. </param>
        public Analyzer(Templates templates, EvaluationOptions opt = null)
        {
            Templates    = templates;
            _templateMap = templates.ToDictionary(t => t.Name);

            // create an evaluator to leverage it's customized function look up for checking
            var evaluator = new Evaluator(Templates, opt);

            _expressionParser = evaluator.ExpressionParser;
        }
Ejemplo n.º 2
0
            /// <summary>
            /// Return error messaages list.
            /// </summary>
            /// <returns>report result.</returns>
            public List <Diagnostic> Check()
            {
                var result = new List <Diagnostic>();

                // check dup first
                var duplicatedTemplates = Templates
                                          .GroupBy(t => t.Name)
                                          .Where(g => g.Count() > 1)
                                          .ToList();

                if (duplicatedTemplates.Count > 0)
                {
                    duplicatedTemplates.ForEach(g =>
                    {
                        var name    = g.Key;
                        var sources = string.Join(":", g.Select(x => x.Source));

                        var msg = $"Duplicated definitions found for template: {name} in {sources}";
                        result.Add(BuildLGDiagnostic(msg));
                    });

                    return(result);
                }

                // Covert to dict should be fine after checking dup
                templateMap = Templates.ToDictionary(t => t.Name);

                if (Templates.Count == 0)
                {
                    result.Add(BuildLGDiagnostic(
                                   "File must have at least one template definition ",
                                   DiagnosticSeverity.Warning));
                }

                Templates.ForEach(t =>
                {
                    currentSource = t.Source;
                    result.AddRange(Visit(t.ParseTree));
                });

                return(result);
            }