From a605c5b5a35181cf88de868c3a6536e58d5fabb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Sun, 28 Oct 2007 14:57:37 +0000 Subject: [PATCH] Types have proper access modifiers and are properly nested --- src/CodeDomBuilder.cs | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/CodeDomBuilder.cs b/src/CodeDomBuilder.cs index 79c72fb1f..e7381ceaf 100644 --- a/src/CodeDomBuilder.cs +++ b/src/CodeDomBuilder.cs @@ -42,6 +42,11 @@ namespace Decompiler public void AddAssembly(AssemblyDefinition assemblyDefinition) { foreach(TypeDefinition typeDef in assemblyDefinition.MainModule.Types) { + // Skip nested types - they will be added by the parent type + if (typeDef.DeclaringType != null) continue; + // Skip the class + if (typeDef.Name == "") continue; + AddType(typeDef); } } @@ -60,10 +65,39 @@ namespace Decompiler } public void AddType(TypeDefinition typeDef) + { + CodeTypeDeclaration codeType = CreateType(typeDef); + GetCodeNamespace(typeDef.Namespace).Types.Add(codeType); + } + + public CodeTypeDeclaration CreateType(TypeDefinition typeDef) { CodeTypeDeclaration codeType = new CodeTypeDeclaration(); codeType.Name = typeDef.Name; - GetCodeNamespace(typeDef.Namespace).Types.Add(codeType); + + // Copy modifiers across (includes 'is interface' attribute) + codeType.TypeAttributes = (System.Reflection.TypeAttributes)typeDef.Attributes; + + // Is struct or enum? + if (typeDef.IsValueType) { + if (typeDef.IsEnum) { // NB: Enum is value type + codeType.IsEnum = true; + } else { + codeType.IsStruct = true; + } + } + + // Nested types + foreach(TypeDefinition nestedTypeDef in typeDef.NestedTypes) { + codeType.Members.Add(CreateType(nestedTypeDef)); + } + + // Base type + if (typeDef.BaseType != null && !typeDef.IsValueType && typeDef.BaseType.FullName != Constants.Object) { + codeType.BaseTypes.Add(typeDef.BaseType.FullName); + } + + return codeType; } } }