コード例 #1
0
    // can handle all methods
    public static StringBuilder BuildMethods(Type type, MethodInfo[] methods, int slot, List <string> lstNames)
    {
        string fmt       = @"
/* {6} */
_jstype.definition.{1} = function({2}) [[ 
    {9}
    return CS.Call({7}, {3}, {4}, false, {8}{5}); 
]]";
        string fmtStatic = @"
/* static {6} {8} */
_jstype.staticDefinition.{1} = function({2}) [[ 
    {9}
    return CS.Call({7}, {3}, {4}, true{5}); 
]]";

        //bool bIsSystemObject = (type == typeof(System.Object));

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < methods.Length; i++)
        {
            MethodInfo method = methods[i];

            bool bOverloaded = ((i > 0 && method.Name == methods[i - 1].Name) ||
                                (i < methods.Length - 1 && method.Name == methods[i + 1].Name));

            if (!bOverloaded)
            {
                if (GeneratorHelp.MethodIsOverloaded(type, method.Name))
                {
                    bOverloaded = true;
                    //Debug.Log("$$$ " + type.Name + "." + method.Name + (method.IsStatic ? " true" : " false"));
                }
            }

            StringBuilder   sbFormalParam = new StringBuilder();
            StringBuilder   sbActualParam = new StringBuilder();
            ParameterInfo[] paramS        = method.GetParameters();
            StringBuilder   sbInitT       = new StringBuilder();
            int             TCount        = 0;

            // add T to formal param
            if (method.IsGenericMethodDefinition)
            {
                TCount = method.GetGenericArguments().Length;
                for (int j = 0; j < TCount; j++)
                {
                    sbFormalParam.AppendFormat("t{0}", j);
                    if (j < TCount - 1 || paramS.Length > 0)
                    {
                        sbFormalParam.Append(", ");
                    }


                    sbInitT.AppendFormat("    var native_t{0} = t{0}.getNativeType();\n", j);
                    sbActualParam.AppendFormat(", native_t{0}", j);
                }
            }

            int L = paramS.Length;
            for (int j = 0; j < L; j++)
            {
                sbFormalParam.AppendFormat("a{0}/*{1}*/{2}", j, paramS[j].ParameterType.Name, (j == L - 1 ? "" : ", "));

                ParameterInfo par = paramS[j];
                if (par.ParameterType.IsArray && par.GetCustomAttributes(typeof(ParamArrayAttribute), false).Length > 0)
                {
                    sbActualParam.AppendFormat(", jsb_formatParamsArray({0}, a{0}, arguments)", j);
                }
                else
                {
                    sbActualParam.AppendFormat(", a{0}", j);
                }
            }

            //int TCount = method.GetGenericArguments().Length;

            string methodName = method.Name;
//            if (methodName == "ToString") { methodName = "toString"; }

            string mName = SharpKitMethodName(methodName, paramS, bOverloaded, TCount);
            lstNames.Add((method.IsStatic ? "Static_" : "") + mName);

            if (!method.IsStatic)
            {
                sb.AppendFormat(fmt,
                                className,
                                mName,                    // [1] method name
                                sbFormalParam.ToString(), // [2] formal param
                                slot,                     // [3] slot
                                i,                        // [4] index
                                sbActualParam,            // [5] actual param
                                method.ReturnType.Name,   // [6] return type name
                                (int)JSVCall.Oper.METHOD, // [7] OP
                                "this",                   // [8] this
                                sbInitT                   //[9] generic types init
                                );
            }
            else
            {
                sb.AppendFormat(fmtStatic,
                                className,
                                mName,
                                sbFormalParam.ToString(),
                                slot,
                                i,
                                sbActualParam,
                                method.ReturnType.Name,
                                (int)JSVCall.Oper.METHOD,
                                "",
                                sbInitT);
            }
        }
        return(sb);
    }
コード例 #2
0
ファイル: JSGenerator.cs プロジェクト: midgithub/FishBattle
    public static void BuildMethods(Type type, MethodInfo[] methods, int slot,
                                    StringBuilder sbDefinition, StringBuilder sbStaticDefinition, List <string> memberNames)
    {
        for (int index = 0; index < methods.Length; index++)
        {
            var    method     = methods[index];
            string methodName = method.Name;
            if (methodName == "ToString")
            {
                methodName = "toString";
            }

            bool isStatic   = method.IsStatic;
            bool overloaded = (index > 0 && method.Name == methods[index - 1].Name) ||
                              (index < methods.Length - 1 && method.Name == methods[index + 1].Name);
            if (!overloaded)
            {
                if (GeneratorHelp.MethodIsOverloaded(type, method))
                {
                    overloaded = true;
                    //Debug.Log("$$$ " + type.Name + "." + method.Name + (method.IsStatic ? " true" : " false"));
                }
            }

            var sbFormalParam      = new StringBuilder();
            var sbActualParam      = new StringBuilder();
            var paramS             = method.GetParameters();
            var sbInitGenericParam = new StringBuilder();

            // add T to formal param
            int genericArgsCount = 0; //包含泛型参数个数
            if (method.IsGenericMethodDefinition)
            {
                genericArgsCount = method.GetGenericArguments().Length;
                for (int j = 0; j < genericArgsCount; j++)
                {
                    sbFormalParam.AppendFormat("t{0}", j);
                    if (j < genericArgsCount - 1 || paramS.Length > 0)
                    {
                        sbFormalParam.Append(", ");
                    }


                    sbInitGenericParam.AppendFormat("\n            var native_t{0} = t{0}.getNativeType();", j);
                    sbActualParam.AppendFormat(", native_t{0}", j);
                }
            }

            string jsMethodName = GetOverloadedMethodSuffix(methodName, paramS, overloaded, genericArgsCount);
            memberNames.Add((isStatic ? "Static_" : "") + jsMethodName);

            //判断该方法是否有定义CsExportedMethodAttribute属性
            CsExportedMethodAttribute csExportedAttr = null;
            if (method.IsDefined(typeof(CsExportedMethodAttribute), false))
            {
                var attributes = method.GetCustomAttributes(typeof(CsExportedMethodAttribute), false);
                csExportedAttr = attributes[0] as CsExportedMethodAttribute;
            }
            if (CsExportedMethodDic != null && CsExportedMethodDic.ContainsKey(type))
            {
                CsExportedMethodDic[type].TryGetValue(method.Name, out csExportedAttr);
            }
            if (csExportedAttr != null)
            {
                string jsCode = csExportedAttr.JsCode;
                if (isStatic)
                {
                    sbStaticDefinition.Append(jsCode);
                }
                else
                {
                    sbDefinition.Append(jsCode);
                }
                continue;
            }

            int paramLength = paramS.Length;
            for (int j = 0; j < paramLength; j++)
            {
                sbFormalParam.AppendFormat("a{0}/*{1}*/{2}", j, paramS[j].ParameterType.Name,
                                           j == paramLength - 1 ? "" : ", ");

                var par = paramS[j];
                if (par.ParameterType.IsArray && par.GetCustomAttributes(typeof(ParamArrayAttribute), false).Length > 0)
                {
                    sbActualParam.AppendFormat(", jsb_formatParamsArray({0}, a{0}, arguments)", j);
                }
                else if (par.ParameterType.IsArray && par.ParameterType.GetElementType() == typeof(Type))
                {
                    //如果是System.Type类型数组参数,通过转换获取其类型全名数组
                    sbActualParam.AppendFormat(", jsb_convertTypeParamsArray(a{0})", j);
                }
                else if (par.ParameterType == typeof(Type))
                {
                    //如果是System.Type类型参数需要传递其FullName回来
                    //在C#层通过JSDataExchangeMgr.GetTypeByName获取其类型对象
                    sbActualParam.AppendFormat(", a{0} != null ? a{0}.get_FullName() : null", j);
                }
                else if (par.ParameterType == typeof(Exception))
                {
                    sbActualParam.AppendFormat(", Error.getException(a{0})", j);
                }
                else
                {
                    sbActualParam.AppendFormat(", a{0}", j);
                }
            }

            if (isStatic)
            {
                sbStaticDefinition.AppendFormat(@"
        {0}: function({1}) [[ {2}
            return CS.Call({3}, {4}, {5}, true{6}); //Ret: {7}
        ]],",
                                                jsMethodName,
                                                sbFormalParam,
                                                sbInitGenericParam,
                                                (int)JSVCall.Oper.METHOD,
                                                slot,
                                                index,
                                                sbActualParam,
                                                method.ReturnType.Name);
            }
            else
            {
                sbDefinition.AppendFormat(@"
        {0}: function({1}) [[ {2}
            return CS.Call({3}, {4}, {5}, false, this{6}); //Ret: {7}
        ]],",
                                          jsMethodName,
                                          sbFormalParam,
                                          sbInitGenericParam,
                                          (int)JSVCall.Oper.METHOD,
                                          slot,
                                          index,
                                          sbActualParam,
                                          method.ReturnType.Name);
            }
        }
    }