/// <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); }
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()); } } }