public bool AddPreCondition(BoxedExpression boxedExpression, APC apc, Provenance provenance)
        {
            if (!this.CanAddRequires())
            {
                this.AddEntryAssume(boxedExpression, provenance); // record it as assume instead
                return(false);
            }
            var pre = new BoxedExpression.AssumeExpression(boxedExpression, "requires", apc, provenance, boxedExpression.ToString <Type>(type => OutputPrettyCS.TypeHelper.TypeFullName(this.AnalysisDriver.MetaDataDecoder, type)));

            this.inferredPreconditions.Add(pre);
            return(true);
        }
        public void InstallEntryAssumes(ICFG cfg, IEnumerable <Pair <BoxedExpression, Method> > inferredAssumes, Method method)
        {
            Contract.Requires(inferredAssumes != null);

            foreach (var inferredAssume in inferredAssumes)
            {
                var        assume     = inferredAssume.One;
                var        dummyAPC   = cfg.Entry; // TODO: do something better here! we don't know the APC yet, so we just pick some legitimate APC to avoid null ptr deref when looking up src context
                Provenance provenance = null;
                var        be         = new BoxedExpression.AssumeExpression(assume, "assume", dummyAPC, provenance, assume.ToString <Type>(type => OutputPrettyCS.TypeHelper.TypeFullName(this.MetaDataDecoder, type)));
                var        pc         = new BoxedExpression.PC(be, 0);

                this.MethodCache.AddEntryAssume(cfg, method, pc, ClousotExpressionCodeProvider <Local, Parameter, Method, Field, Type> .Decoder);
            }
        }
        public bool AddCalleeAssume(BoxedExpression assumeExpression, object callee, APC apc, Provenance provenance)
        {
            Contract.Assume(callee != null);

            if (!this.CanAddAssumes())
            {
                return(false);
            }
            // TODO: collect context info
            var assume = new BoxedExpression.AssumeExpression(assumeExpression, "assume", apc, provenance, assumeExpression.ToString());

            //var assumePostCond = new BoxedExpression.AssumeAsPostConditionExpression(assumeExpression, null, callee, calleeName, "assume", apc, provenance);
            //var assume = new BoxedExpression.AssumeExpression(boxedExpression, "assume", apc, provenance);
            this.inferredCalleeAssumes.Add(Pair.For(assume, (Method)callee));
            return(true);
        }
        /// <summary>
        /// Responsibility to make sure the assume can be properly decoded lies with the serializer/deserializer.
        /// The SER/DES should have enough detail and checks to make sure a deserialized expression can be decoded without
        /// failing due to stack mismatch or failed type assumptions.
        /// </summary>
        public void InstallCalleeAssumes(ICFG cfg, IEnumerable <Pair <BoxedExpression, Method> > inferredAssumes, Method method)
        {
            Contract.Requires(inferredAssumes != null);

#if false
            if (!inferredAssumes.Any())
            {
                return;
            }
            //this.Output.WriteLine("Trying to install {0} inferred assumes.", inferredAssumes.Count);

            // We lookup by name
            var locs   = this.MetaDataDecoder.Locals(method).Enumerate().Select(local => this.MetaDataDecoder.Name(local));
            var paramz = this.MetaDataDecoder.Parameters(method).Enumerate().Select(parameter => this.MetaDataDecoder.Name(parameter));
            var fields = this.MetaDataDecoder.Fields(this.MetaDataDecoder.DeclaringType(method)).Select(m => this.MetaDataDecoder.Name(method));
#endif
            // TODO: can the name / expr matching get mixed up during deserialization?
            foreach (var inferredAssume in inferredAssumes)
            {
                var assume = inferredAssume.One;
                //this.Output.WriteLine("Installing assume " + assume);
#if false
                #region Ensure that all var's in the assume expression still exist in the new version of the function

                // Check that the variables appearing in the assume to install exists in the scope.
                // We use the name of the variables to make sure they are the same variable
                var foundAllVariables = assume.Variables().TrueForAll(v =>
                {
                    var vToString = v.ToString();

                    // check for var in locs
                    var found = locs.Any(loc => vToString == loc);

                    // check for var in params
                    found = found || paramz.Any(param => vToString == param);
                    //string paramStr = this.MetaDataDecoder.ParameterType(paramz[j]) + " " + v.ToString(); // create str with same format as parameter string; hacky, but needed

                    // check for var in fields
                    found = found || fields.Any(fName =>
                    {
                        return(vToString == fName || // "normal" case
                               vToString == String.Format("this.{0}", fName)); // case where field prefixed with "this"
                    });

                    return(found);
                });
                if (!foundAllVariables)
                {
                    continue;
                }
                #endregion
                // found all locals, going to try to install this assume
#endif
                var        dummyAPC   = cfg.Entry; // TODO: do something better here! we don't know the APC yet, so we just pick some legitimate APC to avoid null ptr deref when looking up src context
                Provenance provenance = null;
                var        be         = new BoxedExpression.AssumeExpression(assume, "assume", dummyAPC, provenance, assume.ToString <Type>(type => OutputPrettyCS.TypeHelper.TypeFullName(this.MetaDataDecoder, type)));
                var        pc         = new BoxedExpression.PC(be, 0);

                var calleeName = inferredAssume.Two;

                this.MethodCache.AddCalleeAssumeAsPostCondition(cfg, method, calleeName, pc, ClousotExpressionCodeProvider <Local, Parameter, Method, Field, Type> .Decoder);
            }
        }