Exemple #1
0
        public override bool test(CSsemi.CSemiExp semi)
        {
            Display.displayRules(actionDelegate, "rule   DetectFunction");

            if (semi[semi.count - 1] != "{")
            {
                return(false);
            }

            int index = semi.FindFirst("(");

            if (index > 0 && !isSpecialToken(semi[index - 1]))
            {
                Repository rep = Repository.getInstance();

                CSsemi.CSemiExp local = new CSsemi.CSemiExp();
                local.Add("function").Add(semi[index - 1]);
                doActions(local);

                if (!rep.isFirstPass)
                {
                    /////////////////////////////////////////////////////////////////
                    //
                    // Parse function parameters to look for class dependencies
                    //
                    /////////////////////////////////////////////////////////////////
                    CSsemi.CSemiExp parameters = TokenHelper.GetFunctionParameters(semi);
                    for (int i = 0; i < TokenHelper.GetNumberOfParameters(parameters); i++)
                    {
                        parameters = TokenHelper.RemoveNewLines(parameters);
                        parameters = TokenHelper.RemoveIndicies(parameters);
                        parameters = TokenHelper.RemoveGenerics(parameters);
                        List <string> l = TokenHelper.GetFunctionParameterAtIndex(parameters, i);

                        foreach (CClassInfo ci in rep.parsedData.classList)
                        {
                            if (semi.Contains(ci.className) != -1)
                            {
                                if (rep.stack.count < 2)
                                {
                                    break;
                                }

                                string ns = rep.stack[0].name;                   // namespace
                                string cl = rep.stack[1].name;                   // class
                                string fn = rep.stack[rep.stack.count - 1].name; // function

                                CClassInfo    currentClassInfo    = rep.parsedData.getClassInfo(cl);
                                CFunctionInfo currentFunctioninfo = rep.parsedData.getClassFunctionInfo(cl, fn);

                                currentFunctioninfo.addDependency(l[l.Count - 2]);
                            }
                        }
                    }
                }

                return(true);
            }
            return(false);
        }
Exemple #2
0
        public override bool test(CSsemi.CSemiExp semi)
        {
            Repository rep = Repository.getInstance();

            if (rep.isFirstPass)
            {
                return(false);
            }

            if (rep.stack.count <= 2)
            {
                // we are not in a class or function scope
                return(false);
            }
            else if (rep.stack[rep.stack.count - 1].type != "function")
            {
                return(false);
            }
            else if (rep.stack.count > 3)
            {
                //Console.WriteLine("skip: unknown code block in function, unhandled");
                return(false);
            }

            Display.displayRules(actionDelegate, "rule   DetectFunctionMembers");

            int index = semi.Contains(";");

            if (index != -1)
            {
                /////////////////////////////////////////////////////////////////
                //
                // Parse function body to look for class member references
                //
                /////////////////////////////////////////////////////////////////

                if (rep.stack.count < 3)
                {
                    return(false);
                }

                string ns = rep.stack[0].name; // namespace
                string cl = rep.stack[1].name; // class
                string fn = rep.stack[2].name; // function

                CClassInfo    currentClassInfo    = rep.parsedData.getClassInfo(cl);
                CFunctionInfo currentFunctionInfo = rep.parsedData.getClassFunctionInfo(cl, fn);

                foreach (CMemberInfo classDataMember in currentClassInfo.dataMembers)
                {
                    if (semi.Contains(classDataMember.name) != -1)
                    {
                        currentFunctionInfo.addDataMemberReference(classDataMember.type, classDataMember.name);
                    }
                }

                /////////////////////////////////////////////////////////////////
                //
                // Parse function body to look for class dependencies
                //
                /////////////////////////////////////////////////////////////////
                foreach (CClassInfo ci in rep.parsedData.classList)
                {
                    if (semi.Contains(ci.className) != -1)
                    {
                        currentFunctionInfo.addDependency(ci.className);
                    }
                }

                return(true);
            }

            return(false);
        }