public override bool ExamineSource(ChameleonEditor ed, ScintillaNet.Range searchRange)
        {
            m_checkSucceeded = false;

            ANTLRParser parser = Singleton <ANTLRParser> .Instance;

            if (!parser.ParseCompleted)
            {
                return(false);
            }


            ASTNode root = parser.GetAST();

            List <ASTNode> conditions = (from n in root.Descendants()
                                         where n.text == "condition"
                                         select n).ToList();

            string astText = root.ASTToString();

            foreach (ASTNode condition in conditions)
            {
                List <ASTNode> assignments = (from n in condition.Descendants()
                                              where n.text == "assign" || n.text == "="
                                              select n).ToList();

                if (assignments.Count > 0)
                {
                    foreach (ASTNode assignment in assignments)
                    {
                        int    actualLine = searchRange.StartingLine.Number + assignment.lineNumber - 1;
                        string errorText  = "Assignment not allowed in boolean conditions";

                        AddError(ed, actualLine, errorText);
                    }
                }
            }

            List <ASTNode> whiles = (from n in root.Descendants()
                                     where n.text == "while"
                                     select n).ToList();

            foreach (ASTNode wh in whiles)
            {
                if (wh.firstChild.text != "condition")
                {
                    List <ASTNode> pieces = new List <ASTNode>();

                    Func <ASTNode, bool> getWhilePieces = (node =>
                    {
                        bool keepGoing = true;
                        if (node.text == "body")
                        {
                            keepGoing = false;
                        }
                        else
                        {
                            pieces.Add(node);
                        }

                        return(keepGoing);
                    });

                    wh.TraverseAST(false, getWhilePieces);

                    List <ASTNode> assignmentPieces = pieces.Where(node => node.text == "assign" ||
                                                                   node.text == "=").ToList();

                    if (assignmentPieces.Count > 0)
                    {
                        foreach (ASTNode assignmentPiece in assignmentPieces)
                        {
                            int    actualLine = searchRange.StartingLine.Number + assignmentPiece.lineNumber - 1;
                            string errorText  = "Assignment not allowed in boolean conditions";

                            AddError(ed, actualLine, errorText);
                        }
                    }
                }
            }

            m_checkSucceeded = true;
            return(m_checkSucceeded);
        }
        public override bool ExamineSource(ChameleonEditor ed, ScintillaNet.Range searchRange)
        {
            bool m_checkSucceeded = true;

            CtagsManagerWrapper cmw    = Singleton <CtagsManagerWrapper> .Instance;
            ANTLRParser         parser = Singleton <ANTLRParser> .Instance;

            int lineNum = searchRange.StartingLine.Number;

            Tag fn = cmw.FunctionFromFileLine(ed.Filename, lineNum + 1, false);

            List <Tag> locals = ed.Context.GetLocalVariables(searchRange.Start);

            if (locals == null)
            {
                m_checkSucceeded = false;
                return(false);
            }

            List <Tag> singleCharVars = locals.Where(t => t.name.Length == 1).ToList();

            if (singleCharVars.Count > 0)
            {
                //string functionText = ed.Context.GetFunctionText(lineNum);
                //parser.SetSource(functionText, ed.Filename);

                if (!parser.ParseCompleted)
                {
                    // act like nothing's wrong
                    return(true);
                }

                foreach (Tag t in singleCharVars)
                {
                    ASTNode root = parser.GetAST();

                    string astText = root.ASTToString();

                    List <ASTNode> usages = (from n in root.Descendants()
                                             where n.text == t.name && n.type == 10
                                             select n).ToList();

                    if (usages.Count > 0)
                    {
                        ASTNode firstUsage = usages[0];

                        ASTNode ancestor = firstUsage.GetAncestor(4);
                        if (ancestor != null && ancestor.text == "for")
                        {
                            continue;
                        }
                    }

                    int errorLine = -1;

                    if (t.lineNumber < 0)
                    {
                        //string varDeclaration = t.scope + " " + t.name;

                        //int declarationPos = searchRange.Text.IndexOf(varDeclaration);
                        errorLine = searchRange.StartingLine.Number;


                        /*
                         * if(declarationPos != -1)
                         * {
                         *      int actualPos = searchRange.Start + declarationPos;
                         *      errorLine = ed.Lines.FromPosition(actualPos).Number;
                         * }
                         */
                    }
                    else
                    {
                        errorLine = searchRange.StartingLine.Number + t.lineNumber;
                    }

                    if (errorLine < 0)
                    {
                        continue;
                    }

                    string errorText = "Single-character variable names only allowed as loop indices";

                    AddError(ed, errorLine, errorText);
                }
            }

            return(m_checkSucceeded);
        }