public static StringBuilder BuildConstructors(Type type, ConstructorInfo[] constructors, int[] constructorsIndex, ClassCallbackNames ccbn) { /* * methods * 0 function name * 1 list<CSParam> generation * 2 function call */ string fmt = @" static bool {0}(JSVCall vc, int argc) [[ {1} return true; ]] "; StringBuilder sb = new StringBuilder(); /*if (constructors.Length == 0 && JSBindingSettings.IsGeneratedDefaultConstructor(type) && (type.IsValueType || (type.IsClass && !type.IsAbstract && !type.IsInterface))) { int olIndex = 1; bool returnVoid = false; string functionName = type.Name + "_" + type.Name + (olIndex > 0 ? olIndex.ToString() : "") + "";// (cons.IsStatic ? "_S" : ""); sb.AppendFormat(fmt, functionName, BuildNormalFunctionCall(0, new ParameterInfo[0], type.Name, type.Name, false, returnVoid, null, true)); ccbn.constructors.Add(functionName); ccbn.constructorsCSParam.Add(GenListCSParam2(new ParameterInfo[0]).ToString()); }*/ // increase index if adding default constructor // int deltaIndex = 0; if (JSBindingSettings.NeedGenDefaultConstructor(type)) { // deltaIndex = 1; } for (int i = 0; i < constructors.Length; i++) { ConstructorInfo cons = constructors[i]; if (cons == null) { sb.AppendFormat("public static ConstructorID constructorID{0} = new ConstructorID({1});\n", i, "null, null"); // this is default constructor //bool returnVoid = false; //string functionName = type.Name + "_" + type.Name + "1"; int olIndex = i + 1; // for constuctors, they are always overloaded string functionName = JSNameMgr.HandleFunctionName(type.Name + "_" + type.Name + (olIndex > 0 ? olIndex.ToString() : "")); sb.AppendFormat(fmt, functionName, BuildNormalFunctionCall(0, new ParameterInfo[0], type.Name, false, null, true)); ccbn.constructors.Add(functionName); ccbn.constructorsCSParam.Add(GenListCSParam2(new ParameterInfo[0]).ToString()); } else { ParameterInfo[] paramS = cons.GetParameters(); int olIndex = i + 1; // for constuctors, they are always overloaded int methodTag = i/* + deltaIndex*/; for (int j = 0; j < paramS.Length; j++) { if (JSDataExchangeEditor.IsDelegateDerived(paramS[j].ParameterType)) { StringBuilder sbD = JSDataExchangeEditor.Build_DelegateFunction(type, cons, paramS[j].ParameterType, methodTag, j); sb.Append(sbD); } } // ConstructorID if (type.IsGenericTypeDefinition) { cg.args arg = new cg.args(); cg.args arg1 = new cg.args(); cg.args arg2 = new cg.args(); foreach (ParameterInfo p in cons.GetParameters()) { cg.args argFlag = ParameterInfo2TypeFlag(p); arg1.AddFormat("\"{0}\"", p.ParameterType.Name); arg2.Add(argFlag.Format(cg.args.ArgsFormat.Flag)); } if (arg1.Count > 0) arg.AddFormat("new string[]{0}", arg1.Format(cg.args.ArgsFormat.Brace)); else arg.Add("null"); if (arg2.Count > 0) arg.AddFormat("new TypeFlag[]{0}", arg2.Format(cg.args.ArgsFormat.Brace)); else arg.Add("null"); sb.AppendFormat("public static ConstructorID constructorID{0} = new ConstructorID({1});\n", i, arg.ToString()); } string functionName = JSNameMgr.HandleFunctionName(type.Name + "_" + type.Name + (olIndex > 0 ? olIndex.ToString() : "") + (cons.IsStatic ? "_S" : "")); sb.AppendFormat(fmt, functionName, BuildNormalFunctionCall(methodTag, paramS, cons.Name, cons.IsStatic, null, true, 0)); ccbn.constructors.Add(functionName); ccbn.constructorsCSParam.Add(GenListCSParam2(paramS).ToString()); } } return sb; }
public static StringBuilder BuildProperties(Type type, PropertyInfo[] properties, int[] propertiesIndex, ClassCallbackNames ccbn) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < properties.Length; i++) { var sbCall = new StringBuilder(); PropertyInfo property = properties[i]; MethodInfo[] accessors = property.GetAccessors(); bool isStatic = accessors[0].IsStatic; JSDataExchangeEditor.MemberFeature features = 0; if (isStatic) features |= JSDataExchangeEditor.MemberFeature.Static; bool bGenericT = type.IsGenericTypeDefinition; StringBuilder sbt = null; bool isDelegate = JSDataExchangeEditor.IsDelegateDerived(property.PropertyType); ;// (typeof(System.Delegate).IsAssignableFrom(property.PropertyType)); if (isDelegate) { sb.Append(JSDataExchangeEditor.Build_DelegateFunction(type, property, property.PropertyType, i, 0)); } // PropertyID if (bGenericT) { cg.args arg = new cg.args(); arg.AddFormat("\"{0}\"", property.Name); arg.AddFormat("\"{0}\"", property.PropertyType.Name); if (property.PropertyType.IsGenericParameter) { arg.Add("TypeFlag.IsT"); } else { arg.Add("TypeFlag.None"); } cg.args arg1 = new cg.args(); cg.args arg2 = new cg.args(); foreach (ParameterInfo p in property.GetIndexParameters()) { cg.args argFlag = ParameterInfo2TypeFlag(p); arg1.AddFormat("\"{0}\"", p.ParameterType.Name); arg2.Add(argFlag.Format(cg.args.ArgsFormat.Flag)); } if (arg1.Count > 0) arg.AddFormat("new string[]{0}", arg1.Format(cg.args.ArgsFormat.Brace)); else arg.Add("null"); if (arg2.Count > 0) arg.AddFormat("new TypeFlag[]{0}", arg2.Format(cg.args.ArgsFormat.Brace)); else arg.Add("null"); sb.AppendFormat("public static PropertyID propertyID{0} = new PropertyID({1});\n", i, arg.ToString()); } if (bGenericT) { sbt = new StringBuilder(); sbt.AppendFormat(" PropertyInfo member = GenericTypeCache.getProperty(vc.csObj.GetType(), propertyID{0}); \n", i); sbt.AppendFormat(" if (member == null) return;\n"); sbt.Append("\n"); } // // check to see if this is a indexer // ParameterInfo[] ps = property.GetIndexParameters(); bool bIndexer = (ps.Length > 0); if (bIndexer) features |= JSDataExchangeEditor.MemberFeature.Indexer; cg.args argActual = new cg.args(); JSDataExchangeEditor.ParamHandler[] paramHandlers = new JSDataExchangeEditor.ParamHandler[ps.Length]; for (int j = 0; j < ps.Length; j++) { paramHandlers[j] = JSDataExchangeEditor.Get_ParamHandler(ps[j].ParameterType, j, false, false); argActual.Add(paramHandlers[j].argName); } string functionName = type.Name + "_" + property.Name; if (bIndexer) { foreach (var p in ps) { functionName += "_" + p.ParameterType.Name; } } functionName = JSNameMgr.HandleFunctionName(functionName); sb.AppendFormat("static void {0}(JSVCall vc)\n[[\n", functionName); if (bGenericT) { sb.Append(sbt); } for (int j = 0; j < ps.Length; j++) { sb.Append(" " + paramHandlers[j].getter + "\n"); } bool bReadOnly = (!property.CanWrite || property.GetSetMethod() == null); sbCall.Append(JSDataExchangeEditor.BuildCallString(type, property, argActual.Format(cg.args.ArgsFormat.OnlyList), features | JSDataExchangeEditor.MemberFeature.Get)); if (!bReadOnly) { sb.Append(" if (vc.bGet)\n"); sb.Append(" [[ \n"); } //if (type.IsValueType && !field.IsStatic) // sb.AppendFormat("{0} argThis = ({0})vc.csObj;", type.Name); if (property.CanRead) { if (property.GetGetMethod() != null) { sb.Append(sbCall); sb.AppendFormat(" {0}\n", JSDataExchangeEditor.Get_Return(property.PropertyType, "result")); } else { Debug.Log(type.Name + "." + property.Name + " 'get' is ignored because it's not public."); } } if (!bReadOnly) { sb.Append(" ]]\n"); } // set if (!bReadOnly) { sb.Append(" else\n"); sb.Append(" [[ \n"); if (!isDelegate) { int ParamIndex = ps.Length; var paramHandler = JSDataExchangeEditor.Get_ParamHandler(property.PropertyType, ParamIndex, false, false); sb.Append(" " + paramHandler.getter + "\n"); sb.Append(JSDataExchangeEditor.BuildCallString(type, property, argActual.Format(cg.args.ArgsFormat.OnlyList), features | JSDataExchangeEditor.MemberFeature.Set, paramHandler.argName)); } else { var getDelegateFuncitonName = JSDataExchangeEditor.GetMethodArg_DelegateFuncionName(type, property.Name, i, 0); // sb.Append(JSDataExchangeEditor.BuildCallString(type, field, "" /* argList */, // features | JSDataExchangeEditor.MemberFeature.Set, getDelegateFuncitonName + "(vc.getJSFunctionValue())")); string getDelegate = JSDataExchangeEditor.Build_GetDelegate(getDelegateFuncitonName, property.PropertyType); sb.Append(JSDataExchangeEditor.BuildCallString(type, property, "" /* argList */, features | JSDataExchangeEditor.MemberFeature.Set, getDelegate)); } sb.Append(" ]]\n"); } sb.AppendFormat("]]\n"); ccbn.properties.Add(functionName); } return sb; }
public static StringBuilder BuildMethods(Type type, MethodInfo[] methods, int[] methodsIndex, int[] olInfo, ClassCallbackNames ccbn) { /* * methods * 0 function name * 1 list<CSParam> generation * 2 function call */ string fmt = @" static bool {0}(JSVCall vc, int argc) [[ {1} return true; ]] "; StringBuilder sb = new StringBuilder(); for (int i = 0; i < methods.Length; i++) { MethodInfo method = methods[i]; ParameterInfo[] paramS = method.GetParameters(); for (int j = 0; j < paramS.Length; j++) { // if (paramS[j].ParameterType == typeof(DaikonForge.Tween.TweenAssignmentCallback<Vector3>)) // { // Debug.Log("yes"); // //if (typeof(System.Delegate).IsAssignableFrom(paramS[j].ParameterType)) if (JSDataExchangeEditor.IsDelegateDerived(paramS[j].ParameterType)) { // StringBuilder sbD = JSDataExchangeEditor.BuildFunctionArg_DelegateFunction(type.Name, method.Name, paramS[j].ParameterType, i, j); StringBuilder sbD = JSDataExchangeEditor.Build_DelegateFunction(type, method, paramS[j].ParameterType, i, j); sb.Append(sbD); } } // MethodID if (type.IsGenericTypeDefinition || method.IsGenericMethodDefinition) { cg.args arg = new cg.args(); arg.AddFormat("\"{0}\"", method.Name); arg.AddFormat("\"{0}\"", method.ReturnType.Name); if (method.ReturnType.IsGenericParameter) { arg.Add("TypeFlag.IsT"); } else { arg.Add("TypeFlag.None"); } cg.args arg1 = new cg.args(); cg.args arg2 = new cg.args(); foreach (ParameterInfo p in method.GetParameters()) { // flag of a parameter cg.args argFlag = ParameterInfo2TypeFlag(p); arg1.AddFormat("\"{0}\"", p.ParameterType.Name); arg2.Add(argFlag.Format(cg.args.ArgsFormat.Flag)); } if (arg1.Count > 0) arg.AddFormat("new string[]{0}", arg1.Format(cg.args.ArgsFormat.Brace)); else arg.Add("null"); if (arg2.Count > 0) arg.AddFormat("new TypeFlag[]{0}", arg2.Format(cg.args.ArgsFormat.Brace)); else arg.Add("null"); sb.AppendFormat("public static MethodID methodID{0} = new MethodID({1});\n", i, arg.ToString()); } int olIndex = olInfo[i]; bool returnVoid = (method.ReturnType == typeof(void)); string functionName = type.Name + "_" + method.Name + (olIndex > 0 ? olIndex.ToString() : "") + (method.IsStatic ? "_S" : ""); int TCount = 0; if (method.IsGenericMethodDefinition) { TCount = method.GetGenericArguments().Length; } // if you change functionName // also have to change code in 'Manual/' folder functionName = JSNameMgr.HandleFunctionName(type.Name + "_" + SharpKitMethodName(method.Name, paramS, true, TCount)); if (method.IsSpecialName && method.Name == "op_Implicit" && paramS.Length > 0) { functionName += "_to_" + method.ReturnType.Name; } if (UnityEngineManual.isManual(functionName)) { sb.AppendFormat(fmt, functionName, " UnityEngineManual." + functionName + "(vc, argc);"); } else { sb.AppendFormat(fmt, functionName, method.IsSpecialName ? BuildSpecialFunctionCall(paramS, type.Name, method.Name, method.IsStatic, returnVoid, method.ReturnType) : BuildNormalFunctionCall(i, paramS, method.Name, method.IsStatic, method.ReturnType, false/* is constructor */, TCount)); } ccbn.methods.Add(functionName); ccbn.methodsCSParam.Add(GenListCSParam2(paramS).ToString()); } return sb; }