Example #1
0
        /// <summary>
        /// This function is the callback used to execute the command when the menu item is clicked.
        /// See the constructor to see how the menu item is associated with this function using
        /// OleMenuCommandService service and MenuCommand class.
        /// </summary>
        /// <param name="sender">Event sender.</param>
        /// <param name="e">Event args.</param>
        private void MenuItemCallback(object sender, EventArgs e)
        {
            DTE dte = (DTE)this.ServiceProvider.GetService(typeof(DTE));

            dte.ActiveDocument.Save();
            var fileName           = dte.ActiveDocument.FullName;
            var selectedStatements = (List <Statement>)HelpFunctions.GetSelectedStatements();

            if (selectedStatements.Count == 1 && selectedStatements[0] is UpdateStmt)
            {
                UpdateStmt             curr    = (UpdateStmt)selectedStatements[0];
                var                    arg     = ((ApplySuffix)((ExprRhs)curr.Rhss[0]).Expr).Args;
                Microsoft.Dafny.Type[] InTypes = getTypes(arg);

                var rets = curr.Lhss;
                Microsoft.Dafny.Type[] retTypes = getTypes(rets);

                Method m = HelpFunctions.FindMethod(fileName, ((NameSegment)((ApplySuffix)((ExprRhs)curr.Rhss[0]).Expr).Lhs).Name, InTypes, retTypes);
                edit = HelpFunctions.GetWpfView().TextBuffer.CreateEdit();
                inline(curr, fileName, m);
                edit.Apply();
                ////////////////////////////////////
            }
            else if (selectedStatements.Count == 0 && HelpFunctions.GetCurrentMethod() != null)
            {
                Method currMethod = HelpFunctions.GetCurrentMethod();

                var program   = HelpFunctions.GetProgram(fileName);
                var decls     = program.Modules().SelectMany(m => m.TopLevelDecls).ToList();
                var callables = ModuleDefinition.AllCallables(decls);
                edit = HelpFunctions.GetWpfView().TextBuffer.CreateEdit();
                foreach (var curr in callables)
                {
                    if (curr is Method)
                    {
                        var m = curr as Method;
                        traverse(m.Body, currMethod);
                    }
                }
                var textView = HelpFunctions.GetWpfView();
                var start    = currMethod.tok.pos;
                if (currMethod is Lemma)
                {
                    start -= 6;
                }
                else
                {
                    start -= 7;
                }
                var end = currMethod.BodyEndTok.pos + 1;
                edit.Delete(start, end - start);
                edit.Apply();
            }
            //HelpFunctions.prettyPrint(fileName);
        }
Example #2
0
        public static void traverse(Statement statement, Method m)
        {
            if (statement is AssignStmt)
            {
                statement = statement as AssignStmt;
                traverse(((AssignStmt)statement).Lhs, m);
            }
            else if (statement is UpdateStmt)
            {
                DTE dte      = (DTE)ExtractMethodPackage.GetGlobalService(typeof(DTE));
                var fileName = dte.ActiveDocument.FullName;

                UpdateStmt curr = (UpdateStmt)statement;
                if (!(((ExprRhs)curr.Rhss[0]).Expr is ApplySuffix))
                {
                    return;
                }
                var arg = ((ApplySuffix)((ExprRhs)curr.Rhss[0]).Expr).Args;
                Microsoft.Dafny.Type[] InTypes = getTypes(arg);

                var rets = curr.Lhss;
                Microsoft.Dafny.Type[] retTypes = getTypes(rets);

                Method temp = HelpFunctions.FindMethod(fileName, ((NameSegment)((ApplySuffix)((ExprRhs)curr.Rhss[0]).Expr).Lhs).Name, InTypes, retTypes);

                //check name of called func first;
                if (MethodsAreEqual(m, temp))
                {
                    inline((UpdateStmt)statement, fileName, m);
                }
            }
            else if (statement is WhileStmt)
            {
                traverse(((WhileStmt)statement).Body, m);
                traverse(((WhileStmt)statement).Guard, m);
            }
            else if (statement is IfStmt)
            {
                traverse(((IfStmt)statement).Guard, m);
                traverse(((IfStmt)statement).Thn, m);
                traverse(((IfStmt)statement).Els, m);
            }
            else if (statement is BlockStmt)
            {
                foreach (var st in ((BlockStmt)statement).SubStatements)
                {
                    traverse(st, m);
                }
            }
            else if (statement is AssertStmt)
            {
                traverse(((AssertStmt)statement).Proof, m);
            }
            else if (statement is AlternativeStmt)
            {
            }
            else if (statement is VarDeclStmt)
            {
                if (((VarDeclStmt)statement).Update != null)
                {
                    traverse(((VarDeclStmt)statement).Update, m);
                }
                foreach (var localvar in ((VarDeclStmt)statement).Locals)
                {
                    //traverse(localvar);
                }
            }
            else if (statement is CallStmt)
            {
                foreach (var expr in ((CallStmt)statement).Lhs)
                {
                    traverse(expr, m);
                }
                foreach (var expr in ((CallStmt)statement).Args)
                {
                    traverse(expr, m);
                }
            }
            else if (statement is PrintStmt)
            {
                foreach (var expr in ((PrintStmt)statement).Args)
                {
                    traverse(expr, m);
                }
            }
            else if (statement is AssignSuchThatStmt)
            {
                foreach (var expr in ((AssignSuchThatStmt)statement).Lhss)
                {
                    traverse(expr, m);
                }
                traverse(((AssignSuchThatStmt)statement).Expr, m);
            }
            else if (statement is CalcStmt)
            {
            }
            else if (statement is MatchStmt)
            {
            }
            else
            {
                if (statement != null)
                {
                    throw new NotImplementedException(statement.ToString());
                }
            }
        }