CreateAssemblyCommand(IUndoCommandManager undoCommandManager, IFileTreeView fileTreeView, ModuleDef newModule, AssemblyOptions options) { this.undoCommandManager = undoCommandManager; var module = Module.ModuleUtils.CreateModule(options.Name, Guid.NewGuid(), options.ClrVersion, ModuleKind.Dll, newModule); options.CreateAssemblyDef(module).Modules.Add(module); var file = DnSpyDotNetFile.CreateAssembly(DnSpyFileInfo.CreateFile(string.Empty), module, fileTreeView.FileManager.Settings.LoadPDBFiles); this.fileNodeCreator = RootDnSpyFileNodeCreator.CreateAssembly(fileTreeView, file); }
FileTabReferenceResult CreateMemberRefResult(IFileTabManager fileTabManager, object @ref) { var resolvedRef = ResolveMemberDef(@ref as IMemberRef); if (!IsSupportedReference(resolvedRef)) { return(null); } var newRef = GetReference(@ref); var node = fileTabManager.FileTreeView.FindNode(newRef); if (node == null) { // If it's eg. a TypeDef, its assembly has been removed from the file list or it // was never inserted because adding an assembly had been temporarily disabled. // Add the assembly to the list again. Next time the user clicks on the link, // FindNode() above will succeed. var def = @ref as IMemberDef; if (def != null) { DnSpyFile file = null; var mod = def.Module; if (mod != null && mod.Assembly != null) { file = DnSpyDotNetFile.CreateAssembly(DnSpyFileInfo.CreateFile(mod.Location), mod, false); } else if (mod != null) { file = DnSpyDotNetFile.CreateModule(DnSpyFileInfo.CreateFile(mod.Location), mod, false); } if (file != null) { var existingFile = fileTabManager.FileTreeView.FileManager.GetOrAdd(file); if (existingFile != file) { fileTabManager.FileTreeView.FileManager.ForceAdd(file, true, null); } } } return(null); } var content = decompileFileTabContentFactory.Create(new IFileTreeNodeData[] { node }); return(new FileTabReferenceResult(content, null, a => { if (a.Success && !a.HasMovedCaret) { GoToReference(content, resolvedRef); a.HasMovedCaret = true; } })); }
public void Execute() { Debug.Assert(!hasExecuted); if (hasExecuted) { throw new InvalidOperationException(); } for (int i = 0; i < nodes.Length; i++) { var node = nodes[i]; var savedState = savedStates[i]; var module = node.DnSpyFile.ModuleDef; bool b = module != null && module.Assembly == null; Debug.Assert(b); if (!b) { throw new InvalidOperationException(); } savedState.ModuleKind = module.Kind; ModuleUtils.AddToNewAssemblyDef(module, ModuleKind.Dll, out savedState.Characteristics); if (savedState.AssemblyFileNode == null) { var asmFile = DnSpyDotNetFile.CreateAssembly(node.DnSpyFile); savedState.AssemblyFileNode = node.Context.FileTreeView.CreateAssembly(asmFile); } Debug.Assert(savedState.AssemblyFileNode.DnSpyFile.Children.Count == 1); savedState.AssemblyFileNode.DnSpyFile.Children.Remove(node.DnSpyFile); Debug.Assert(savedState.AssemblyFileNode.DnSpyFile.Children.Count == 0); savedState.AssemblyFileNode.TreeNode.EnsureChildrenLoaded(); Debug.Assert(savedState.AssemblyFileNode.TreeNode.Children.Count == 0); savedState.AssemblyFileNode.DnSpyFile.Children.Add(node.DnSpyFile); int index = node.Context.FileTreeView.TreeView.Root.DataChildren.ToList().IndexOf(node); b = index >= 0; Debug.Assert(b); if (!b) { throw new InvalidOperationException(); } node.Context.FileTreeView.TreeView.Root.Children[index] = savedState.AssemblyFileNode.TreeNode; savedState.AssemblyFileNode.TreeNode.AddChild(node.TreeNode); } hasExecuted = true; }