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);");
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }