/// <summary> /// Analyze return statement /// </summary> /// <param name="rst"></param> private void AnalyzeReturnStmt(ReturnStatement rst) { //recursively analyze var exp = rst.Content; if (exp == null) //case of return; { return; } UpdateByExpression(exp); //update name use info. //simple case. Just return a NameUse. such as return c. if (exp is NameUse && !exp.GetType().IsSubclassOf(typeof(NameUse))) { UpdateReturnInfoByNU((NameUse)exp); } //More complicated cases. var subExps = exp.Components.ToList(); int pos = 0; while (pos < subExps.Count()) { NameUse nu = FindAndUpdateNextVarUse(subExps, pos, out pos, false); if (nu != null) { UpdateReturnInfoByNU(nu); } } }
/// <summary> /// /// </summary> /// <param name="nu"></param> private void UpdateReturnInfoByNU(NameUse nu) { VariableDeclaration vdNameUse = FindFieldVarDecl(nu); if (vdNameUse != null) { GetSelfFields.Add(vdNameUse); } else { //update if assignedVar is a local variable var lVarInfo = FindLocalVarInfo(nu); if (lVarInfo != null) { foreach (var vd in lVarInfo.AssignedFields) { PropertyFields.Add(vd); } lVarInfo.IsReturned = true; } //update if assignedVar is a paramether var pVarInfo = FindParaVarInfo(nu); if (pVarInfo != null) { foreach (var vd in pVarInfo.AssignedFields) { PropertyFields.Add(vd); } pVarInfo.IsReturned = true; } } }
public static string ToString(NameUse value) { if (value == NameUse.Usual) { return("usual"); } else if (value == NameUse.Official) { return("official"); } else if (value == NameUse.Temp) { return("temp"); } else if (value == NameUse.Nickname) { return("nickname"); } else if (value == NameUse.Anonymous) { return("anonymous"); } else if (value == NameUse.Old) { return("old"); } else if (value == NameUse.Maiden) { return("maiden"); } else { throw new ArgumentException("Unrecognized NameUse value: " + value.ToString()); } }
private static void TestEquality(NameUse expected, NameUse actual, string propertyName) { try { IsTrue(expected.Name == actual.Name, "Name"); ExpressionsAreEqual(expected.Prefix, actual.Prefix, "Prefix"); } catch (DataAssertionException e) { e.Add(propertyName); throw e; } TestEquality((Expression)expected, (Expression)actual, propertyName); }
/// <summary> /// Find field varible declaration for the given variable (return null if it's a local variable) /// </summary> /// <param name="vb"></param> /// <returns></returns> private VariableDeclaration FindFieldVarDecl(NameUse vb) { if (vb == null) { return(null); } var decl = vb.FindMatches().FirstOrDefault() as VariableDeclaration; if (decl != null) { //if did not find in the current list, but method is matching MethodDefinition md = decl.ParentStatement.GetAncestorsAndSelf <MethodDefinition>().FirstOrDefault(); if (md == null || !Method.Equals(md)) { return(decl); } } return(null); }
/// <summary> /// Find and return parameters' VariableInfo by the given NameUse /// </summary> /// <param name="vb"></param> /// <returns></returns> private VariableInfo FindParaVarInfo(NameUse vb) { if (vb == null) { return(null); } var decl = vb.FindMatches().FirstOrDefault() as VariableDeclaration; if (decl != null) { foreach (var varInfo in ParametersInfo) { if (varInfo.Variable.Equals(decl)) { return(varInfo); } } } return(null); }
public static bool TryParse(string value, out NameUse result) { result = default(NameUse); if (value == "usual") { result = NameUse.Usual; } else if (value == "official") { result = NameUse.Official; } else if (value == "temp") { result = NameUse.Temp; } else if (value == "nickname") { result = NameUse.Nickname; } else if (value == "anonymous") { result = NameUse.Anonymous; } else if (value == "old") { result = NameUse.Old; } else if (value == "maiden") { result = NameUse.Maiden; } else { return(false); } return(true); }
/// <summary> /// Analyze the expression and return NameUse it belongs /// </summary> /// <param name="exp"></param> /// <returns></returns> private NameUse GetNameUseOrObj(Expression exp, out bool IsFieldUpdate) { if (!exp.Components.Any()) { IsFieldUpdate = false; return(exp as NameUse); } var compList = exp.Components.ToList(); //check if it contains sub assignment expression if (compList.Count > 2) { UpdateByExpToTheEnd(compList, 0); IsFieldUpdate = false; for (int curPos = 0; curPos < compList.Count; curPos += 2) { if (curPos + 1 < compList.Count) { var expOp = compList.ElementAt(curPos + 1) as OperatorUse; if (expOp != null) { if (IsNameInclusionOp(expOp)) { //Has connection op (Check one matching by assuming the inputs are syntax correct.) IsFieldUpdate = true; } } } NameUse nu = compList.ElementAt(curPos) as NameUse; if (nu != null && nu.Name != "this" && nu.Name != "base") { return(nu); } } return(null); //if(compList.First() is NameUse) { // //Has connection op (Check one matching by assuming the inputs are syntax correct.) // var expOp = compList.ElementAt(1) as OperatorUse; // if(expOp != null) { // foreach(var op in NameInclusionOperators) { // if(op.Equals(expOp.Text)) { // IsFieldUpdate = true; // // check non static field // var field = compList.Last() as NameUse; // if(field != null && !field.GetType().IsSubclassOf(typeof(NameUse))) { // VariableDeclaration vd = field.FindMatches().FirstOrDefault() as VariableDeclaration; // //if(vd != 0 && vd.) { // //} // } // } // } // } //} //return compList.First() as NameUse; } IsFieldUpdate = false; return(null); }
public static bool TryParse(string value, out NameUse result) { result = default(NameUse); if( value=="usual") result = NameUse.Usual; else if( value=="official") result = NameUse.Official; else if( value=="temp") result = NameUse.Temp; else if( value=="nickname") result = NameUse.Nickname; else if( value=="anonymous") result = NameUse.Anonymous; else if( value=="old") result = NameUse.Old; else if( value=="maiden") result = NameUse.Maiden; else return false; return true; }
public static string ToString(NameUse value) { if( value==NameUse.Usual ) return "usual"; else if( value==NameUse.Official ) return "official"; else if( value==NameUse.Temp ) return "temp"; else if( value==NameUse.Nickname ) return "nickname"; else if( value==NameUse.Anonymous ) return "anonymous"; else if( value==NameUse.Old ) return "old"; else if( value==NameUse.Maiden ) return "maiden"; else throw new ArgumentException("Unrecognized NameUse value: " + value.ToString()); }