// 输出所有变体绑定 // hasOverrides: 是否需要处理重载 protected void WriteAllVariants(MethodBaseBindingInfo <T> bindingInfo) // SortedDictionary<int, MethodBaseVariant<T>> variants) { var variants = bindingInfo.variants; var hasOverrides = bindingInfo.count > 1; if (hasOverrides) { // 需要处理重载 GenMethodVariants(variants); } else { // 没有重载的情况 (variants.Count == 1) foreach (var variantKV in variants) { var args = variantKV.Key; var variant = variantKV.Value; var argc = cg.AppendGetArgCount(variant.isVararg); if (variant.isVararg) { var method = variant.varargMethods[0]; // Debug.Log($"varargMethods {method}"); WriteCSMethodBinding(method, argc, true); } else { var method = variant.plainMethods[0]; // Debug.Log($"plainMethods {method}"); WriteCSMethodBinding(method, argc, false); } } } }
protected void WriteTSAllVariants(MethodBaseBindingInfo <T> bindingInfo) { var variants = bindingInfo.variants; //TODO: 如果产生了无法在 typescript 中声明的方法, 则作标记, 并输出一条万能声明 // [key: string]: any foreach (var variantKV in variants) { foreach (var method in variantKV.Value.plainMethods) { WriteTSDeclaration(method, bindingInfo); } foreach (var method in variantKV.Value.varargMethods) { WriteTSDeclaration(method, bindingInfo); } } }
protected List <ParameterInfo> WriteTSDeclaration(T method, MethodBaseBindingInfo <T> bindingInfo) { var isExtension = method.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute)); var refParameters = new List <ParameterInfo>(); string tsMethodDeclaration; if (this.cg.bindingManager.GetTSMethodDeclaration(method, out tsMethodDeclaration)) { this.cg.tsDeclare.AppendLine(tsMethodDeclaration); return(refParameters); } //TODO: 需要处理参数类型归并问题, 因为如果类型没有导入 ts 中, 可能会在声明中出现相同参数列表的定义 // 在 MethodVariant 中创建每个方法对应的TS类型名参数列表, 完全相同的不再输出 this.cg.AppendJSDoc(method); var prefix = ""; if (method.IsStatic && !isExtension) { prefix = "static "; } string tsMethodRename; if (this.cg.bindingManager.GetTSMethodRename(method, out tsMethodRename)) { this.cg.tsDeclare.Append($"{prefix}{tsMethodRename}("); } else { this.cg.tsDeclare.Append($"{prefix}{bindingInfo.regName}("); } var parameters = method.GetParameters(); if (isExtension) { ArrayUtility.RemoveAt(ref parameters, 0); } for (var i = 0; i < parameters.Length; i++) { var parameter = parameters[i]; var parameter_prefix = ""; var parameterType = parameter.ParameterType; if (parameter.IsOut && parameterType.IsByRef) { // parameter_prefix = "/*out*/ "; refParameters.Add(parameter); } else if (parameterType.IsByRef) { // parameter_prefix = "/*ref*/ "; refParameters.Add(parameter); } if (parameter.IsDefined(typeof(ParamArrayAttribute), false) && i == parameters.Length - 1) { var elementType = parameterType.GetElementType(); var elementTS = this.cg.bindingManager.GetTSTypeFullName(elementType); var parameterVarName = BindingManager.GetTSVariable(parameter.Name); this.cg.tsDeclare.AppendL($"{parameter_prefix}...{parameterVarName}: {elementTS}[]"); } else { var parameterTS = this.cg.bindingManager.GetTSTypeFullName(parameterType, parameter.IsOut); var parameterVarName = BindingManager.GetTSVariable(parameter.Name); this.cg.tsDeclare.AppendL($"{parameter_prefix}{parameterVarName}: {parameterTS}"); } if (i != parameters.Length - 1) { this.cg.tsDeclare.AppendL(", "); } } this.cg.tsDeclare.AppendL($")"); WriteTSReturn(method, refParameters); return(refParameters); }