private MemberDecl EvalTacticApplication(MemberDecl target, Resolver r) { Contract.Requires(tcce.NonNull(target)); // initialize new stack for variables _frame = new Stack<Dictionary<IVariable, Type>>(); var method = target as Method; if(method != null) { _state.SetTopLevelClass(method.EnclosingClass?.Name); _state.TargetMethod = target; var dict = method.Ins.Concat(method.Outs) .ToDictionary<IVariable, IVariable, Type>(item => item, item => item.Type); _frame.Push(dict); var pre_res = _resultList.Keys.Copy(); SearchBlockStmt(method.Body); dict = _frame.Pop(); // sanity check Contract.Assert(_frame.Count == 0); var new_rets = _resultList.Where(kvp => !pre_res.Contains(kvp.Key)).ToDictionary(i => i.Key, i => i.Value); Contract.Assert(new_rets.Count != 0); var body = Util.InsertCode(_state, new_rets); method.Body.Body.Clear(); if(body != null) method.Body.Body.AddRange(body.Body); // use the original resolver of the resoved program, as it contains all the necessary type info //TODO: how about pre and post ?? method.CallsTactic = false; // set the tactic call lable to be false, no actual consequence // set the current class in the resolver, so that it can refer to the memberdecl correctly r.SetCurClass(method.EnclosingClass as ClassDecl); r.ResolveMethodBody(method); //Console.WriteLine("Errors: " + _program.reporter.Count(ErrorLevel.Error)); } return method; }