/// <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); }
/// <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); } }