rendered paste bodyusing System;
using System.Reflection;
namespace NPhilosopher.NILC {
public variant NAssembly {
| Assembly {
AssemblyName : string;
Types : list [NAssembly];
}
| Type {
TypeName : string;
Members : list [NAssembly];
}
| Method {
MethodName : string;
Arguments : list [NAssembly];
ReturnType : System.Type;
}
| Argument {
ArgName : string;
ArgType : System.Type;
}
| Other
}
public module Reflector {
public Reflect(file : string) : NAssembly {
mutable types : list[NAssembly] = [];
def assembly = Assembly.ReflectionOnlyLoadFrom(file);
foreach(t in assembly.GetTypes())
types = NAssembly.Type(t.FullName, ReflectMembers(t)) :: types;
NAssembly.Assembly(assembly.FullName, types);
}
public ReflectMembers(t : Type) : list[NAssembly] {
mutable members : list[NAssembly] = [];
def flags = (
BindingFlags.Instance |
BindingFlags.Static |
BindingFlags.Public |
BindingFlags.NonPublic
);
foreach(member in t.GetMembers(flags)) {
def mem = match(member.MemberType) {
| MemberTypes.Method =>
def method = member :> MethodInfo;
NAssembly.Method(
MethodName=member.Name,
Arguments=ReflectMethodArguments(method),
ReturnType=method.ReturnType
);
| _ => NAssembly.Other();
};
members = mem :: members;
}
members;
}
public ReflectMethodArguments(m : MethodInfo) : list [NAssembly] {
mutable args : list[NAssembly] = [];
foreach(param in m.GetParameters())
args = NAssembly.Argument(param.Name, param.ParameterType) :: args;
args;
}
}
}