Esempio n. 1
0
        public override CodeContext Copy()
        {
            var Ret = new CodeCheckerContext(Container, IdData);

            Ret.RouteData = new CodeCheckerRouteData[RouteData.Length];
            RouteData.CopyTo(Ret.RouteData, 0);
            return(Ret);
        }
Esempio n. 2
0
        public static CodeContextResult Process(FunctionScope Scope)
        {
            Initialize(Scope);
            var State   = Scope.State;
            var Context = new CodeCheckerContext(Scope);
            var Ret     = Context.Process();

            if (Scope.Code.Length > 0)
            {
                for (var i = 0; i < Context.IdData.Length; i++)
                {
                    var Local = Scope.LocalIdentifiers[i] as LocalVariable;
                    if (Local == null)
                    {
                        continue;
                    }

                    var IdData = Context.IdData[i];
                    if ((IdData.Flags & CodeCheckerIdDataFlags.Used) == 0 &&
                        (Local.Flags & IdentifierFlags.ReadOnly) == 0)
                    {
                        State.Messages.Add(MessageId.UnusedId, Local.Name);
                    }
                    else if ((IdData.Flags & CodeCheckerIdDataFlags.Read) == 0 &&
                             (IdData.Flags & CodeCheckerIdDataFlags.AddressUsed) == 0 && !Local.PreAssigned)
                    {
                        State.Messages.Add(MessageId.AssignedButNeverUsed, Local.Name);
                    }
                }
            }

            if ((Scope.ReturnLabelCommand.Flags & CommandFlags.Unreachable) == 0)
            {
                if (Scope.NeedsReturnVal)
                {
                    Scope.State.Messages.Add(MessageId.NotAllPathReturn, Scope.Function.Declaration);
                    Ret |= CodeContextResult.Failed;
                }
            }

            Scope.ReturnLabelCommand.Flags &= ~CommandFlags.Unreachable;
            if (!Finalize(Scope))
            {
                Ret |= CodeContextResult.Failed;
            }
            return(Ret);
        }