void AddCheck(RefactoringMenuContext context, string newCode) { var codeGen = context.ResolveResult.CallingClass.ProjectContent.Language.CodeGenerator; TextArea textArea = context.TextArea; IMember m = context.ResolveResult.CallingMember; TextLocation methodStart = FindMethodStart(textArea.Document, m.BodyRegion); if (methodStart.IsEmpty) { return; } textArea.Caret.Position = methodStart; textArea.SelectionManager.ClearSelection(); textArea.Document.UndoStack.StartUndoGroup(); try { foreach (string newCodeLine in newCode.Split('\n')) { new Return().Execute(textArea); textArea.InsertString(newCodeLine); } } finally { textArea.Document.UndoStack.EndUndoGroup(); } textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea)); textArea.Document.CommitUpdate(); }
public ToolStripItem[] BuildSubmenu(Codon codon, object owner) { List <ToolStripItem> resultItems = new List <ToolStripItem>(); RefactoringMenuContext context = (RefactoringMenuContext)owner; LocalResolveResult lrr = context.ResolveResult as LocalResolveResult; if (lrr == null || lrr.CallingClass == null || lrr.ResolvedType == null) { return(resultItems.ToArray()); } LanguageProperties language = lrr.CallingClass.ProjectContent.Language; if (language != LanguageProperties.CSharp) { return(resultItems.ToArray()); } IClass parameterTypeClass = lrr.ResolvedType.GetUnderlyingClass(); if (parameterTypeClass == null || parameterTypeClass.ClassType != ClassType.Enum && parameterTypeClass.ClassType != ClassType.Struct) { // the parameter is a reference type resultItems.Add(MakeItem("Add check for null", delegate { AddCheckForNull(context); })); } if (parameterTypeClass != null) { if (parameterTypeClass.FullyQualifiedName == "System.Int32") { resultItems.Add(MakeItem("Add range check", delegate { AddRangeCheck(context); })); } } return(resultItems.ToArray()); }
void AddCheckForNull(RefactoringMenuContext context) { string name = ((LocalResolveResult)context.ResolveResult).VariableName; AddCheck(context, "if (" + name + " == null)\n" + "throw new ArgumentNullException(\"" + name + "\");"); }
void AddRangeCheck(RefactoringMenuContext context) { string name = ((LocalResolveResult)context.ResolveResult).VariableName; AddCheck(context, "if (" + name + " < 0 || " + name + " > upper_bound)\n" + "throw new ArgumentOutOfRangeException(\"" + name + "\", " + name + ", \"Value must be between 0 and \" + upper_bound);"); }
public MenuItem Create(RefactoringMenuContext context) { if (context.ExpressionResult.Context == ExpressionContext.Attribute) { return(null); } if (!(context.ResolveResult is UnknownMethodResolveResult)) { return(null); } if (context.ProjectContent == null) { return(null); } UnknownMethodResolveResult rr = context.ResolveResult as UnknownMethodResolveResult; MenuItem item = new MenuItem() { Header = string.Format(StringParser.Parse("${res:AddIns.SharpRefactoring.ResolveExtensionMethod}"), rr.CallName), Icon = ClassBrowserIconService.GotoArrow.CreateImage() }; List <IClass> results = new List <IClass>(); SearchAllExtensionMethodsWithName(results, context.ProjectContent, rr.CallName); foreach (IProjectContent content in context.ProjectContent.ThreadSafeGetReferencedContents()) { SearchAllExtensionMethodsWithName(results, content, rr.CallName); } if (!results.Any()) { return(null); } foreach (IClass c in results) { string newNamespace = c.Namespace; MenuItem subItem = new MenuItem(); subItem.Header = "using " + newNamespace; subItem.Icon = ClassBrowserIconService.Namespace.CreateImage(); item.Items.Add(subItem); subItem.Click += delegate { NamespaceRefactoringService.AddUsingDeclaration(context.CompilationUnit, context.Editor.Document, newNamespace, true); ParserService.BeginParse(context.Editor.FileName, context.Editor.Document); }; } return(item); }
public MenuItem Create(RefactoringMenuContext context) { // TODO : [Test] above method is in Default context? // if (context.ExpressionResult.Context != ExpressionContext.Attribute) // return null; if (!(context.ResolveResult is UnknownIdentifierResolveResult || context.ResolveResult is UnknownMethodResolveResult)) { return(null); } List <IClass> results = new List <IClass>(); ParseInformation info = ParserService.GetParseInformation(context.Editor.FileName); if (info == null || info.CompilationUnit == null || info.CompilationUnit.ProjectContent == null) { return(null); } ICompilationUnit unit = info.CompilationUnit; IProjectContent pc = info.CompilationUnit.ProjectContent; string name = null; if (context.ResolveResult is UnknownMethodResolveResult) { var rr = context.ResolveResult as UnknownMethodResolveResult; SearchAttributesWithName(results, pc, rr.CallName); foreach (IProjectContent content in pc.ReferencedContents) { SearchAttributesWithName(results, content, rr.CallName); } name = rr.CallName; } if (context.ResolveResult is UnknownIdentifierResolveResult) { var rr = context.ResolveResult as UnknownIdentifierResolveResult; SearchAttributesWithName(results, pc, rr.Identifier); foreach (IProjectContent content in pc.ReferencedContents) { SearchAttributesWithName(results, content, rr.Identifier); } name = rr.Identifier; } if (!results.Any()) { return(null); } MenuItem item = new MenuItem() { Header = string.Format(StringParser.Parse("${res:AddIns.SharpRefactoring.ResolveAttribute}"), name), Icon = ClassBrowserIconService.GotoArrow.CreateImage() }; foreach (IClass c in results) { string newNamespace = c.Namespace; MenuItem subItem = new MenuItem(); subItem.Header = "using " + newNamespace; subItem.Icon = ClassBrowserIconService.Namespace.CreateImage(); item.Items.Add(subItem); subItem.Click += delegate { NamespaceRefactoringService.AddUsingDeclaration(unit, context.Editor.Document, newNamespace, true); ParserService.BeginParse(context.Editor.FileName, context.Editor.Document); }; } return(item); }