internal static string Print(WrapperGenPackage genPkg) { var codeGen = new CodePrinter(); codeGen.PrintLine("// Generated by github.com/davyxu/PhotonSharp"); codeGen.PrintLine("// DO NOT EDIT!!"); codeGen.PrintLine("using Photon;"); codeGen.PrintLine("using System;"); codeGen.PrintLine(); codeGen.PrintLine("namespace ", genPkg.Name); codeGen.PrintLine("{"); codeGen.In(); foreach (var cls in genPkg.Classes) { codeGen.PrintLine("[NativeWrapperClass(typeof(", cls.FullName, "))]"); codeGen.PrintLine("public class ", cls.Name, "Wrapper"); codeGen.PrintLine("{"); codeGen.In(); foreach (var prop in cls.Properties) { GenProperty(codeGen, prop, cls); codeGen.PrintLine(); } foreach (var method in cls.Methods) { GenStaticOrMethod(codeGen, method, cls); codeGen.PrintLine(); } codeGen.Out(); codeGen.PrintLine("}"); } codeGen.Out(); codeGen.PrintLine("}"); return(codeGen.ToString()); }
static void GenProperty(CodePrinter codeGen, WrapperGenProperty prop, WrapperGenClass cls) { codeGen.PrintLine("[NativeEntry(NativeEntryType.Property)]"); codeGen.PrintLine("public static void ", prop.Name, "(object phoIns, ref object value, bool isGet )"); codeGen.PrintLine("{"); codeGen.In(); codeGen.PrintLine("var phoClassIns = phoIns as ", cls.Name, ";"); codeGen.PrintLine(); if (prop.CanRead) { codeGen.PrintLine("if (isGet)"); codeGen.PrintLine("{"); codeGen.In(); codeGen.PrintLine("value = Convertor.", prop.TypeString, "ToValue(phoClassIns.", prop.Name, ");"); codeGen.Out(); codeGen.PrintLine("}"); } if (prop.CanWrite) { if (prop.CanRead) { codeGen.PrintLine("else"); } codeGen.PrintLine("{"); codeGen.In(); codeGen.PrintLine("phoClassIns.", prop.Name, " = Convertor.ValueTo", prop.TypeString, "(value);"); codeGen.Out(); codeGen.PrintLine("}"); } codeGen.Out(); codeGen.PrintLine("}"); }
static void GenStaticOrMethod(CodePrinter codeGen, WrapperGenFunc func, WrapperGenClass cls) { if (func.Mode == WrapperFuncMode.ClassMethod) { codeGen.PrintLine("[NativeEntry(NativeEntryType.ClassMethod)]"); } else { codeGen.PrintLine("[NativeEntry(NativeEntryType.StaticFunc)]"); } codeGen.PrintLine("public static int ", func.Name, "( VMachine phoVM )"); codeGen.PrintLine("{"); codeGen.In(); if (func.Mode == WrapperFuncMode.ClassMethod) { codeGen.PrintLine("var phoClassIns = phoVM.DataStack.GetNativeInstance<", cls.FullName, ">(0);"); codeGen.PrintLine(); } // 获取输入参数 int argIndex = 1; foreach (var pm in func.InputParameters) { codeGen.PrintLine("var ", pm.Name, " = phoVM.DataStack.Get", pm.TypeString, "(", argIndex, ");"); argIndex++; } if (argIndex > 1) { codeGen.PrintLine(); } // 声明输出参数 argIndex = 1; foreach (var pm in func.OutputParameters) { codeGen.PrintLine(pm.NativeTypeString, " ", pm.Name, " = default(", pm.NativeTypeString, ");"); argIndex++; } // 调用本体函数 codeGen.BeginLine(); if (func.RetParameter.NativeTypeString != "Nil" && func.RetParameter.NativeTypeString != "Void") { codeGen.Print("var phoRetArg = "); } if (func.Mode == WrapperFuncMode.ClassMethod) { codeGen.Print("phoClassIns.", func.Name, "( "); } else { codeGen.Print(cls.FullName, ".", func.Name, "( "); } // 传入输入参数 argIndex = 1; foreach (var pm in func.InputParameters) { if (argIndex > 1) { codeGen.Print(", "); } codeGen.Print(pm.Name); argIndex++; } // 传入输出参数 foreach (var pm in func.OutputParameters) { if (argIndex > 1) { codeGen.Print(", "); } codeGen.Print("out ", pm.Name); argIndex++; } codeGen.Print(" );\n"); codeGen.EndLine(); // 栈推入输出参数 foreach (var pm in func.OutputParameters) { codeGen.PrintLine("phoVM.DataStack.Push", pm.TypeString, "( ", pm.Name, " );"); argIndex++; } int totalRet = func.OutputParameters.Count; // 栈推入返回参数 if (func.RetParameter.TypeString != "Nil") { codeGen.PrintLine("phoVM.DataStack.Push", func.RetParameter.TypeString, "( phoRetArg );"); totalRet++; } // 返回返回值数量 codeGen.PrintLine(); codeGen.PrintLine("return ", totalRet, ";"); codeGen.Out(); codeGen.PrintLine("}"); }