/// <summary> /// Analyze the method /// </summary> private int Analyze() { //Update basic information IsConstructor = Method.IsConstructor; IsDestructor = Method.IsDestructor; Paras = Method.Parameters; ReturnType = Method.ReturnType; //Method. DeclaringClass = Method.GetAncestors<TypeDefinition>().FirstOrDefault(); if (DeclaringClass == null){ return -1; } ParentClasses = DeclaringClass.GetParentTypes(true); //Initilize parameters' info foreach(var para in Paras) { VariableInfo vi = new VariableInfo(para); ParametersInfo.Add(vi); } var statements = Method.GetDescendantsAndSelf(); if(statements.Count() > 1) { HasStatements = true; } else { HasStatements = false; } //Analyze all statement in the method foreach(var st in statements) { AnalyzeStmt(st); } return 0; }
/// <summary> /// Update right hand side of the assignment expression /// </summary> /// <param name="subExps"></param> /// <param name="curPos"></param> /// <param name="vi"></param> /// <param name="IsFieldUpdate"></param> /// <returns></returns> private int UpdateAssignmentExpRightHand(List<Expression> subExps, int curPos, VariableInfo 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++; } } //Analyze the assignment values while(curPos <= subExps.Count() - 1) { var varUse = FindAndUpdateNextVarUse(subExps, curPos, out curPos, true); VariableDeclaration vd = FindFieldVarDecl(varUse); if(vd != null) { vi.AssignedFields.Add(vd); } var lVarInfo = FindLocalVarInfo(varUse); if(lVarInfo != null) { foreach(var feild in lVarInfo.AssignedFields) { vi.AssignedFields.Add(feild); } } var pVarInfo = FindParaVarInfo(varUse); if(pVarInfo != null) { foreach(var feild in pVarInfo.AssignedFields) { vi.AssignedFields.Add(feild); } } } } 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, false); //TO DO: ex. = new school() } } 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); } }