using System; using System.Reflection; // #define Console.WriteLine nic namespace NemerleDoc { module AssemblyAnalyzer { mutable asm : Assembly; type_analyzer (t : System.Type, tree : DataTree) : void { /* Console.WriteLine("\n\n--> Type analyzer: SystemType.ToString() {0}", t.ToString()); Console.WriteLine("--> FullName {0}\tAttributes {1}", t.FullName, t.Attributes); Console.WriteLine("--> Namespace: {0}\tName: {1}", t.Namespace, t.Name, t.FullName); Console.WriteLine("--> BaseType: {0}\tDeclaredType: {1}\n\n", t.BaseType, t.DeclaringType); */ // analyze attributes def attr = ReflAttribs(is_abstract=t.IsAbstract, is_array=t.IsArray, is_class=t.IsClass, is_interface=t.IsInterface, attr=t.Attributes); tree.AddItem(t.FullName, ElementType.Type(), attr, t.BaseType, t.GetInterfaces()); foreach (m in t.GetMembers()) { // Console.WriteLine("------> Declared type: {0}, Member type: {1}, Name: {2}, ReflType: {3}", m.DeclaringType, m.MemberType, m.Name, m.ReflectedType); // Console.WriteLine("------> GetType: {0} ", m.GetType()); def ty = match (m.MemberType) { | Constructor | Method => ElementType.Method() | Event => ElementType.Event() | Field => ElementType.Field() | Property => ElementType.Property() | NestedType | TypeInfo => ElementType.Type() | Custom | All | _ => ElementType.Unknown() } if (ty != null) tree.AddItem(m.DeclaringType.ToString(), m.Name, ty) else Console.WriteLine("*** Rejected {0} ***, {1}", m.Name, m.MemberType); } } public analyze (filename : string, tree : DataTree) : void { asm = Assembly.LoadFile(filename); // Console.WriteLine("Codebase={0}\nFullName={1}\nLocation={2}", ass.CodeBase, ass.FullName, ass.Location); foreach (t in asm.GetTypes()) type_analyzer(t, tree) } } // AssemblyAnalyzer }