protected override IEnumerable <LinterInfo> GetLinterInformations(MemoryStream memstream)
        {
            var inputStream = new Antlr4.Runtime.AntlrInputStream(memstream);

            var lexer             = new RealVirtuality.SQF.ANTLR.Parser.sqfLexer(inputStream);
            var commonTokenStream = new Antlr4.Runtime.CommonTokenStream(lexer);
            var p        = new RealVirtuality.SQF.ANTLR.Parser.sqfParser(commonTokenStream, ConfigHost.Instance.SqfDefinitions);
            var listener = new RealVirtuality.SQF.ANTLR.SqfListener();

            p.AddParseListener(listener);
            memstream.Seek(0, SeekOrigin.Begin);
            p.RemoveErrorListeners();
#if DEBUG
            p.BuildParseTree = true;
            p.Context        = new Antlr4.Runtime.ParserRuleContext();
#endif

            var se = new List <LinterInfo>();
            p.AddErrorListener(new RealVirtuality.SQF.ANTLR.ErrorListener((recognizer, token, line, charPositionInLine, msg, ex) =>
            {
                switch (ex == null ? null : p.RuleNames[ex.Context.RuleIndex])
                {
                case "binaryexpression":
                    se.Add(new LinterInfo()
                    {
                        StartOffset = token.StartIndex,
                        Length      = token.Text.Length,
                        Message     = string.Concat("Invalid binary expression: ", msg),
                        Severity    = ESeverity.Error,
                        Line        = line,
                        LineOffset  = charPositionInLine,
                        FilePath    = this.FilePath
                    });
                    break;

                case "unaryexpression":
                    se.Add(new LinterInfo()
                    {
                        StartOffset = token.StartIndex,
                        Length      = token.Text.Length,
                        Message     = string.Concat("Invalid unary expression: ", msg),
                        Severity    = ESeverity.Error,
                        Line        = line,
                        LineOffset  = charPositionInLine,
                        FilePath    = this.FilePath
                    });
                    break;

                case "nularexpression":
                    se.Add(new LinterInfo()
                    {
                        StartOffset = token.StartIndex,
                        Length      = token.Text.Length,
                        Message     = string.Concat("Invalid nular expression: ", msg),
                        Severity    = ESeverity.Error,
                        Line        = line,
                        LineOffset  = charPositionInLine,
                        FilePath    = this.FilePath
                    });
                    break;

                default:
                    se.Add(new LinterInfo()
                    {
                        StartOffset = token.StartIndex,
                        Length      = token.Text.Length,
                        Message     = msg,
                        Severity    = ESeverity.Error,
                        Line        = line,
                        LineOffset  = charPositionInLine,
                        FilePath    = this.FilePath
                    });
                    break;
                }
            }));
            p.sqf();
            return(se);
        }
Exemple #2
0
        public IEnumerable <LintInfo> Lint(Stream stream, ProjectFile file)
        {
            var inputStream       = new Antlr4.Runtime.AntlrInputStream(stream);
            var lexer             = new RealVirtuality.SQF.ANTLR.Parser.sqfLexer(inputStream);
            var commonTokenStream = new Antlr4.Runtime.CommonTokenStream(lexer);
            var p        = new RealVirtuality.SQF.ANTLR.Parser.sqfParser(commonTokenStream, ConfigHost.Instance.SqfDefinitions);
            var listener = new RealVirtuality.SQF.ANTLR.SqfListener();

            p.AddParseListener(listener);
            p.RemoveErrorListeners();
#if DEBUG
            p.BuildParseTree = true;
            p.Context        = new Antlr4.Runtime.ParserRuleContext();
#endif

            var se = new List <LintInfo>();
            p.AddErrorListener(new RealVirtuality.SQF.ANTLR.ErrorListener((recognizer, token, line, charPositionInLine, msg, ex) =>
            {
                switch (ex == null ? null : p.RuleNames[ex.Context.RuleIndex])
                {
                case "binaryexpression":
                    se.Add(new LintInfo(file)
                    {
                        StartOffset = token.StartIndex,
                        Length      = token.Text.Length,
                        Message     = string.Concat("Invalid binary expression: ", msg),
                        Severity    = ESeverity.Error,
                        Line        = line,
                        LineOffset  = charPositionInLine
                    });
                    break;

                case "unaryexpression":
                    se.Add(new LintInfo(file)
                    {
                        StartOffset = token.StartIndex,
                        Length      = token.Text.Length,
                        Message     = string.Concat("Invalid unary expression: ", msg),
                        Severity    = ESeverity.Error,
                        Line        = line,
                        LineOffset  = charPositionInLine
                    });
                    break;

                case "nularexpression":
                    se.Add(new LintInfo(file)
                    {
                        StartOffset = token.StartIndex,
                        Length      = token.Text.Length,
                        Message     = string.Concat("Invalid nular expression: ", msg),
                        Severity    = ESeverity.Error,
                        Line        = line,
                        LineOffset  = charPositionInLine
                    });
                    break;

                default:
                    se.Add(new LintInfo(file)
                    {
                        StartOffset = token.StartIndex,
                        Length      = token.Text.Length,
                        Message     = msg,
                        Severity    = ESeverity.Error,
                        Line        = line,
                        LineOffset  = charPositionInLine
                    });
                    break;
                }
            }));
            try
            {
                p.sqf();
            }
            catch (Exception ex)
            {
                App.ShowOperationFailedMessageBox(ex);
                while (ex.InnerException != null)
                {
                    ex = ex.InnerException;
                    App.ShowOperationFailedMessageBox(ex);
                }
                System.Diagnostics.Debugger.Break();
            }
            return(se);
        }