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
19 bool is_2_0 = false;
\r
22 //if (args.Length >= 1 && args [0].ToLower () == "all") {
\r
23 // if (args.Length == 1) {
\r
26 // } else if (args.Length == 2) {
\r
27 // GenerateAll (args [1], false);
\r
32 if (args.Length != 2 && args.Length != 3) {
\r
33 Console.WriteLine("Must supply at least two arguments: ");
\r
34 Console.WriteLine("\t Type to log ('all' to log all overrides and events for all types in System.Windows.Forms.dll)");
\r
35 Console.WriteLine("\t What to log [overrides|events|overridesevents]");
\r
36 Console.WriteLine("\t [output filename]");
\r
40 Assembly a = typeof(System.Windows.Forms.Control).Assembly;
\r
41 type = a.GetType (args [0]);
\r
42 is_2_0 = a.FullName.IndexOf ("2.0") >= 0;
\r
45 throw new Exception (String.Format("Type '{0}' not found.", args[0]));
\r
47 code.Append ("// Automatically generated for assembly: " + a.FullName + Environment.NewLine);
\r
48 code.Append ("// To regenerate:" + Environment.NewLine);
\r
49 code.Append ("// " + (is_2_0 ? "gmcs" : "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
52 code.Append ("#if NET_2_0" + Environment.NewLine);
\r
54 code.Append ("#if !NET_2_0" + Environment.NewLine);
\r
57 if (args[1] == "overrides" || args[1] == "overridesevents")
\r
59 code.Append (override_logger.GenerateLog (type));
\r
61 if (args[1] == "events" || args[1] == "overridesevents")
\r
63 code.Append (event_logger.GenerateLog (type));
\r
66 code.Append ("#endif" + Environment.NewLine);
\r
68 if (args.Length > 2) {
\r
69 using (System.IO.StreamWriter writer = new System.IO.StreamWriter(args[2], false))
\r
74 Console.WriteLine(code);
\r
78 } catch (Exception ex) {
\r
79 Console.WriteLine (ex.Message);
\r
80 Console.WriteLine (ex.StackTrace);
\r
87 class override_logger
\r
89 public static string GenerateLog (Type type)
\r
91 StringBuilder members = new StringBuilder ();
\r
95 #region {0}OverrideLogger
\r
97 using System.Collections;
\r
98 using System.Drawing;
\r
99 using System.Windows.Forms;
\r
100 using System.ComponentModel;
\r
101 using System.Runtime.Remoting;
\r
103 using System.Windows.Forms.Layout;
\r
107 namespace MonoTests.System.Windows.Forms
\r
109 public class {0}OverrideLogger : {2}{0}
\r
111 public StringBuilder Log = new StringBuilder ();
\r
112 void ShowLocation(string message)
\r
114 Log.Append (message + Environment.NewLine);
\r
115 //Console.WriteLine(DateTime.Now.ToLongTimeString() + "" {2}{0}."" + message);
\r
123 string method_impl =
\r
125 {1} override {2} {0}({3})
\r
132 string property_impl =
\r
134 {1} override {2} {0}
\r
156 foreach (MemberInfo member in type.GetMembers (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)) {
\r
157 switch (member.MemberType) {
\r
158 case MemberTypes.Constructor:
\r
159 case MemberTypes.Event:
\r
160 case MemberTypes.Field:
\r
161 case MemberTypes.NestedType:
\r
162 case MemberTypes.TypeInfo:
\r
163 case MemberTypes.Custom:
\r
165 case MemberTypes.Property:
\r
166 case MemberTypes.Method:
\r
172 MethodInfo method = member as MethodInfo;
\r
173 PropertyInfo property = member as PropertyInfo;
\r
177 string message = "";
\r
181 if (method != null) {
\r
182 if (!getData (method, out returnType, out access, out parameters, ref message, out basecall, false))
\r
184 membercode = string.Format (method_impl, method.Name, access, returnType, parameters, message, basecall);
\r
187 string getstr = "";
\r
188 string setstr = "";
\r
190 MethodInfo get = (property.CanRead ? property.GetGetMethod () : null);
\r
195 if (!getData (get, out returnType, out access, out parameters, ref message, out basecall, true))
\r
198 getstr = string.Format (get_impl, property.Name, message);
\r
199 setstr = string.Format (set_impl, property.Name, message);
\r
201 if (!property.CanRead)
\r
203 if (!property.CanWrite)
\r
206 membercode = string.Format (property_impl, property.Name, access, returnType, getstr, setstr);
\r
209 members.Append (membercode + "\n");
\r
211 code = String.Format (code, type.Name, members.ToString (), "");
\r
216 static bool getData (MethodInfo method, out string returnType, out string access, out string parameters, ref string message, out string basecall, bool allow_specialname)
\r
224 if (method.IsPrivate)
\r
226 if (method.IsAssembly)
\r
229 if (!method.IsVirtual)
\r
231 if (method.IsFinal)
\r
233 if (method.IsSpecialName && !allow_specialname)
\r
235 //if (method.Name.StartsWith("get_"))
\r
237 //if (method.Name.StartsWith("set_"))
\r
240 if (method.Name == "Finalize")
\r
242 if (method.Name == "GetLifetimeService")
\r
245 returnType = method.ReturnType.FullName.Replace ("+", ".");
\r
246 returnType = method.ReturnType.Name;//.Replace ("+", ".");
\r
247 if (returnType == "Void")
\r
248 returnType = "void";
\r
250 if (method.IsPublic)
\r
252 else if (method.IsFamilyOrAssembly)
\r
253 access = "protected";
\r
254 else if (method.IsFamily)
\r
255 access = "protected";
\r
259 string msgParams = "";
\r
260 string baseParams = "";
\r
261 string formatParams = "";
\r
262 ParameterInfo [] ps = method.GetParameters ();
\r
264 for (int i = 0; i < ps.Length; i++) {
\r
265 ParameterInfo param = ps [i];
\r
267 if (parameters != "") {
\r
268 parameters += ", ";
\r
270 formatParams += ", ";
\r
271 baseParams += ", ";
\r
274 string parameterType;
\r
276 if (param.ParameterType.IsByRef) {
\r
277 parameterType = param.ParameterType.GetElementType ().Name + " ";//sparam.ParameterType.FullName.Replace ("+", ".") + " ";
\r
278 baseParams += "ref ";
\r
279 parameters += "ref ";
\r
281 parameterType = param.ParameterType.Name + " ";
\r
284 parameters += parameterType;
\r
287 if (param.Name != null && param.Name != "")
\r
290 name = "parameter" + (i + 1).ToString ();
\r
292 parameters += param.Name + " ";
\r
293 msgParams += param.Name;
\r
294 baseParams += param.Name;
\r
295 formatParams += param.Name + "=<{" + i.ToString () + "}>";
\r
298 if (!method.IsAbstract) {
\r
299 basecall = "base." + method.Name + "(" + baseParams + ");";
\r
300 if (returnType != "void")
\r
301 basecall = "return " + basecall;
\r
303 if (msgParams != "")
\r
304 msgParams = ", " + msgParams;
\r
305 message = "ShowLocation (string.Format(\"" + method.Name + " (" + formatParams + ") \"" + msgParams + "))";
\r
313 public static string GenerateLog (Type type)
\r
315 StringBuilder adders = new StringBuilder ();
\r
316 StringBuilder handlers = new StringBuilder ();
\r
320 #region {0}EventLogger
\r
322 using System.Reflection;
\r
323 using System.Diagnostics;
\r
325 namespace MonoTests.System.Windows.Forms
\r
327 public class {0}EventLogger
\r
329 private {3}{0} _obj;
\r
331 public {0}EventLogger({3}{0} obj)
\r
337 void ShowLocation()
\r
339 MethodBase method = new StackFrame (1, true).GetMethod ();
\r
340 Console.WriteLine (DateTime.Now.ToLongTimeString () + "" {0}."" + method.Name.Replace (""_ctrl_"", """"));
\r
350 void _obj_{0} ({1} sender, {2} e)
\r
356 foreach (EventInfo ev in type.GetEvents ()) {
\r
360 ParameterInfo [] ps = ev.EventHandlerType.GetMethod ("Invoke").GetParameters ();
\r
361 handler = string.Format (method, ev.Name, ps [0].ParameterType.Name, ps [1].ParameterType.Name);
\r
362 adder = "\t\t_obj." + ev.Name + " += new " + ev.EventHandlerType.Name + " (_obj_" + ev.Name + ");";
\r
364 adders.Append (adder + Environment.NewLine);
\r
365 handlers.Append (handler);
\r
367 code = String.Format (code, type.Name, adders.ToString (), handlers.ToString (), "");//type.Namespace + ".");
\r