protected void GenMethods() { var flags = BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.DeclaredOnly; Dictionary <string, MethodDataSet> allMethods = new Dictionary <string, MethodDataSet>(); Action <MethodInfo, bool> methodCollector = (mi, isExtend) => { MethodDataSet set; if (allMethods.TryGetValue(mi.Name, out set)) { set.Add(mi, isExtend); } else { set = new MethodDataSet(); set.Add(mi, isExtend); allMethods.Add(mi.Name, set); } }; //extend if (_bindType.extendList != null) { foreach (var type in _bindType.extendList) { MethodInfo[] methodInfos = type.GetMethods(flags); var extFilter = new GeneralFilter <MethodInfo>(methodInfos) .Exclude(methodExcludeFilter) .And(new ExtendMethodFilter(_bindType.type)); extFilter.Each(mi => { methodCollector(mi, true); }); } } //base var methods = _bindType.type.GetMethods(flags); var filter = new GeneralFilter <MethodInfo>(methods); var methodFilter = filter.Exclude(methodExcludeFilter); methodFilter.Each(mi => { methodCollector(mi, false); }); foreach (var pair in allMethods) { GenMethod(pair.Key, pair.Value); } }
protected override void GenMethod(string name, MethodDataSet methodDataSet) { //overload if (methodDataSet.MethodList.Count > 1) { for (var j = 1; j < methodDataSet.MethodList.Count; j++) { var data = methodDataSet.MethodList [j]; var mi = data.Method; var parameters = mi.GetParameters(); int startIdx = data.IsExtend ? 1 : 0; string[] paramNames = new string[parameters.Length - startIdx]; for (var i = startIdx; i < parameters.Length; i++) { var pi = parameters [i]; string piName = GetParamName(pi.Name); paramNames [i - startIdx] = string.Format("{0}:{1}", piName, pi.ParameterType.GetTypeStr()); } _methodBuilder.AppendFormat("---@overload fun({0}):{1}\n", string.Join(", ", paramNames), mi.ReturnType.GetTypeStr()); } } //main { var data = methodDataSet.MethodList [0]; var mi = data.Method; var parameters = mi.GetParameters(); int startIdx = data.IsExtend ? 1 : 0; string[] paramNames = new string[parameters.Length - startIdx]; for (var i = startIdx; i < parameters.Length; i++) { var pi = parameters [i]; string piName = GetParamName(pi.Name); _methodBuilder.AppendFormat("---@param {0} {1}\n", piName, pi.ParameterType.GetTypeStr()); paramNames [i - startIdx] = piName; } var returnType = mi.ReturnType; if (typeof(void) != returnType) { _methodBuilder.AppendFormat("---@return {0}\n", returnType.GetTypeStr()); } string c = mi.IsStatic && !data.IsExtend ? "." : ":"; _methodBuilder.AppendFormat("function m{0}{1}({2}) end\n", c, mi.Name, string.Join(", ", paramNames)); } }
protected abstract void GenMethod(string name, MethodDataSet methodDataSet);