public static void PostGenerateCode(Behaviac.Design.MethodDef.Param param, StringWriter stream, string indent, string typename, string var, string caller, object parent, string setValue) { Behaviac.Design.ParInfo par = param.Value as Behaviac.Design.ParInfo; if (par != null) { ParInfoCsExporter.PostGenerateCode(par, null, stream, indent, typename, var, caller); return; } Behaviac.Design.VariableDef v = param.Value as Behaviac.Design.VariableDef; if (v != null) { VariableCsExporter.PostGenerateCode(v, stream, indent, typename, var, caller, parent, param.Name, setValue); return; } Type type = param.Value.GetType(); if (Plugin.IsCustomClassType(type) && !DesignerStruct.IsPureConstDatum(param.Value, parent, param.Name)) { StructCsExporter.PostGenerateCode(param.Value, stream, indent, var, parent, param.Name); } }
public static void PostGenerateCode(Behaviac.Design.VariableDef variable, StreamWriter stream, string indent, string typename, string var, string caller, object parent = null, string paramName = "", string setValue = null) { if (variable.ValueClass == Behaviac.Design.VariableDef.kConst) { Type type = variable.Value.GetType(); if (Plugin.IsCustomClassType(type) && !DesignerStruct.IsPureConstDatum(variable.Value, parent, paramName)) { StructCppExporter.PostGenerateCode(variable.Value, stream, indent, var, parent, paramName); } } else if (variable.Property != null) { PropertyCppExporter.PostGenerateCode(variable.Property, stream, indent, typename, var, caller, setValue); } }
public static void GenerateClassConstructor(DefaultObject defaultObj, Behaviac.Design.MethodDef method, StringWriter stream, string indent, string var) { for (int i = 0; i < method.Params.Count; ++i) { // const value if (!method.Params[i].IsProperty && !method.Params[i].IsLocalVar) { object obj = method.Params[i].Value; if (obj != null) { string param = var + "_p" + i; Type type = obj.GetType(); if (Plugin.IsArrayType(type)) { string nativeType = DataCppExporter.GetGeneratedNativeType(method.Params[i].NativeType); int startIndex = nativeType.IndexOf('<'); int endIndex = nativeType.LastIndexOf('>'); string itemType = nativeType.Substring(startIndex + 1, endIndex - startIndex - 1); ArrayCppExporter.GenerateCode(obj, defaultObj, stream, indent + "\t\t\t", itemType, param); } else if (Plugin.IsCustomClassType(type)) { if (Plugin.IsRefType(type)) { stream.WriteLine("{0}\t\t\t{1} = NULL;", indent, param); } else if (DesignerStruct.IsPureConstDatum(obj, method, method.Params[i].Name)) { StructCppExporter.GenerateCode(obj, defaultObj, stream, indent + "\t\t\t", param, null, ""); } } else { string nativeType = DataCppExporter.GetBasicGeneratedNativeType(method.Params[i].NativeType); string retStr = DataCppExporter.GenerateCode(obj, defaultObj, stream, string.Empty, nativeType, string.Empty, string.Empty); stream.WriteLine("{0}\t\t\t{1} = {2};", indent, param, retStr); } } } } }
public static string GenerateCode(Behaviac.Design.MethodDef method, StreamWriter stream, string indent, string typename, string var, string caller) { string allParamTypes = string.Empty; string allParams = string.Empty; for (int i = 0; i < method.Params.Count; ++i) { string nativeType = DataCppExporter.GetGeneratedNativeType(method.Params[i].NativeType); string basicNativeType = DataCppExporter.GetBasicGeneratedNativeType(nativeType); string param = (string.IsNullOrEmpty(var) ? caller : var) + "_p" + i; allParamTypes += ", " + nativeType; if (method.Params[i].IsProperty || method.Params[i].IsLocalVar) // property { if ((method.Params[i].Property != null && method.Params[i].Property.IsCustomized) || method.Params[i].IsLocalVar) { ParameterCppExporter.GenerateCode(method.Params[i], stream, indent, basicNativeType, param, caller); } else { if (method.IsPublic) { param = ParameterCppExporter.GenerateCode(method.Params[i], stream, indent, basicNativeType, "", param); } else { ParameterCppExporter.GenerateCode(method.Params[i], stream, indent, basicNativeType, param, caller); } } } else // const value { object obj = method.Params[i].Value; if (obj != null) { Type type = obj.GetType(); if (Plugin.IsCustomClassType(type) && !DesignerStruct.IsPureConstDatum(obj, method, method.Params[i].Name)) { StructCppExporter.GenerateCode(obj, stream, indent, param, method, method.Params[i].Name); } } } if (basicNativeType == "System::Object") { param = "*(System::Object*)&" + param; } if (i > 0) { allParams += ", "; } allParams += param; } string agentName = "pAgent"; if (method.Owner != Behaviac.Design.VariableDef.kSelf) { agentName = "pAgent_" + caller; stream.WriteLine("{0}Agent* {1} = Agent::GetInstance(pAgent, \"{2}\");", indent, agentName, method.Owner); stream.WriteLine("{0}BEHAVIAC_ASSERT({1});", indent, agentName); } string nativeReturnType = DataCppExporter.GetGeneratedNativeType(method.NativeReturnType); string retStr = ""; if (method.IsPublic) { if (method.IsStatic) { retStr = string.Format("{0}::{1}({2})", method.ClassName, method.BasicName, allParams); } else { retStr = string.Format("(({0}*){1})->{2}({3})", method.ClassName, agentName, method.BasicName, allParams); } } else { retStr = string.Format("(({0}*){1})->_Execute_Method_<{2}METHOD_TYPE_{3}, {4}{5} >({6})", method.ClassName, agentName, getNamespace(method.ClassName), method.Name.Replace("::", "_"), nativeReturnType, allParamTypes, allParams); } if (!string.IsNullOrEmpty(var)) { stream.WriteLine("{0}{1} {2} = {3};", indent, nativeReturnType, var, retStr); } return(retStr); }
public static string GenerateCode(DefaultObject defaultObj, Behaviac.Design.MethodDef method, StringWriter stream, string indent, string typename, string var, string caller) { string allParamTypes = string.Empty; string allParams = string.Empty; for (int i = 0; i < method.Params.Count; ++i) { string nativeType = DataCppExporter.GetGeneratedNativeType(method.Params[i].NativeType); string basicNativeType = DataCppExporter.GetBasicGeneratedNativeType(nativeType); string param = (string.IsNullOrEmpty(var) ? caller : var) + "_p" + i; allParamTypes += ", " + nativeType; if (method.Params[i].IsProperty || method.Params[i].IsLocalVar) // property { VariableDef v = method.Params[i].Value as VariableDef; if (v != null && v.ArrayIndexElement != null) { PropertyDef prop = method.Params[i].Property; if (prop != null && prop.IsArrayElement) { string property = PropertyCppExporter.GetProperty(defaultObj, prop, v.ArrayIndexElement, stream, indent, param, caller); string propName = prop.BasicName.Replace("[]", ""); ParameterCppExporter.GenerateCode(defaultObj, v.ArrayIndexElement, stream, indent, "int", param + "_index", param + caller); param = string.Format("({0})[{1}_index]", property, param); } } else { if ((method.Params[i].Property != null && method.Params[i].Property.IsCustomized) || method.Params[i].IsLocalVar) { ParameterCppExporter.GenerateCode(defaultObj, method.Params[i], stream, indent, basicNativeType, param, caller); } else { if (method.IsPublic) { param = ParameterCppExporter.GenerateCode(defaultObj, method.Params[i], stream, indent, basicNativeType, "", param); } else { ParameterCppExporter.GenerateCode(defaultObj, method.Params[i], stream, indent, basicNativeType, param, caller); } } } } else // const value { object obj = method.Params[i].Value; if (obj != null) { Type type = obj.GetType(); //if (Plugin.IsArrayType(type)) //{ // string nativeTypeStr = DataCppExporter.GetGeneratedNativeType(method.Params[i].NativeType); // int startIndex = nativeTypeStr.IndexOf('<'); // int endIndex = nativeTypeStr.LastIndexOf('>'); // string itemType = nativeTypeStr.Substring(startIndex + 1, endIndex - startIndex - 1); // ArrayCppExporter.GenerateCode(obj, stream, indent, itemType, param); //} //else if (Plugin.IsCustomClassType(type) && !DesignerStruct.IsPureConstDatum(obj, method, method.Params[i].Name)) { StructCppExporter.GenerateCode(obj, defaultObj, stream, indent, param, method, method.Params[i].Name); } } } if (basicNativeType == "System::Object") { param = "*(System::Object*)&" + param; } if (i > 0) { allParams += ", "; } allParams += param; } string agentName = "pAgent"; if (method.Owner != Behaviac.Design.VariableDef.kSelf) { agentName = "pAgent_" + caller; bool isGlobal = Plugin.IsInstanceName(method.Owner, null); PropertyDef ownerProperty = null; if (!isGlobal) { Debug.Check(defaultObj != null && defaultObj.Behavior != null && defaultObj.Behavior.AgentType != null); if (defaultObj != null && defaultObj.Behavior != null && defaultObj.Behavior.AgentType != null) { ownerProperty = defaultObj.Behavior.AgentType.GetPropertyByName(method.Owner); } } if (isGlobal || ownerProperty == null || ownerProperty.IsCustomized || ownerProperty.IsPar) // global or customized instance { stream.WriteLine("{0}Agent* {1} = Agent::GetInstance(pAgent, \"{2}\");", indent, agentName, method.Owner); } else // member instance { string propName = ownerProperty.Name.Replace("::", "_"); string nativeType = DataCppExporter.GetGeneratedNativeType(ownerProperty.NativeType); string prop = string.Format("(({0}*)pAgent)->_Get_Property_<{1}PROPERTY_TYPE_{2}, {3} >()", ownerProperty.ClassName, getNamespace(ownerProperty.ClassName), propName, nativeType); stream.WriteLine("{0}Agent* {1} = {2};", indent, agentName, prop); } stream.WriteLine("{0}BEHAVIAC_ASSERT({1});", indent, agentName); } string nativeReturnType = DataCppExporter.GetGeneratedNativeType(method.NativeReturnType); if (method.NativeReturnType.StartsWith("const ")) { nativeReturnType = "const " + nativeReturnType; } string retStr = ""; if (method.IsPublic) { if (method.IsStatic) { retStr = string.Format("{0}::{1}({2})", method.ClassName, method.BasicName, allParams); } else { retStr = string.Format("(({0}*){1})->{2}({3})", method.ClassName, agentName, method.BasicName, allParams); } } else { retStr = string.Format("(({0}*){1})->_Execute_Method_<{2}METHOD_TYPE_{3}, {4}{5} >({6})", method.ClassName, agentName, getNamespace(method.ClassName), method.Name.Replace("::", "_"), nativeReturnType, allParamTypes, allParams); } if (!string.IsNullOrEmpty(var)) { stream.WriteLine("{0}{1} {2} = {3};", indent, nativeReturnType, var, retStr); } return(retStr); }
public static string GenerateCode(Behaviac.Design.MethodDef method, StreamWriter stream, string indent, string typename, string var, string caller) { string allParamTypes = string.Empty; string allParams = string.Empty; for (int i = 0; i < method.Params.Count; ++i) { string nativeType = DataCppExporter.GetGeneratedNativeType(method.Params[i].NativeType); bool isPointRefType = nativeType.EndsWith("*&"); string basicNativeType = DataCppExporter.GetBasicGeneratedNativeType(nativeType); string param = (string.IsNullOrEmpty(var) ? caller : var) + "_p" + i; string paramBasicType = basicNativeType; if (!isPointRefType && DataCppExporter.IsPtr(paramBasicType)) { paramBasicType = paramBasicType.Replace("*", ""); paramBasicType = paramBasicType.Trim(); } allParamTypes += ", " + paramBasicType; if (method.Params[i].IsProperty) // property { param = ParameterCppExporter.GenerateCode(method.Params[i], stream, indent, basicNativeType, string.Empty, param); if (!isPointRefType && DataCppExporter.IsPtr(basicNativeType)) { param = "*" + param; } } else { if (method.Params[i].IsPar) // par { ParameterCppExporter.GenerateCode(method.Params[i], stream, indent, basicNativeType, param, caller); if (!isPointRefType && DataCppExporter.IsPtr(basicNativeType)) { param = "*" + param; } } else // const value { object obj = method.Params[i].Value; if (obj != null) { Type type = obj.GetType(); if (Plugin.IsCustomClassType(type) && !DesignerStruct.IsPureConstDatum(obj, method, method.Params[i].Name)) { StructCppExporter.GenerateCode(obj, stream, indent, param, method, method.Params[i].Name); } } if (!isPointRefType && DataCppExporter.IsAgentPtr(basicNativeType)) { param = "*" + param; } } } if (i > 0) { allParams += ", "; } allParams += param; } string agentName = "pAgent"; if (method.Owner != Behaviac.Design.VariableDef.kSelf) { agentName = "pAgent_" + caller; stream.WriteLine("{0}Agent* {1} = Agent::GetInstance(\"{2}\", pAgent->GetContextId());", indent, agentName, method.Owner); stream.WriteLine("{0}BEHAVIAC_ASSERT({1});", indent, agentName); } //string retStr = string.Format("(({0}*){1})->{2}({3})", method.ClassName, agentName, method.Name, allParams); string nativeReturnType = DataCppExporter.GetGeneratedNativeType(method.NativeReturnType); string retStr = string.Format("(({0}*){1})->_Execute_Method_<{2}METHOD_TYPE_{3}, {4}{5} >({6})", method.ClassName, agentName, getNamespace(method.ClassName), method.Name.Replace("::", "_"), nativeReturnType, allParamTypes, allParams); if (!string.IsNullOrEmpty(var)) { stream.WriteLine("{0}{1} {2} = {3};", indent, nativeReturnType, var, retStr); } return(retStr); }
public static void GenerateClassConstructor(Behaviac.Design.MethodDef method, StreamWriter stream, string indent, string var) { Debug.Check(!string.IsNullOrEmpty(var)); if (method.Params.Count == 0) { return; } string paramsName = getParamsName(var, ""); if (!method.IsPublic) { stream.WriteLine("{0}\t\t\t{1} = new object[{2}];", indent, paramsName, method.Params.Count); } for (int i = 0; i < method.Params.Count; ++i) { // const value if (!method.Params[i].IsProperty && !method.Params[i].IsPar) { object obj = method.Params[i].Value; if (obj != null) { string param = getParamName(var, "", i); string paramName = string.Format("{0}[{1}]", paramsName, i); Type type = obj.GetType(); if (Plugin.IsArrayType(type)) { string typename = DataCsExporter.GetGeneratedNativeType(method.Params[i].NativeType); int startIndex = typename.IndexOf('<'); int endIndex = typename.LastIndexOf('>'); string itemType = typename.Substring(startIndex + 1, endIndex - startIndex - 1); ArrayCsExporter.GenerateCode(obj, stream, indent + "\t\t\t", itemType, param); if (!method.IsPublic) { stream.WriteLine("{0}\t\t\t{1} = {2};", indent, paramName, param); } } else if (Plugin.IsCustomClassType(type)) { if (DesignerStruct.IsPureConstDatum(obj, method, method.Params[i].Name)) { if (obj is Behaviac.Design.Agent) { stream.WriteLine("{0}\t\t\t{1} = null;", indent, param); } StructCsExporter.GenerateCode(obj, stream, indent + "\t\t\t", param, null, ""); if (!method.IsPublic) { stream.WriteLine("{0}\t\t\t{1} = {2};", indent, paramName, param); } } } else { string retStr = DataCsExporter.GenerateCode(obj, stream, string.Empty, method.Params[i].NativeType, string.Empty, string.Empty); if (!method.IsPublic) { param = paramName; } stream.WriteLine("{0}\t\t\t{1} = {2};", indent, param, retStr); } } } } }
public static string GenerateCode(Behaviac.Design.MethodDef method, StreamWriter stream, string indent, string typename, string var, string caller) { Debug.Check(!string.IsNullOrEmpty(var) || !string.IsNullOrEmpty(caller)); string allParams = string.Empty; string paramsName = (method.Params.Count == 0) ? "null" : getParamsName(var, caller); for (int i = 0; i < method.Params.Count; ++i) { string nativeType = DataCsExporter.GetGeneratedNativeType(method.Params[i].NativeType); string param = string.Empty; if (method.IsPublic) { param = getParamName(var, caller, i); } else { param = string.Format("{0}[{1}]", paramsName, i); } if (method.Params[i].IsProperty) // property { if (method.IsPublic) { param = ParameterCsExporter.GenerateCode(method.Params[i], stream, indent, nativeType, "", param); } else { ParameterCsExporter.GenerateCode(method.Params[i], stream, indent, "", param, caller); } } else { if (method.Params[i].IsPar) // par { ParameterCsExporter.GenerateCode(method.Params[i], stream, indent, method.IsPublic ? nativeType : "", param, caller); } else // const value { object obj = method.Params[i].Value; if (obj != null) { Type type = obj.GetType(); if (Plugin.IsCustomClassType(type) && !DesignerStruct.IsPureConstDatum(obj, method, method.Params[i].Name)) { string paramName = getParamName(var, caller, i); StructCsExporter.GenerateCode(obj, stream, indent, paramName, method, method.Params[i].Name); if (!method.IsPublic) { stream.WriteLine("{0}{1} = {2};", indent, param, paramName); } } } } } if (i > 0) { allParams += ", "; } //if (method.Params[i].NativeType.EndsWith("&")) if (method.Params[i].NativeType.IndexOf("&") >= 0) { param = "ref " + param; } allParams += param; } string agentName = "pAgent"; if (method.Owner != Behaviac.Design.VariableDef.kSelf && (!method.IsPublic || !method.IsStatic)) { agentName = "pAgent_" + caller; stream.WriteLine("{0}behaviac.Agent {1} = behaviac.Agent.GetInstance(\"{2}\", pAgent.GetContextId());", indent, agentName, method.Owner.Replace("::", ".")); stream.WriteLine("{0}Debug.Check({1} != null);", indent, agentName); } string retStr = string.Empty; if (method.IsPublic) { string className = method.ClassName.Replace("::", "."); if (method.IsStatic) { retStr = string.Format("{0}.{1}({2})", className, method.BasicName, allParams); } else { retStr = string.Format("(({0}){1}).{2}({3})", className, agentName, method.BasicName, allParams); } } else { retStr = string.Format("AgentExtra_Generated.ExecuteMethod({0}, \"{1}\", {2})", agentName, method.BasicName, paramsName); } if (!string.IsNullOrEmpty(var)) { string nativeReturnType = DataCsExporter.GetGeneratedNativeType(method.NativeReturnType); string typeConvertStr = (nativeReturnType == "void") ? string.Empty : "(" + nativeReturnType + ")"; stream.WriteLine("{0}{1} {2} = {3}{4};", indent, nativeReturnType, var, typeConvertStr, retStr); } return(retStr); }
public static string GenerateCode(DefaultObject defaultObj, Behaviac.Design.MethodDef method, StreamWriter stream, string indent, string typename, string var, string caller) { Debug.Check(!string.IsNullOrEmpty(var) || !string.IsNullOrEmpty(caller)); string allParams = string.Empty; string paramsName = getParamsName(var, caller); for (int i = 0; i < method.Params.Count; ++i) { string nativeType = DataCsExporter.GetGeneratedNativeType(method.Params[i].NativeType); string param = string.Empty; if (method.IsPublic) { param = getParamName(var, caller, i); } else { param = string.Format("{0}[{1}]", paramsName, i); } if (method.Params[i].IsProperty || method.Params[i].IsLocalVar) // property { if ((method.Params[i].Property != null && method.Params[i].Property.IsCustomized) || method.Params[i].IsLocalVar) { ParameterCsExporter.GenerateCode(defaultObj, method.Params[i], stream, indent, method.IsPublic ? nativeType : "", param, caller); } else { if (method.IsPublic) { param = ParameterCsExporter.GenerateCode(defaultObj, method.Params[i], stream, indent, nativeType, "", param); } else { ParameterCsExporter.GenerateCode(defaultObj, method.Params[i], stream, indent, "", param, caller); } } VariableDef v = method.Params[i].Value as VariableDef; if (v != null && v.ArrayIndexElement != null) { PropertyDef prop = method.Params[i].Property; if (prop != null && prop.IsArrayElement) { ParameterCsExporter.GenerateCode(defaultObj, v.ArrayIndexElement, stream, indent, "int", param + "_index", param + caller); if (string.IsNullOrEmpty(param)) { string property = PropertyCsExporter.GetProperty(defaultObj, prop, v.ArrayIndexElement, stream, indent, param, caller); param = string.Format("({0})[{1}_index]", property, param); } else { param = string.Format("{0}[{0}_index]", param); } } } } else // const value { object obj = method.Params[i].Value; if (obj != null) { Type type = obj.GetType(); if (Plugin.IsCustomClassType(type) && !DesignerStruct.IsPureConstDatum(obj, method, method.Params[i].Name)) { string paramName = getParamName(var, caller, i); string paramType = DataCsExporter.GetGeneratedNativeType(method.Params[i].NativeType); StructCsExporter.GenerateCode(obj, defaultObj, stream, indent, paramName, paramType, method, method.Params[i].Name); if (!method.IsPublic) { stream.WriteLine("{0}{1} = {2};", indent, param, paramName); } } } } if (i > 0) { allParams += ", "; } if (method.Params[i].IsRef) { param = "ref " + param; } else if (method.Params[i].IsOut) { param = "out " + param; } allParams += param; } string agentName = "pAgent"; if (method.Owner != Behaviac.Design.VariableDef.kSelf && (!method.IsPublic || !method.IsStatic)) { string instanceName = method.Owner.Replace("::", "."); agentName = "pAgent_" + caller; bool isGlobal = Plugin.IsInstanceName(instanceName, null); PropertyDef ownerProperty = null; if (!isGlobal) { Debug.Check(defaultObj != null && defaultObj.Behavior != null && defaultObj.Behavior.AgentType != null); ownerProperty = defaultObj.Behavior.AgentType.GetPropertyByName(instanceName); } if (isGlobal || ownerProperty == null || ownerProperty.IsCustomized) // global or customized instance { stream.WriteLine("{0}behaviac.Agent {1} = behaviac.Utils.GetParentAgent(pAgent, \"{2}\");", indent, agentName, instanceName); } else // member instance { string prop = ""; if (ownerProperty.IsPublic) { string className = ownerProperty.ClassName.Replace("::", "."); if (ownerProperty.IsStatic) { prop = string.Format("{0}.{1}", className, instanceName); } else { prop = string.Format("(({0})pAgent).{1}", className, instanceName); } } else { string nativeType = DataCsExporter.GetGeneratedNativeType(ownerProperty.NativeType); prop = string.Format("({0})AgentMetaVisitor.GetProperty(pAgent, \"{1}\")", nativeType, instanceName); } stream.WriteLine("{0}behaviac.Agent {1} = {2};", indent, agentName, prop); } stream.WriteLine("{0}Debug.Check({1} != null || Utils.IsStaticClass(\"{2}\"));", indent, agentName, instanceName); } string retStr = string.Empty; if (method.IsPublic) { string className = method.ClassName.Replace("::", "."); if (method.IsStatic) { retStr = string.Format("{0}.{1}({2})", className, method.BasicName, allParams); } else { retStr = string.Format("(({0}){1}).{2}({3})", className, agentName, method.BasicName, allParams); } } else { retStr = string.Format("AgentMetaVisitor.ExecuteMethod({0}, \"{1}\", {2})", agentName, method.BasicName, paramsName); } if (!string.IsNullOrEmpty(var)) { string nativeReturnType = DataCsExporter.GetGeneratedNativeType(method.NativeReturnType); string typeConvertStr = (nativeReturnType == "void") ? string.Empty : "(" + nativeReturnType + ")"; stream.WriteLine("{0}{1} {2} = {3}{4};", indent, nativeReturnType, var, typeConvertStr, retStr); } return(retStr); }