Example #1
0
        /// <summary>
        /// Update right hand side of the assignment expression
        /// </summary>
        /// <param name="subExps"></param>
        /// <param name="curPos"></param>
        /// <param name="vi"></param>
        /// <returns></returns>
        private int UpdateAssignmentExpRightHand(List <Expression> subExps, int curPos, VariableDeclaration vi, bool IsFieldUpdate)
        {
            //update if vi is a local variable
            if (vi != null)
            {
                //vi.IsModified = true;
                //vi.IsFieldChange = IsFieldUpdate;
                // check keyword new after equal =
                if (curPos < subExps.Count())
                {
                    var oUse = subExps.ElementAt(curPos) as OperatorUse;
                    if (oUse != null && oUse.Text == "new")
                    {
                        //vi.IsInstantiated = true;
                        curPos++;
                    }
                }


                HashSet <VariableDeclaration> AssigningVars = new HashSet <VariableDeclaration>();
                Statement curStmt = null;
                //Analyze the assignment values
                while (curPos <= subExps.Count() - 1)
                {
                    var varUse = FindAndUpdateNextVarUse(subExps, curPos, out curPos, true);
                    curStmt = subExps[curPos - 1].ParentStatement;

                    //handle method call args
                    if (this.HasMethodCallOnRight == true)
                    {
                        HasMethodCallOnRight = false;
                        AssigningVars.UnionWith(this.ArgVarAssigning);
                        ArgVarAssigning.Clear();
                        HasMethodCallOnRight = false;
                    }
                    //end handle method call args

                    VariableDeclaration vd = FindFieldVarDecl(varUse);
                    if (vd != null)
                    {
                        //vi.AssignedFields.Add(vd);

                        //get vd
                        AssigningVars.Add(vd);
                    }
                    var lVarInfo = FindLocalVarInfo(varUse);
                    if (lVarInfo != null)
                    {
                        foreach (var feild in lVarInfo.AssignedFields)
                        {
                            //vi.AssignedFields.Add(feild);
                        }

                        //get vd
                        AssigningVars.Add(lVarInfo.Variable);
                    }
                    var pVarInfo = FindParaVarInfo(varUse);
                    if (pVarInfo != null)
                    {
                        foreach (var feild in pVarInfo.AssignedFields)
                        {
                            //vi.AssignedFields.Add(feild);
                        }

                        //get vd
                        AssigningVars.Add(pVarInfo.Variable);
                    }
                }
                if (AssigningVars.Count > 0 && curStmt != null)
                {
                    VAssignmentManager.AddNewRelations(vi, AssigningVars, curStmt);
                }
            }
            return(curPos);
        }
Example #2
0
        /// <summary>
        /// update info based on the expression
        /// </summary>
        /// <param name="exp"></param>
        public void UpdateByExpression(Expression exp)
        {
            if (exp is VariableDeclaration)
            {
                //variable declaration expression
                var          vdExp = (VariableDeclaration)exp;
                VariableInfo vi    = new VariableInfo(vdExp);
                VariablesInfo.Add(vi);

                //update if it contains assignment
                if (vdExp.Initializer != null)
                {
                    var subExps = new List <Expression>();
                    if (vdExp.Initializer.Components.Count == 0)
                    {
                        subExps.Add(vdExp.Initializer);
                    }
                    else
                    {
                        subExps = vdExp.Initializer.Components.ToList();
                    }
                    UpdateAssignmentExpRightHand(subExps, 0, vi.Variable, false);
                    //TO DO: ex. = new school()
                }
                else
                {
                    //Special process,  since Linq is not in Srcml.net
                    if (vdExp.Location.EndingLineNumber - vdExp.Location.StartingLineNumber > 1)
                    {
                        var assignedVar = vdExp;
                        HashSet <VariableDeclaration> AssigningVars = new HashSet <VariableDeclaration>();
                        Statement stmt         = vdExp.ParentStatement;
                        var       assigningVar = this.VAssignmentManager.FindMostComplecatedVD();
                        if (assigningVar != null)
                        {
                            AssigningVars.Add(assigningVar);
                        }
                        if (AssigningVars.Count > 0 && stmt != null)
                        {
                            VAssignmentManager.AddNewRelations(assignedVar, AssigningVars, stmt);
                        }
                    }
                }
            }
            else if (exp is MethodCall)
            {
                //Method call expression
                var mcExp = (MethodCall)exp;
                UpdateMethodCall(mcExp);
            }
            else
            {
                //Update the expression
                var subExps = exp.Components.ToList();

                int curPos = 0;

                // Checks keyword new
                if (subExps.Count > 0)
                {
                    var oUse = subExps.ElementAt(0) as OperatorUse;
                    if (oUse != null && oUse.Text == "new")
                    {
                        if (InReturnStmt > 0)
                        {
                            IsReturnNewObj = true;
                        }
                        curPos++;
                    }
                }
                UpdateByExpToTheEnd(subExps, curPos);
            }
        }