コード例 #1
0
        /// <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;
        }
コード例 #2
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;
        }
コード例 #3
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, 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);
            }
        }