Browse Source

Types have proper access modifiers and are properly nested

pull/1/head^2
David Srbecký 18 years ago
parent
commit
a605c5b5a3
  1. 36
      src/CodeDomBuilder.cs

36
src/CodeDomBuilder.cs

@ -42,6 +42,11 @@ namespace Decompiler
public void AddAssembly(AssemblyDefinition assemblyDefinition) public void AddAssembly(AssemblyDefinition assemblyDefinition)
{ {
foreach(TypeDefinition typeDef in assemblyDefinition.MainModule.Types) { 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 <Module> class
if (typeDef.Name == "<Module>") continue;
AddType(typeDef); AddType(typeDef);
} }
} }
@ -60,10 +65,39 @@ namespace Decompiler
} }
public void AddType(TypeDefinition typeDef) public void AddType(TypeDefinition typeDef)
{
CodeTypeDeclaration codeType = CreateType(typeDef);
GetCodeNamespace(typeDef.Namespace).Types.Add(codeType);
}
public CodeTypeDeclaration CreateType(TypeDefinition typeDef)
{ {
CodeTypeDeclaration codeType = new CodeTypeDeclaration(); CodeTypeDeclaration codeType = new CodeTypeDeclaration();
codeType.Name = typeDef.Name; 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;
} }
} }
} }

Loading…
Cancel
Save