/// <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;
                }
            }
        }
Beispiel #3
0
 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);
        }
Beispiel #7
0
            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;
            }
Beispiel #10
0
 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());
 }