Inheritance: ILSpyTreeNode, IMemberTreeNode
Example #1
0
 protected override void LoadChildren()
 {
     this.Children.Add(new ReferenceFolderTreeNode(module, assemblyNode));
     if (module.HasResources)
         this.Children.Add(new ResourceListTreeNode(module));
     foreach (NamespaceTreeNode ns in namespaces.Values)
     {
         ns.Children.Clear();
     }
     foreach (TypeDefinition type in module.Types.OrderBy(t => t.FullName))
     {
         NamespaceTreeNode ns;
         if (!namespaces.TryGetValue(type.Namespace, out ns))
         {
             ns = new NamespaceTreeNode(type.Namespace);
             namespaces[type.Namespace] = ns;
         }
         TypeTreeNode node = new TypeTreeNode(type, assemblyNode);
         typeDict[type] = node;
         ns.Children.Add(node);
     }
     foreach (NamespaceTreeNode ns in namespaces.Values.OrderBy(n => n.Name))
     {
         if (ns.Children.Count > 0)
             this.Children.Add(ns);
     }
 }
Example #2
0
		internal void Append(TypeTreeNode typeNode) {
			bool b = name.Equals(typeNode.Namespace, StringComparison.Ordinal);
			Debug.Assert(b);
			if (!b)
				throw new InvalidOperationException();
			Children.Add(typeNode);
			((AssemblyTreeNode)Parent).OnReadded(typeNode);
		}
Example #3
0
        CreateNestedTypeDefCommand(TypeTreeNode ownerType, TypeDefOptions options)
        {
            this.ownerType = ownerType;

            var modNode = ILSpyTreeNode.GetNode<AssemblyTreeNode>(ownerType);
            Debug.Assert(modNode != null);
            if (modNode == null)
                throw new InvalidOperationException();
            this.nestedType = new TypeTreeNode(options.CreateTypeDef(modNode.LoadedAssembly.ModuleDefinition), modNode.Parent as AssemblyTreeNode ?? modNode);
        }
Example #4
0
        /// <summary>
        /// Looks up the property node corresponding to the property definition.
        /// Returns null if no matching node is found.
        /// </summary>
        public PropertyTreeNode FindPropertyNode(IProperty def)
        {
            TypeTreeNode typeNode = FindTypeNode(def.DeclaringTypeDefinition);

            if (typeNode == null)
            {
                return(null);
            }
            typeNode.EnsureLazyChildren();
            return(typeNode.Children.OfType <PropertyTreeNode>().FirstOrDefault(m => m.PropertyDefinition.MetadataToken == def.MetadataToken && !m.IsHidden));
        }
Example #5
0
        /// <summary>
        /// Looks up the event node corresponding to the event definition.
        /// Returns null if no matching node is found.
        /// </summary>
        public EventTreeNode FindEventNode(IEvent def)
        {
            TypeTreeNode typeNode = FindTypeNode(def.DeclaringTypeDefinition);

            if (typeNode == null)
            {
                return(null);
            }
            typeNode.EnsureLazyChildren();
            return(typeNode.Children.OfType <EventTreeNode>().FirstOrDefault(m => m.EventDefinition.MetadataToken == def.MetadataToken && !m.IsHidden));
        }
Example #6
0
        internal void Append(TypeTreeNode typeNode)
        {
            bool b = name.Equals(typeNode.Namespace, StringComparison.Ordinal);

            Debug.Assert(b);
            if (!b)
            {
                throw new InvalidOperationException();
            }
            Children.Add(typeNode);
            ((AssemblyTreeNode)Parent).OnReadded(typeNode);
        }
        /// <summary>
        /// Looks up the method node corresponding to the method definition.
        /// Returns null if no matching node is found.
        /// </summary>
        public ILSpyTreeNode FindMethodNode(IMethod def)
        {
            TypeTreeNode typeNode = FindTypeNode(def.DeclaringTypeDefinition);

            if (typeNode == null)
            {
                return(null);
            }
            // method might be an accessor, must look for parent node
            ILSpyTreeNode  parentNode = typeNode;
            MethodTreeNode methodNode;

            parentNode.EnsureLazyChildren();
            switch (def.AccessorOwner)
            {
            case IProperty p:
                parentNode = parentNode.Children.OfType <PropertyTreeNode>().FirstOrDefault(m => m.PropertyDefinition.MetadataToken == p.MetadataToken && !m.IsHidden);
                if (parentNode == null)
                {
                    return(null);
                }
                parentNode.EnsureLazyChildren();
                methodNode = parentNode.Children.OfType <MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition.MetadataToken == def.MetadataToken && !m.IsHidden);
                if (methodNode == null || methodNode.IsHidden)
                {
                    return(parentNode);
                }
                return(methodNode);

            case IEvent e:
                parentNode = parentNode.Children.OfType <EventTreeNode>().FirstOrDefault(m => m.EventDefinition.MetadataToken == e.MetadataToken && !m.IsHidden);
                if (parentNode == null)
                {
                    return(null);
                }
                parentNode.EnsureLazyChildren();
                methodNode = parentNode.Children.OfType <MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition.MetadataToken == def.MetadataToken && !m.IsHidden);
                if (methodNode == null || methodNode.IsHidden)
                {
                    return(parentNode);
                }
                return(methodNode);

            default:
                methodNode = typeNode.Children.OfType <MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition.MetadataToken == def.MetadataToken && !m.IsHidden);
                if (methodNode != null)
                {
                    return(methodNode);
                }
                return(null);
            }
        }
Example #8
0
        internal TypeTreeNode GetOrCreateNestedTypeTreeNode(TypeDef nestedType)
        {
            Debug.Assert(nestedType != null && nestedType.DeclaringType == type);
            EnsureChildrenFiltered();
            var typeNode = Children.OfType <TypeTreeNode>().FirstOrDefault(n => n.type == nestedType);

            if (typeNode != null)
            {
                return(typeNode);
            }
            typeNode = new TypeTreeNode(nestedType, parentAssemblyNode);
            AddToChildren(typeNode);
            return(typeNode);
        }
Example #9
0
        /// <summary>
        /// Looks up the method node corresponding to the method definition.
        /// Returns null if no matching node is found.
        /// </summary>
        public ILSpyTreeNode FindMethodNode(MethodDefinition def)
        {
            if (def == null)
            {
                return(null);
            }
            TypeTreeNode typeNode = FindTypeNode(def.DeclaringType);

            if (typeNode == null)
            {
                return(null);
            }
            typeNode.EnsureLazyChildren();
            MethodTreeNode methodNode = typeNode.Children.OfType <MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition == def && !m.IsHidden);

            if (methodNode != null)
            {
                return(methodNode);
            }
            foreach (var p in typeNode.Children.OfType <ILSpyTreeNode>())
            {
                if (p.IsHidden)
                {
                    continue;
                }

                // method might be a child of a property or event
                if (p is PropertyTreeNode || p is EventTreeNode)
                {
                    p.EnsureLazyChildren();
                    methodNode = p.Children.OfType <MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition == def);
                    if (methodNode != null)
                    {
                        // If the requested method is a property or event accessor, and accessors are
                        // hidden in the UI, then return the owning property or event.
                        if (methodNode.IsHidden)
                        {
                            return(p);
                        }
                        else
                        {
                            return(methodNode);
                        }
                    }
                }
            }

            return(null);
        }
Example #10
0
        /// <summary>
        /// Looks up the event node corresponding to the event definition.
        /// Returns null if no matching node is found.
        /// </summary>
        public EventTreeNode FindEventNode(EventDef def)
        {
            if (def == null)
            {
                return(null);
            }
            TypeTreeNode typeNode = FindTypeNode(def.DeclaringType);

            if (typeNode == null)
            {
                return(null);
            }
            typeNode.EnsureChildrenFiltered();
            return(typeNode.Children.OfType <EventTreeNode>().FirstOrDefault(m => m.EventDefinition == def));
        }
        /// <summary>
        /// Looks up the property node corresponding to the property definition.
        /// Returns null if no matching node is found.
        /// </summary>
        public PropertyTreeNode FindPropertyNode(PropertyDef def)
        {
            if (def == null)
            {
                return(null);
            }
            TypeTreeNode typeNode = FindTypeNode(def.DeclaringType);

            if (typeNode == null)
            {
                return(null);
            }
            typeNode.EnsureLazyChildren();
            return(typeNode.Children.OfType <PropertyTreeNode>().FirstOrDefault(m => m.PropertyDefinition == def && !m.IsHidden));
        }
Example #12
0
        /// <summary>
        /// Looks up the property node corresponding to the property definition.
        /// Returns null if no matching node is found.
        /// </summary>
        public PropertyTreeNode FindPropertyNode(PropertyDef def)
        {
            if (def == null)
            {
                return(null);
            }
            TypeTreeNode typeNode = FindTypeNode(def.DeclaringType);

            if (typeNode == null)
            {
                return(null);
            }
            typeNode.EnsureChildrenFiltered();
            return(typeNode.Children.OfType <PropertyTreeNode>().FirstOrDefault(m => m.PropertyDef == def));
        }
Example #13
0
        /// <summary>
        /// Looks up the event node corresponding to the event definition.
        /// Returns null if no matching node is found.
        /// </summary>
        public EventTreeNode FindEventNode(EventDefinition def)
        {
            if (def == null)
            {
                return(null);
            }
            TypeTreeNode typeNode = FindTypeNode(def.DeclaringType);

            if (typeNode == null)
            {
                return(null);
            }
            typeNode.EnsureLazyChildren();
            return(typeNode.Children.OfType <EventTreeNode>().FirstOrDefault(m => m.EventDefinition == def && !m.IsHidden));
        }
Example #14
0
        /// <summary>
        /// Looks up the field node corresponding to the field definition.
        /// Returns null if no matching node is found.
        /// </summary>
        public FieldTreeNode FindFieldNode(FieldDef def)
        {
            if (def == null)
            {
                return(null);
            }
            TypeTreeNode typeNode = FindTypeNode(def.DeclaringType);

            if (typeNode == null)
            {
                return(null);
            }
            typeNode.EnsureChildrenFiltered();
            return(typeNode.Children.OfType <FieldTreeNode>().FirstOrDefault(m => m.FieldDef == def));
        }
Example #15
0
        protected override void LoadChildren()
        {
            var module = LoadedAssembly.GetPEFileOrNull();

            if (module == null)
            {
                // if we crashed on loading, then we don't have any children
                return;
            }
            typeSystem = LoadedAssembly.GetTypeSystemOrNull(DecompilerTypeSystem.GetOptions(new DecompilationOptions().DecompilerSettings));
            var assembly = (MetadataModule)typeSystem.MainModule;
            var metadata = module.Metadata;

            this.Children.Add(new Metadata.MetadataTreeNode(module, this));
            Decompiler.DebugInfo.IDebugInfoProvider debugInfo = LoadedAssembly.GetDebugInfoOrNull();
            if (debugInfo is Decompiler.PdbProvider.PortableDebugInfoProvider ppdb)
            {
                this.Children.Add(new Metadata.DebugMetadataTreeNode(module, ppdb.IsEmbedded, ppdb.Provider.GetMetadataReader(), this));
            }
            this.Children.Add(new ReferenceFolderTreeNode(module, this));
            if (module.Resources.Any())
            {
                this.Children.Add(new ResourceListTreeNode(module));
            }
            foreach (NamespaceTreeNode ns in namespaces.Values)
            {
                ns.Children.Clear();
            }
            foreach (var type in assembly.TopLevelTypeDefinitions.OrderBy(t => t.ReflectionName, NaturalStringComparer.Instance))
            {
                var escapedNamespace = Language.EscapeName(type.Namespace);
                if (!namespaces.TryGetValue(type.Namespace, out NamespaceTreeNode ns))
                {
                    ns = new NamespaceTreeNode(escapedNamespace);
                    namespaces.Add(type.Namespace, ns);
                }
                TypeTreeNode node = new TypeTreeNode(type, this);
                typeDict[(TypeDefinitionHandle)type.MetadataToken] = node;
                ns.Children.Add(node);
            }
            foreach (NamespaceTreeNode ns in namespaces.Values.OrderBy(n => n.Name, NaturalStringComparer.Instance))
            {
                if (ns.Children.Count > 0)
                {
                    this.Children.Add(ns);
                }
            }
        }
Example #16
0
        internal TypeTreeNode GetOrCreateNonNestedTypeTreeNode(TypeDef td)
        {
            Debug.Assert(td != null && td.DeclaringType == null);
            Debug.Assert(!LazyLoading);
            TypeTreeNode typeNode;

            if (typeDict.TryGetValue(td, out typeNode))
            {
                return(typeNode);
            }
            var nsNode = GetOrCreateNamespaceNode(td.Namespace);

            typeNode = new TypeTreeNode(td, this);
            typeDict.Add(td, typeNode);
            nsNode.AddToChildren(typeNode);
            return(typeNode);
        }
 /// <summary>
 /// Looks up the type node corresponding to the type definition.
 /// Returns null if no matching node is found.
 /// </summary>
 public TypeTreeNode FindTypeNode(TypeDefinition def)
 {
     if (def == null)
     {
         return(null);
     }
     if (def.DeclaringType != null)
     {
         TypeTreeNode decl = FindTypeNode(def.DeclaringType);
         if (decl != null)
         {
             decl.EnsureLazyChildren();
             return(decl.Children.OfType <TypeTreeNode>().FirstOrDefault(t => t.TypeDefinition == def && !t.IsHidden));
         }
     }
     else
     {
         if (def.Module.Assembly == null) //def.Module.Assembly is null in secodary modules ...
         {
             foreach (AssemblyTreeNode node in this.Children)
             {
                 if (node.LoadedAssembly.IsLoaded)
                 {
                     var t = node.FindTypeNode(def);
                     if (t != null)
                     {
                         return(t);
                     }
                 }
             }
             return(null);
         }
         else
         {
             AssemblyTreeNode asm = FindAssemblyNode(def.Module.Assembly);
             if (asm != null)
             {
                 return(asm.FindTypeNode(def));
             }
         }
     }
     return(null);
 }
Example #18
0
        void LoadModuleChildren(IPEImage peImage, ModuleDef module)
        {
            var asmListTreeNode = this.Ancestors().OfType <DnSpyFileListTreeNode>().FirstOrDefault();

            Debug.Assert(asmListTreeNode != null);
            // Only show the PE node if it was loaded from a file. The hex document is always loaded
            // from a file, so if the PEImage wasn't loaded from the same file, conversion to/from
            // RVA/FileOffset won't work and the wrong data will be displayed, eg. in the .NET
            // storage stream nodes.
            if (DnSpyFile.LoadedFromFile && peImage != null)
            {
                this.Children.Add(new PETreeNode(peImage, module as ModuleDefMD));
            }
            if (module != null)
            {
                this.Children.Add(new ReferenceFolderTreeNode(module, this, asmListTreeNode));
                this.Children.Add(new ResourceListTreeNode(module));
                foreach (NamespaceTreeNode ns in namespaces.Values)
                {
                    ns.Children.Clear();
                }
                foreach (TypeDef type in module.Types.OrderBy(t => t.FullName, TypeStringComparer))
                {
                    NamespaceTreeNode ns;
                    if (!namespaces.TryGetValue(type.Namespace, out ns))
                    {
                        ns = new NamespaceTreeNode(type.Namespace);
                        namespaces[type.Namespace] = ns;
                    }
                    TypeTreeNode node = new TypeTreeNode(type, this);
                    typeDict[type] = node;
                    ns.Children.Add(node);
                }
                foreach (NamespaceTreeNode ns in namespaces.Values.OrderBy(n => n.Name))
                {
                    if (ns.Children.Count > 0)
                    {
                        this.Children.Add(ns);
                    }
                }
            }
        }
Example #19
0
        protected override void LoadChildren()
        {
            ModuleDef moduleDefinition = assembly.ModuleDefinition;

            if (moduleDefinition == null)
            {
                // if we crashed on loading, then we don't have any children
                return;
            }

            if (moduleDefinition is ModuleDefMD)
            {
                this.Children.Add(new ReferenceFolderTreeNode((ModuleDefMD)moduleDefinition, this));
            }
            if (moduleDefinition.HasResources)
            {
                this.Children.Add(new ResourceListTreeNode(moduleDefinition));
            }
            foreach (NamespaceTreeNode ns in namespaces.Values)
            {
                ns.Children.Clear();
            }
            foreach (TypeDef type in moduleDefinition.Types.OrderBy(t => t.FullName))
            {
                NamespaceTreeNode ns;
                if (!namespaces.TryGetValue(type.Namespace, out ns))
                {
                    ns = new NamespaceTreeNode(type.Namespace);
                    namespaces[type.Namespace] = ns;
                }
                TypeTreeNode node = new TypeTreeNode(type, this);
                typeDict[type] = node;
                ns.Children.Add(node);
            }
            foreach (NamespaceTreeNode ns in namespaces.Values.OrderBy(n => n.Name))
            {
                if (ns.Children.Count > 0)
                {
                    this.Children.Add(ns);
                }
            }
        }
        protected override void LoadChildren()
        {
            var module = LoadedAssembly.GetPEFileOrNull();

            if (module == null)
            {
                // if we crashed on loading, then we don't have any children
                return;
            }
            typeSystem = LoadedAssembly.GetTypeSystemOrNull();
            var assembly = (MetadataModule)typeSystem.MainModule;
            var metadata = module.Metadata;

            this.Children.Add(new ReferenceFolderTreeNode(module, this));
            if (module.Resources.Any())
            {
                this.Children.Add(new ResourceListTreeNode(module));
            }
            foreach (NamespaceTreeNode ns in namespaces.Values)
            {
                ns.Children.Clear();
            }
            foreach (var type in assembly.TopLevelTypeDefinitions.OrderBy(t => t.ReflectionName, NaturalStringComparer.Instance))
            {
                if (!namespaces.TryGetValue(type.Namespace, out NamespaceTreeNode ns))
                {
                    ns = new NamespaceTreeNode(type.Namespace);
                    namespaces[type.Namespace] = ns;
                }
                TypeTreeNode node = new TypeTreeNode(type, this);
                typeDict[(TypeDefinitionHandle)type.MetadataToken] = node;
                ns.Children.Add(node);
            }
            foreach (NamespaceTreeNode ns in namespaces.Values.OrderBy(n => n.Name, NaturalStringComparer.Instance))
            {
                if (ns.Children.Count > 0)
                {
                    this.Children.Add(ns);
                }
            }
        }
Example #21
0
        void LoadModuleChildren(IPEImage peImage, ModuleDef module)
        {
            var asmListTreeNode = this.Ancestors().OfType <AssemblyListTreeNode>().FirstOrDefault();

            Debug.Assert(asmListTreeNode != null);
            if (peImage != null)
            {
                this.Children.Add(new PETreeNode(peImage, module as ModuleDefMD));
            }
            if (module != null)
            {
                if (module is ModuleDefMD)
                {
                    this.Children.Add(new ReferenceFolderTreeNode((ModuleDefMD)module, this, asmListTreeNode));
                }
                this.Children.Add(new ResourceListTreeNode(module));
                foreach (NamespaceTreeNode ns in namespaces.Values)
                {
                    ns.Children.Clear();
                }
                foreach (TypeDef type in module.Types.OrderBy(t => t.FullName, TypeStringComparer))
                {
                    NamespaceTreeNode ns;
                    if (!namespaces.TryGetValue(type.Namespace, out ns))
                    {
                        ns = new NamespaceTreeNode(type.Namespace);
                        namespaces[type.Namespace] = ns;
                    }
                    TypeTreeNode node = new TypeTreeNode(type, this);
                    typeDict[type] = node;
                    ns.Children.Add(node);
                }
                foreach (NamespaceTreeNode ns in namespaces.Values.OrderBy(n => n.Name))
                {
                    if (ns.Children.Count > 0)
                    {
                        this.Children.Add(ns);
                    }
                }
            }
        }
Example #22
0
        /// <summary>
        /// Looks up the method node corresponding to the method definition.
        /// Returns null if no matching node is found.
        /// </summary>
        public MethodTreeNode FindMethodNode(MethodDefinition def)
        {
            if (def == null)
            {
                return(null);
            }
            TypeTreeNode typeNode = FindTypeNode(def.DeclaringType);

            if (typeNode == null)
            {
                return(null);
            }
            typeNode.EnsureLazyChildren();
            MethodTreeNode methodNode = typeNode.Children.OfType <MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition == def && !m.IsHidden);

            if (methodNode != null)
            {
                return(methodNode);
            }
            foreach (var p in typeNode.Children.OfType <ILSpyTreeNode>())
            {
                if (p.IsHidden)
                {
                    continue;
                }
                // method might be a child or a property or events
                p.EnsureLazyChildren();
                methodNode = p.Children.OfType <MethodTreeNode>().FirstOrDefault(m => m.MethodDefinition == def && !m.IsHidden);
                if (methodNode != null)
                {
                    return(methodNode);
                }
            }

            return(null);
        }
Example #23
0
 CreateEventDefCommand(TypeTreeNode ownerNode, EventDefOptions options)
 {
     this.ownerNode = ownerNode;
     this.eventNode = new EventTreeNode(options.CreateEventDef(ownerNode.TypeDefinition.Module));
 }
Example #24
0
        static void Execute(ILSpyTreeNode[] nodes)
        {
            if (!CanExecute(nodes))
                return;

            var ownerNode = nodes[0];
            if (!(ownerNode is TypeTreeNode))
                ownerNode = (ILSpyTreeNode)ownerNode.Parent;
            var typeNode = ownerNode as TypeTreeNode;
            Debug.Assert(typeNode != null);
            if (typeNode == null)
                throw new InvalidOperationException();

            var module = ILSpyTreeNode.GetModule(typeNode);
            Debug.Assert(module != null);
            if (module == null)
                throw new InvalidOperationException();
            var options = EventDefOptions.Create("MyEvent", module.CorLibTypes.GetTypeRef("System", "EventHandler"));

            var data = new EventOptionsVM(options, module, MainWindow.Instance.CurrentLanguage, typeNode.TypeDefinition);
            var win = new EventOptionsDlg();
            win.Title = "Create Event";
            win.DataContext = data;
            win.Owner = MainWindow.Instance;
            if (win.ShowDialog() != true)
                return;

            UndoCommandManager.Instance.Add(new CreateEventDefCommand(typeNode, data.CreateEventDefOptions()));
        }
Example #25
0
 void LoadModuleChildren(ModuleDef moduleDefinition)
 {
     var asmListTreeNode = this.Ancestors().OfType<AssemblyListTreeNode>().FirstOrDefault();
     Debug.Assert(asmListTreeNode != null);
     if (moduleDefinition is ModuleDefMD)
         this.Children.Add(new ReferenceFolderTreeNode((ModuleDefMD)moduleDefinition, this, asmListTreeNode));
     this.Children.Add(new ResourceListTreeNode(moduleDefinition));
     foreach (NamespaceTreeNode ns in namespaces.Values) {
         ns.Children.Clear();
     }
     foreach (TypeDef type in moduleDefinition.Types.OrderBy(t => t.FullName, TypeStringComparer)) {
         NamespaceTreeNode ns;
         if (!namespaces.TryGetValue(type.Namespace, out ns)) {
             ns = new NamespaceTreeNode(type.Namespace);
             namespaces[type.Namespace] = ns;
         }
         TypeTreeNode node = new TypeTreeNode(type, this);
         typeDict[type] = node;
         ns.Children.Add(node);
     }
     foreach (NamespaceTreeNode ns in namespaces.Values.OrderBy(n => n.Name)) {
         if (ns.Children.Count > 0)
             this.Children.Add(ns);
     }
 }
Example #26
0
 internal void OnRemoved(TypeTreeNode typeNode)
 {
     bool b = typeDict.Remove(typeNode.TypeDefinition);
     Debug.Assert(b);
     if (!b)
         throw new InvalidOperationException();
 }
Example #27
0
 internal void OnReadded(TypeTreeNode typeNode)
 {
     Debug.Assert(!typeDict.ContainsKey(typeNode.TypeDefinition));
     typeDict.Add(typeNode.TypeDefinition, typeNode);
 }
Example #28
0
 internal void OnReadded(TypeTreeNode typeNode)
 {
     Debug.Assert(!typeDict.ContainsKey(typeNode.TypeDefinition));
     typeDict.Add(typeNode.TypeDefinition, typeNode);
 }
Example #29
0
			public void Delete(TypeTreeNode[] nodes) {
				Debug.Assert(infos == null);
				if (infos != null)
					throw new InvalidOperationException();

				infos = new ModelInfo[nodes.Length];

				for (int i = 0; i < infos.Length; i++) {
					var node = nodes[i];

					var info = new ModelInfo(node.TypeDefinition);
					infos[i] = info;
					info.OwnerList.RemoveAt(info.Index);
				}
			}
Example #30
0
		CreateMethodDefCommand(TypeTreeNode ownerNode, MethodDefOptions options) {
			this.ownerNode = ownerNode;
			this.methodNode = new MethodTreeNode(options.CreateMethodDef(ownerNode.TypeDef.Module));
		}
Example #31
0
 CreateFieldDefCommand(TypeTreeNode ownerNode, FieldDefOptions options)
 {
     this.ownerNode = ownerNode;
     this.fieldNode = new FieldTreeNode(options.CreateFieldDef(ownerNode.TypeDefinition.Module));
 }
Example #32
0
        static void Execute(ILSpyTreeNode[] nodes)
        {
            if (!CanExecute(nodes))
                return;

            var ownerNode = nodes[0];
            if (!(ownerNode is TypeTreeNode))
                ownerNode = (ILSpyTreeNode)ownerNode.Parent;
            var typeNode = ownerNode as TypeTreeNode;
            Debug.Assert(typeNode != null);
            if (typeNode == null)
                throw new InvalidOperationException();

            var module = ILSpyTreeNode.GetModule(typeNode);
            Debug.Assert(module != null);
            if (module == null)
                throw new InvalidOperationException();

            FieldDefOptions options;
            var type = typeNode.TypeDefinition;
            if (type.IsEnum) {
                var ts = type.GetEnumUnderlyingType();
                if (ts != null) {
                    options = FieldDefOptions.Create("MyField", new FieldSig(new ValueTypeSig(typeNode.TypeDefinition)));
                    options.Constant = module.UpdateRowId(new ConstantUser(ModelUtils.GetDefaultValue(ts), ts.RemovePinnedAndModifiers().GetElementType()));
                    options.Attributes |= FieldAttributes.Literal | FieldAttributes.Static | FieldAttributes.HasDefault;
                }
                else {
                    options = FieldDefOptions.Create("value__", new FieldSig(module.CorLibTypes.Int32));
                    options.Attributes |= FieldAttributes.SpecialName | FieldAttributes.RTSpecialName;
                }
            }
            else if (type.IsAbstract && type.IsSealed) {
                options = FieldDefOptions.Create("MyField", new FieldSig(module.CorLibTypes.Int32));
                options.Attributes |= FieldAttributes.Static;
            }
            else
                options = FieldDefOptions.Create("MyField", new FieldSig(module.CorLibTypes.Int32));

            var data = new FieldOptionsVM(options, module, MainWindow.Instance.CurrentLanguage, type);
            var win = new FieldOptionsDlg();
            win.Title = "Create Field";
            win.DataContext = data;
            win.Owner = MainWindow.Instance;
            if (win.ShowDialog() != true)
                return;

            UndoCommandManager.Instance.Add(new CreateFieldDefCommand(typeNode, data.CreateFieldDefOptions()));
        }
Example #33
0
        static void Execute(ILSpyTreeNode[] nodes)
        {
            if (!CanExecute(nodes))
                return;

            var ownerNode = nodes[0];
            if (!(ownerNode is TypeTreeNode))
                ownerNode = (ILSpyTreeNode)ownerNode.Parent;
            var typeNode = ownerNode as TypeTreeNode;
            Debug.Assert(typeNode != null);
            if (typeNode == null)
                throw new InvalidOperationException();

            var module = ILSpyTreeNode.GetModule(typeNode);
            Debug.Assert(module != null);
            if (module == null)
                throw new InvalidOperationException();

            bool isInstance = !(typeNode.TypeDefinition.IsAbstract && typeNode.TypeDefinition.IsSealed);
            var options = PropertyDefOptions.Create(module, "MyProperty", isInstance);

            var data = new PropertyOptionsVM(options, module, MainWindow.Instance.CurrentLanguage, typeNode.TypeDefinition);
            var win = new PropertyOptionsDlg();
            win.Title = "Create Property";
            win.DataContext = data;
            win.Owner = MainWindow.Instance;
            if (win.ShowDialog() != true)
                return;

            UndoCommandManager.Instance.Add(new CreatePropertyDefCommand(typeNode, data.CreatePropertyDefOptions()));
        }
Example #34
0
		void LoadModuleChildren(IPEImage peImage, ModuleDef module) {
			var asmListTreeNode = this.Ancestors().OfType<DnSpyFileListTreeNode>().FirstOrDefault();
			Debug.Assert(asmListTreeNode != null);
			// Only show the PE node if it was loaded from a file. The hex document is always loaded
			// from a file, so if the PEImage wasn't loaded from the same file, conversion to/from
			// RVA/FileOffset won't work and the wrong data will be displayed, eg. in the .NET
			// storage stream nodes.
			if (DnSpyFile.LoadedFromFile && peImage != null)
				this.Children.Add(new PETreeNode(peImage, module as ModuleDefMD));
			if (module != null) {
				this.Children.Add(new ReferenceFolderTreeNode(module, this, asmListTreeNode));
				this.Children.Add(new ResourceListTreeNode(module));
				foreach (NamespaceTreeNode ns in namespaces.Values) {
					ns.Children.Clear();
				}
				foreach (TypeDef type in module.Types.OrderBy(t => t.FullName, TypeStringComparer)) {
					NamespaceTreeNode ns;
					if (!namespaces.TryGetValue(type.Namespace, out ns)) {
						ns = new NamespaceTreeNode(type.Namespace);
						namespaces[type.Namespace] = ns;
					}
					TypeTreeNode node = new TypeTreeNode(type, this);
					typeDict[type] = node;
					ns.Children.Add(node);
				}
				foreach (NamespaceTreeNode ns in namespaces.Values.OrderBy(n => n.Name)) {
					if (ns.Children.Count > 0)
						this.Children.Add(ns);
				}
			}
		}
Example #35
0
        static void Execute(ILSpyTreeNode[] nodes)
        {
            if (!CanExecute(nodes))
                return;

            var ownerNode = nodes[0];
            if (!(ownerNode is TypeTreeNode))
                ownerNode = (ILSpyTreeNode)ownerNode.Parent;
            var typeNode = ownerNode as TypeTreeNode;
            Debug.Assert(typeNode != null);
            if (typeNode == null)
                throw new InvalidOperationException();

            var module = ILSpyTreeNode.GetModule(typeNode);
            Debug.Assert(module != null);
            if (module == null)
                throw new InvalidOperationException();

            bool isInstance = !(typeNode.TypeDefinition.IsAbstract && typeNode.TypeDefinition.IsSealed);
            var sig = isInstance ? MethodSig.CreateInstance(module.CorLibTypes.Void) : MethodSig.CreateStatic(module.CorLibTypes.Void);
            var options = MethodDefOptions.Create("MyMethod", sig);
            if (typeNode.TypeDefinition.IsInterface)
                options.Attributes |= MethodAttributes.Abstract | MethodAttributes.Virtual | MethodAttributes.NewSlot;

            var data = new MethodOptionsVM(options, module, MainWindow.Instance.CurrentLanguage, typeNode.TypeDefinition, null);
            var win = new MethodOptionsDlg();
            win.Title = "Create Method";
            win.DataContext = data;
            win.Owner = MainWindow.Instance;
            if (win.ShowDialog() != true)
                return;

            UndoCommandManager.Instance.Add(new CreateMethodDefCommand(typeNode, data.CreateMethodDefOptions()));
        }
Example #36
0
		internal TypeTreeNode GetOrCreateNonNestedTypeTreeNode(TypeDef td) {
			Debug.Assert(td != null && td.DeclaringType == null);
			Debug.Assert(!LazyLoading);
			TypeTreeNode typeNode;
			if (typeDict.TryGetValue(td, out typeNode))
				return typeNode;
			var nsNode = GetOrCreateNamespaceNode(td.Namespace);
			typeNode = new TypeTreeNode(td, this);
			typeDict.Add(td, typeNode);
			nsNode.AddToChildren(typeNode);
			return typeNode;
		}
Example #37
0
		protected override void LoadChildren()
		{
			AssemblyDefinition assemblyDefinition = assembly.AssemblyDefinition;
			if (assemblyDefinition == null) {
				// if we crashed on loading, then we don't have any children
				return;
			}
			ModuleDefinition mainModule = assemblyDefinition.MainModule;

			this.Children.Add(new ReferenceFolderTreeNode(mainModule, this));
			if (mainModule.HasResources)
				this.Children.Add(new ResourceListTreeNode(mainModule));
			foreach (NamespaceTreeNode ns in namespaces.Values) {
				ns.Children.Clear();
			}
			foreach (TypeDefinition type in mainModule.Types.OrderBy(t => t.FullName)) {
				NamespaceTreeNode ns;
				if (!namespaces.TryGetValue(type.Namespace, out ns)) {
					ns = new NamespaceTreeNode(type.Namespace);
					namespaces[type.Namespace] = ns;
				}
				TypeTreeNode node = new TypeTreeNode(type, this);
				typeDict[type] = node;
				ns.Children.Add(node);
			}
			foreach (NamespaceTreeNode ns in namespaces.Values.OrderBy(n => n.Name)) {
				if (ns.Children.Count > 0)
					this.Children.Add(ns);
			}
		}
Example #38
0
		void UpdateMemberNodes(TypeTreeNode typeNode) {
			// If it's not been loaded, we've got nothing to do
			if (typeNode.LazyLoading)
				return;

			var existing = new HashSet<object>();
			foreach (var child in typeNode.Children) {
				var memberNode = child as IMemberTreeNode;
				if (memberNode != null)
					existing.Add(memberNode.Member);
			}

			foreach (var fd in typeNode.TypeDef.Fields) {
				if (existing.Contains(fd))
					continue;
				typeNode.AddToChildren(new FieldTreeNode(fd));
			}

			foreach (var pd in typeNode.TypeDef.Properties) {
				if (existing.Contains(pd))
					continue;
				typeNode.AddToChildren(new PropertyTreeNode(pd, typeNode));
			}

			foreach (var ed in typeNode.TypeDef.Events) {
				if (existing.Contains(ed))
					continue;
				typeNode.AddToChildren(new EventTreeNode(ed));
			}

			var accessorMethods = typeNode.TypeDef.GetAccessorMethods();
			foreach (var md in typeNode.TypeDef.Methods) {
				if (existing.Contains(md))
					continue;
				if (!accessorMethods.Contains(md))
					typeNode.AddToChildren(new MethodTreeNode(md));
			}
		}
Example #39
0
		CreateTypeDefCommand(IList<TypeDef> ownerList, ILSpyTreeNode ownerNode, TypeDefOptions options) {
			this.ownerList = ownerList;
			var modNode = ILSpyTreeNode.GetNode<AssemblyTreeNode>(ownerNode);
			Debug.Assert(modNode != null);
			if (modNode == null)
				throw new InvalidOperationException();
			this.nsNodeCreator = new NamespaceTreeNodeCreator(options.Namespace, modNode);
			this.typeNode = new TypeTreeNode(options.CreateTypeDef(modNode.LoadedAssembly.ModuleDefinition), modNode.Parent as AssemblyTreeNode ?? modNode);
		}
Example #40
0
		internal TypeTreeNode GetOrCreateNestedTypeTreeNode(TypeDef nestedType) {
			Debug.Assert(nestedType != null && nestedType.DeclaringType == type);
			EnsureChildrenFiltered();
			var typeNode = Children.OfType<TypeTreeNode>().FirstOrDefault(n => n.type == nestedType);
			if (typeNode != null)
				return typeNode;
			typeNode = new TypeTreeNode(nestedType, parentAssemblyNode);
			AddToChildren(typeNode);
			return typeNode;
		}
Example #41
0
 CreatePropertyDefCommand(TypeTreeNode ownerNode, PropertyDefOptions options)
 {
     this.ownerNode = ownerNode;
     this.propNode = new PropertyTreeNode(options.CreatePropertyDef(ownerNode.TypeDefinition.Module));
 }
Example #42
0
		TypeDefSettingsCommand(ModuleDef module, TypeTreeNode typeNode, TypeDefOptions options) {
			this.module = module;
			this.typeNode = typeNode;
			this.newOptions = options;
			this.origOptions = new TypeDefOptions(typeNode.TypeDefinition);

			this.origParentNode = (ILSpyTreeNode)typeNode.Parent;
			this.origParentChildIndex = this.origParentNode.Children.IndexOf(typeNode);
			Debug.Assert(this.origParentChildIndex >= 0);
			if (this.origParentChildIndex < 0)
				throw new InvalidOperationException();

			this.nameChanged = origOptions.Name != newOptions.Name;
			if (this.origParentNode is NamespaceTreeNode) {
				var asmNode = (AssemblyTreeNode)this.origParentNode.Parent;
				if (!AssemblyTreeNode.NamespaceStringEqualsComparer.Equals(newOptions.Namespace, origOptions.Namespace))
					this.nsNodeCreator = new NamespaceTreeNodeCreator(newOptions.Namespace, asmNode);
			}

			if (this.nameChanged || origOptions.Namespace != newOptions.Namespace)
				this.typeRefInfos = RefFinder.FindTypeRefsToThisModule(module).Where(a => RefFinder.TypeEqualityComparerInstance.Equals(a, typeNode.TypeDefinition)).Select(a => new TypeRefInfo(a)).ToArray();
		}
Example #43
0
			public void Restore(TypeTreeNode[] nodes) {
				Debug.Assert(infos != null);
				if (infos == null)
					throw new InvalidOperationException();
				Debug.Assert(infos.Length == nodes.Length);
				if (infos.Length != nodes.Length)
					throw new InvalidOperationException();

				for (int i = infos.Length - 1; i >= 0; i--) {
					var node = nodes[i];
					var info = infos[i];
					info.OwnerList.Insert(info.Index, node.TypeDefinition);
				}

				infos = null;
			}
Example #44
0
        TypeDefSettingsCommand(ModuleDef module, TypeTreeNode typeNode, TypeDefOptions options)
        {
            this.module = module;
            this.typeNode = typeNode;
            this.newOptions = options;
            this.origOptions = new TypeDefOptions(typeNode.TypeDefinition);

            this.origParentNode = (ILSpyTreeNode)typeNode.Parent;
            this.origParentChildIndex = this.origParentNode.Children.IndexOf(typeNode);
            Debug.Assert(this.origParentChildIndex >= 0);
            if (this.origParentChildIndex < 0)
                throw new InvalidOperationException();

            this.nameChanged = origOptions.Name != newOptions.Name;
            if (this.origParentNode is NamespaceTreeNode) {
                var asmNode = (AssemblyTreeNode)this.origParentNode.Parent;
                if (AssemblyTreeNode.NamespaceStringComparer.Compare(newOptions.Namespace, origOptions.Namespace) != 0)
                    this.nsNodeCreator = new NamespaceTreeNodeCreator(newOptions.Namespace, asmNode);
            }
        }
Example #45
0
		DeleteTypeDefCommand(TypeTreeNode[] asmNodes) {
			nodes = new DeletableNodes<TypeTreeNode>(asmNodes);
		}
Example #46
0
 /// <summary>
 /// Registers a type node in the dictionary for quick type lookup.
 /// </summary>
 /// <remarks>This method is called by the assembly loading code (on a background thread)</remarks>
 public void RegisterTypeNode(TypeTreeNode node)
 {
     // called on background loading thread, so we need to use a ConcurrentDictionary
     typeDict[node.TypeDefinition] = node;
 }