string IAssemblyBrowserNodeBuilder.GetDisassembly(ITreeNavigator navigator)
        {
            DomCecilMethod method = navigator.DataItem as DomCecilMethod;

            if (method == null)
            {
                return("");
            }

            NetAmbience   netAmbience = new NetAmbience();
            StringBuilder result      = new StringBuilder();

            result.Append(netAmbience.GetString(method, DomTypeNodeBuilder.settings));
            result.AppendLine();
            result.AppendLine();
            result.Append(Disassemble(method, true));
            return(result.ToString());
        }
        string IAssemblyBrowserNodeBuilder.GetDocumentationMarkup(ITreeNavigator navigator)
        {
            DomCecilMethod method = navigator.DataItem as DomCecilMethod;
            StringBuilder  result = new StringBuilder();

            result.Append("<big>");
            result.Append(Ambience.GetString(method, OutputFlags.AssemblyBrowserDescription));
            result.Append("</big>");
            result.AppendLine();

            AmbienceService.DocumentationFormatOptions options = new AmbienceService.DocumentationFormatOptions();
            options.MaxLineLength = -1;
            options.BigHeadings   = true;
            options.Ambience      = Ambience;
            result.AppendLine();

            result.Append(AmbienceService.GetDocumentationMarkup(AmbienceService.GetDocumentation(method), options));

            return(result.ToString());
        }
        public string GetDecompiledCode(ITreeNavigator navigator)
        {
            DomCecilMethod method = navigator.DataItem as DomCecilMethod;

            if (method == null)
            {
                return("");
            }

            StringBuilder result = new StringBuilder();

/*			result.Append (GetAttributes (Ambience, method.Attributes));
 *                      result.Append (Ambience.GetString (method, DomTypeNodeBuilder.settings));
 *                      result.AppendLine ();
 *                      result.Append ("{");
 *                      result.AppendLine ();*/
            result.Append(Decompile(method, true));
//			result.Append ("}");
            return(result.ToString());
        }
Пример #4
0
        string IAssemblyBrowserNodeBuilder.GetDisassembly(ITreeNavigator navigator)
        {
            DomCecilMethod method = navigator.DataItem as DomCecilMethod;

            if (method == null)
            {
                return("");
            }

            NetAmbience   netAmbience = new NetAmbience();
            StringBuilder result      = new StringBuilder();
            var           settings    = DomTypeNodeBuilder.settings;

            settings.OutputFlags |= OutputFlags.IncludeConstraints;
            result.Append(netAmbience.GetString(method, settings));
            settings.OutputFlags &= ~OutputFlags.IncludeConstraints;
            result.AppendLine();
            result.AppendLine();
            result.Append(Disassemble(method, true));
            return(result.ToString());
        }
        public static string Disassemble(DomCecilMethod method, bool markup)
        {
            if (method.MethodDefinition.IsPInvokeImpl)
            {
                return(GettextCatalog.GetString("Method is P/Invoke"));
            }
            if (method.MethodDefinition.Body == null)
            {
                IType type = method.DeclaringType;
                return(type == null ||  type.ClassType == ClassType.Interface ? GettextCatalog.GetString("Interface method") : GettextCatalog.GetString("Abstract method"));
            }

            StringBuilder result = new StringBuilder();

            foreach (Instruction instruction in method.MethodDefinition.Body.Instructions)
            {
                if (markup)
                {
                    result.Append("<b>");
                }
                result.Append(GetInstructionOffset(instruction));
                result.Append(markup ? ":</b> " : ": ");
                result.Append(instruction.OpCode);
                if (markup)
                {
                    result.Append("<i>");
                }
                if (instruction.Operand != null)
                {
                    result.Append(' ');
                    if (instruction.Operand is string)
                    {
                        result.Append('"');
                        result.Append(AssemblyBrowserWidget.FormatText(instruction.Operand.ToString()));
                        result.Append('"');
                    }
                    else if (instruction.Operand is Mono.Cecil.Cil.Instruction)
                    {
                        result.Append(GetInstructionOffset((Mono.Cecil.Cil.Instruction)instruction.Operand));
                    }
                    else if (instruction.Operand is Mono.Cecil.TypeDefinition)
                    {
                        AppendLink(result,
                                   new DomCecilType((Mono.Cecil.TypeDefinition)instruction.Operand).HelpUrl,
                                   instruction.Operand.ToString());
                    }
                    else if (instruction.Operand is Mono.Cecil.MethodDefinition)
                    {
                        Mono.Cecil.MethodDefinition md = instruction.Operand as Mono.Cecil.MethodDefinition;
                        AppendLink(result,
                                   new DomCecilMethod(md)
                        {
                            DeclaringType = new DomCecilType(md.DeclaringType)
                        }.HelpUrl,
                                   instruction.Operand.ToString());
                    }
                    else if (instruction.Operand is Mono.Cecil.FieldDefinition)
                    {
                        Mono.Cecil.FieldDefinition fd = instruction.Operand as Mono.Cecil.FieldDefinition;
                        AppendLink(result,
                                   new DomCecilField(fd)
                        {
                            DeclaringType = new DomCecilType(fd.DeclaringType)
                        }.HelpUrl,
                                   instruction.Operand.ToString());
                    }
                    else if (instruction.Operand is Mono.Cecil.PropertyDefinition)
                    {
                        Mono.Cecil.PropertyDefinition pd = instruction.Operand as Mono.Cecil.PropertyDefinition;
                        AppendLink(result,
                                   new DomCecilProperty(pd)
                        {
                            DeclaringType = new DomCecilType(pd.DeclaringType)
                        }.HelpUrl,
                                   instruction.Operand.ToString());
                    }
                    else if (instruction.Operand is Mono.Cecil.TypeReference)
                    {
                        AppendLink(result,
                                   "T:" + ((TypeReference)instruction.Operand).FullName,
                                   instruction.Operand.ToString());
                    }
                    else if (instruction.Operand is Mono.Cecil.MethodReference)
                    {
                        Mono.Cecil.MethodReference mr = instruction.Operand as Mono.Cecil.MethodReference;
                        StringBuilder id            = new StringBuilder(mr.DeclaringType.ToString());
                        bool          isConstructor = mr.Name == ".ctor";
                        if (!isConstructor)
                        {
                            id.Append("." + mr.Name);
                        }
                        id.Append("(");
                        for (int i = 0; i < mr.Parameters.Count; i++)
                        {
                            if (i > 0)
                            {
                                id.Append(',');
                            }
                            id.Append(mr.Parameters[i].ParameterType.FullName);
                        }
                        id.Append(")");
                        AppendLink(result, (isConstructor ? "C:" : "M:") + id, id.ToString());
                    }
                    else if (instruction.Operand is Mono.Cecil.FieldReference)
                    {
                        Mono.Cecil.FieldReference fr = instruction.Operand as Mono.Cecil.FieldReference;
                        string id = fr.DeclaringType + "." + fr.Name;
                        AppendLink(result, "F:" + id, id);
                    }
                    else if (instruction.Operand is Mono.Cecil.PropertyReference)
                    {
                        Mono.Cecil.PropertyReference pr = instruction.Operand as Mono.Cecil.PropertyReference;
                        string id = pr.DeclaringType + "." + pr.Name;
                        AppendLink(result, "P:" + id, id);
                    }
                    else
                    {
                        result.Append(AssemblyBrowserWidget.FormatText(instruction.Operand.ToString()));
                    }
                }
                if (markup)
                {
                    result.Append("</i>");
                }
                result.AppendLine();
            }
            result.AppendLine();
            return(result.ToString());
        }
        void SearchDoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            try {
                string pattern = e.Argument.ToString().ToUpper();
                int    types = 0, curType = 0;
                foreach (DomCecilCompilationUnit unit in this.definitions)
                {
                    types += unit.Types.Count;
                }
                List <IMember> members = new List <IMember> ();
                switch (searchMode)
                {
                case SearchMode.Member:
                    foreach (DomCecilCompilationUnit unit in this.definitions)
                    {
                        foreach (IType type in unit.Types)
                        {
                            if (worker.CancellationPending)
                            {
                                return;
                            }
                            curType++;
                            foreach (IMember member in type.Members)
                            {
                                if (worker.CancellationPending)
                                {
                                    return;
                                }
                                if (member.Name.ToUpper().Contains(pattern))
                                {
                                    members.Add(member);
                                }
                            }
                        }
                    }
                    Gtk.Application.Invoke(delegate {
                        IdeApp.Workbench.StatusBar.SetProgressFraction((double)curType / types);
                        foreach (MonoDevelop.Projects.Dom.IMember member in members)
                        {
                            if (worker.CancellationPending)
                            {
                                return;
                            }
                            memberListStore.AppendValues(ImageService.GetPixbuf(member.StockIcon, Gtk.IconSize.Menu),
                                                         member.Name,
                                                         member.DeclaringType.FullName,
                                                         ((DomCecilCompilationUnit)member.DeclaringType.CompilationUnit).AssemblyDefinition.Name.FullName,
                                                         member);
                        }
                    });
                    break;

                case SearchMode.Disassembler:
                    Gtk.Application.Invoke(delegate {
                        IdeApp.Workbench.StatusBar.BeginProgress(GettextCatalog.GetString("Searching string in disassembled code..."));
                    });
                    foreach (DomCecilCompilationUnit unit in this.definitions)
                    {
                        foreach (IType type in unit.Types)
                        {
                            if (worker.CancellationPending)
                            {
                                return;
                            }
                            curType++;
                            foreach (IMethod method in type.Methods)
                            {
                                if (worker.CancellationPending)
                                {
                                    return;
                                }
                                DomCecilMethod domMethod = method as DomCecilMethod;
                                if (domMethod == null)
                                {
                                    continue;
                                }
                                if (DomMethodNodeBuilder.Disassemble(domMethod, false).ToUpper().Contains(pattern))
                                {
                                    members.Add(method);
                                }
                            }
                        }
                    }
                    Gtk.Application.Invoke(delegate {
                        IdeApp.Workbench.StatusBar.SetProgressFraction((double)curType / types);
                        foreach (MonoDevelop.Projects.Dom.IMember member in members)
                        {
                            if (worker.CancellationPending)
                            {
                                return;
                            }
                            memberListStore.AppendValues(ImageService.GetPixbuf(member.StockIcon, Gtk.IconSize.Menu),
                                                         member.Name,
                                                         member.DeclaringType.FullName,
                                                         ((DomCecilCompilationUnit)member.DeclaringType.CompilationUnit).AssemblyDefinition.Name.FullName,
                                                         member);
                        }
                    });
                    break;

                case SearchMode.Decompiler:
                    foreach (DomCecilCompilationUnit unit in this.definitions)
                    {
                        foreach (IType type in unit.Types)
                        {
                            if (worker.CancellationPending)
                            {
                                return;
                            }
                            curType++;
                            foreach (IMethod method in type.Methods)
                            {
                                if (worker.CancellationPending)
                                {
                                    return;
                                }
                                DomCecilMethod domMethod = method as DomCecilMethod;
                                if (domMethod == null)
                                {
                                    continue;
                                }
                                if (DomMethodNodeBuilder.Decompile(domMethod, false).ToUpper().Contains(pattern))
                                {
                                    members.Add(method);
                                }
                            }
                        }
                    }
                    Gtk.Application.Invoke(delegate {
                        IdeApp.Workbench.StatusBar.SetProgressFraction((double)curType / types);
                        foreach (MonoDevelop.Projects.Dom.IMember member in members)
                        {
                            if (worker.CancellationPending)
                            {
                                return;
                            }
                            memberListStore.AppendValues(ImageService.GetPixbuf(member.StockIcon, Gtk.IconSize.Menu),
                                                         member.Name,
                                                         member.DeclaringType.FullName,
                                                         ((DomCecilCompilationUnit)member.DeclaringType.CompilationUnit).AssemblyDefinition.Name.FullName,
                                                         member);
                        }
                    });
                    break;

                case SearchMode.Type:
                    foreach (DomCecilCompilationUnit unit in this.definitions)
                    {
                        foreach (IType type in unit.Types)
                        {
                            if (worker.CancellationPending)
                            {
                                return;
                            }
                            if (type.FullName.ToUpper().IndexOf(pattern) >= 0)
                            {
                                members.Add(type);
                            }
                        }
                    }
                    Gtk.Application.Invoke(delegate {
                        foreach (IType type in members)
                        {
                            if (worker.CancellationPending)
                            {
                                return;
                            }
                            typeListStore.AppendValues(ImageService.GetPixbuf(type.StockIcon, Gtk.IconSize.Menu),
                                                       type.Name,
                                                       type.Namespace,
                                                       ((DomCecilCompilationUnit)type.CompilationUnit).AssemblyDefinition.Name.FullName,
                                                       type);
                        }
                    });

                    break;
                }
            } finally {
                Gtk.Application.Invoke(delegate {
                    IdeApp.Workbench.StatusBar.EndProgress();
                });
            }
        }