3 using System.Reflection;
\r
4 using System.Collections;
\r
12 static int Main2(string[] args)
\r
14 static int Main(string[] args)
\r
18 System.Text.StringBuilder code = new StringBuilder ();
\r
21 //if (args.Length >= 1 && args [0].ToLower () == "all") {
\r
22 // if (args.Length == 1) {
\r
25 // } else if (args.Length == 2) {
\r
26 // GenerateAll (args [1], false);
\r
31 if (args.Length != 2 && args.Length != 3) {
\r
32 Console.WriteLine("Must supply at least two arguments: ");
\r
33 Console.WriteLine("\t Type to log ('all' to log all overrides and events for all types in System.Windows.Forms.dll)");
\r
34 Console.WriteLine("\t What to log [overrides|events|overridesevents]");
\r
35 Console.WriteLine("\t [output filename]");
\r
39 Assembly a = typeof(System.Windows.Forms.Control).Assembly;
\r
40 type = a.GetType (args [0]);
\r
43 throw new Exception (String.Format("Type '{0}' not found.", args[0]));
\r
45 code.Append ("// Automatically generated for assembly: " + a.FullName + Environment.NewLine);
\r
46 code.Append ("// To regenerate:" + Environment.NewLine);
\r
47 code.Append ("// mcs -r:System.Windows.Forms.dll LogGenerator.cs && mono LogGenerator.exe " + type.FullName + " " + args [1] + " " + (args.Length > 2 ? args [2] : " outfile.cs") + Environment.NewLine);
\r
49 if (args[1] == "overrides" || args[1] == "overridesevents")
\r
51 code.Append (override_logger.GenerateLog (type));
\r
53 if (args[1] == "events" || args[1] == "overridesevents")
\r
55 code.Append (event_logger.GenerateLog (type));
\r
58 if (args.Length > 2) {
\r
59 using (System.IO.StreamWriter writer = new System.IO.StreamWriter(args[2], false))
\r
64 Console.WriteLine(code);
\r
68 } catch (Exception ex) {
\r
69 Console.WriteLine (ex.Message);
\r
70 Console.WriteLine (ex.StackTrace);
\r
77 class override_logger
\r
79 public static string GenerateLog (Type type)
\r
81 StringBuilder members = new StringBuilder ();
\r
85 #region {0}OverrideLogger
\r
87 using System.Collections;
\r
88 using System.Drawing;
\r
89 using System.Windows.Forms;
\r
90 using System.ComponentModel;
\r
91 using System.Runtime.Remoting;
\r
94 namespace MonoTests.System.Windows.Forms
\r
96 public class {0}OverrideLogger : {2}{0}
\r
98 public StringBuilder Log = new StringBuilder ();
\r
99 void ShowLocation(string message)
\r
101 Log.Append (message + Environment.NewLine);
\r
102 //Console.WriteLine(DateTime.Now.ToLongTimeString() + "" {2}{0}."" + message);
\r
110 string method_impl =
\r
112 {1} override {2} {0}({3})
\r
119 string property_impl =
\r
121 {1} override {2} {0}
\r
143 foreach (MemberInfo member in type.GetMembers (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)) {
\r
144 switch (member.MemberType) {
\r
145 case MemberTypes.Constructor:
\r
146 case MemberTypes.Event:
\r
147 case MemberTypes.Field:
\r
148 case MemberTypes.NestedType:
\r
149 case MemberTypes.TypeInfo:
\r
150 case MemberTypes.Custom:
\r
152 case MemberTypes.Property:
\r
153 case MemberTypes.Method:
\r
159 MethodInfo method = member as MethodInfo;
\r
160 PropertyInfo property = member as PropertyInfo;
\r
164 string message = "";
\r
168 if (method != null) {
\r
169 if (!getData (method, out returnType, out access, out parameters, ref message, out basecall, false))
\r
171 membercode = string.Format (method_impl, method.Name, access, returnType, parameters, message, basecall);
\r
174 string getstr = "";
\r
175 string setstr = "";
\r
177 MethodInfo get = (property.CanRead ? property.GetGetMethod () : null);
\r
182 if (!getData (get, out returnType, out access, out parameters, ref message, out basecall, true))
\r
185 getstr = string.Format (get_impl, property.Name, message);
\r
186 setstr = string.Format (set_impl, property.Name, message);
\r
188 if (!property.CanRead)
\r
190 if (!property.CanWrite)
\r
193 membercode = string.Format (property_impl, property.Name, access, returnType, getstr, setstr);
\r
196 members.Append (membercode + "\n");
\r
198 code = String.Format (code, type.Name, members.ToString (), "");
\r
203 static bool getData (MethodInfo method, out string returnType, out string access, out string parameters, ref string message, out string basecall, bool allow_specialname)
\r
211 if (method.IsPrivate)
\r
213 if (method.IsAssembly)
\r
216 if (!method.IsVirtual)
\r
218 if (method.IsFinal)
\r
220 if (method.IsSpecialName && !allow_specialname)
\r
222 //if (method.Name.StartsWith("get_"))
\r
224 //if (method.Name.StartsWith("set_"))
\r
227 if (method.Name == "Finalize")
\r
229 if (method.Name == "GetLifetimeService")
\r
232 returnType = method.ReturnType.FullName.Replace ("+", ".");
\r
233 returnType = method.ReturnType.Name;//.Replace ("+", ".");
\r
234 if (returnType == "Void")
\r
235 returnType = "void";
\r
237 if (method.IsPublic)
\r
239 else if (method.IsFamilyOrAssembly)
\r
240 access = "protected";
\r
241 else if (method.IsFamily)
\r
242 access = "protected";
\r
246 string msgParams = "";
\r
247 string baseParams = "";
\r
248 string formatParams = "";
\r
249 ParameterInfo [] ps = method.GetParameters ();
\r
251 for (int i = 0; i < ps.Length; i++) {
\r
252 ParameterInfo param = ps [i];
\r
254 if (parameters != "") {
\r
255 parameters += ", ";
\r
257 formatParams += ", ";
\r
258 baseParams += ", ";
\r
261 string parameterType;
\r
263 if (param.ParameterType.IsByRef) {
\r
264 parameterType = param.ParameterType.GetElementType ().Name + " ";//sparam.ParameterType.FullName.Replace ("+", ".") + " ";
\r
265 baseParams += "ref ";
\r
266 parameters += "ref ";
\r
268 parameterType = param.ParameterType.Name + " ";
\r
271 parameters += parameterType;
\r
274 if (param.Name != null && param.Name != "")
\r
277 name = "parameter" + (i + 1).ToString ();
\r
279 parameters += param.Name + " ";
\r
280 msgParams += param.Name;
\r
281 baseParams += param.Name;
\r
282 formatParams += param.Name + "=<{" + i.ToString () + "}>";
\r
285 if (!method.IsAbstract) {
\r
286 basecall = "base." + method.Name + "(" + baseParams + ");";
\r
287 if (returnType != "void")
\r
288 basecall = "return " + basecall;
\r
290 if (msgParams != "")
\r
291 msgParams = ", " + msgParams;
\r
292 message = "ShowLocation (string.Format(\"" + method.Name + " (" + formatParams + ") \"" + msgParams + "))";
\r
300 public static string GenerateLog (Type type)
\r
302 StringBuilder adders = new StringBuilder ();
\r
303 StringBuilder handlers = new StringBuilder ();
\r
307 #region {0}EventLogger
\r
309 using System.Reflection;
\r
310 using System.Diagnostics;
\r
312 namespace MonoTests.System.Windows.Forms
\r
314 public class {0}EventLogger
\r
316 private {3}{0} _obj;
\r
318 public {0}EventLogger({3}{0} obj)
\r
324 void ShowLocation()
\r
326 MethodBase method = new StackFrame (1, true).GetMethod ();
\r
327 Console.WriteLine (DateTime.Now.ToLongTimeString () + "" {0}."" + method.Name.Replace (""_ctrl_"", """"));
\r
337 void _obj_{0} ({1} sender, {2} e)
\r
343 foreach (EventInfo ev in type.GetEvents ()) {
\r
347 ParameterInfo [] ps = ev.EventHandlerType.GetMethod ("Invoke").GetParameters ();
\r
348 handler = string.Format (method, ev.Name, ps [0].ParameterType.Name, ps [1].ParameterType.Name);
\r
349 adder = "\t\t_obj." + ev.Name + " += new " + ev.EventHandlerType.Name + " (_obj_" + ev.Name + ");";
\r
351 adders.Append (adder + Environment.NewLine);
\r
352 handlers.Append (handler);
\r
354 code = String.Format (code, type.Name, adders.ToString (), handlers.ToString (), "");//type.Namespace + ".");
\r