public static bool ParseFieldType(IDLMeta meta, string typename, IDLType fieldtype, bool undefinedasclass = false) { fieldtype.type_name = typename; switch (typename) { case "int": { fieldtype.type = eIDLType.INT; return(true); } case "float": { fieldtype.type = eIDLType.FLOAT; return(true); } case "string": { fieldtype.type = eIDLType.STRING; return(true); } case "bool": { fieldtype.type = eIDLType.BOOL; return(true); } default: break; } Match m = Regex.Match(typename, @"List<(\w+)>"); if (m.Success) { fieldtype.type = eIDLType.LIST; fieldtype.inner_type = new IDLType[1] { new IDLType() }; string inner_name = m.Groups[1].Value; if (!ParseFieldType(meta, inner_name, fieldtype.inner_type[0], undefinedasclass)) { return(false); } return(true); } m = Regex.Match(typename, @"Dict<(\w+),(\w+)>"); if (m.Success) { fieldtype.type = eIDLType.DICT; fieldtype.inner_type = new IDLType[2] { new IDLType(), new IDLType() }; string key_name = m.Groups[1].Value; if (!ParseFieldType(meta, key_name, fieldtype.inner_type[0])) { return(false); } string value_name = m.Groups[2].Value; if (!ParseFieldType(meta, value_name, fieldtype.inner_type[1], undefinedasclass)) { return(false); } return(true); } if (FindUsingClass(meta, typename) != null) { fieldtype.type = eIDLType.CLASS; return(true); } if (FindUsingEnum(meta, typename) != null) { fieldtype.type = eIDLType.ENUM; return(true); } if (undefinedasclass) { fieldtype.type = eIDLType.CLASS; return(true); } Console.WriteLine("解析类型名称错误,未能识别{0}", typename); return(false); }
public string GetFieldTypeName(IDLType t, CodeLanguage lang) { switch (t.type) { case eIDLType.INT: return("int"); case eIDLType.FLOAT: return("float"); case eIDLType.BOOL: return("bool"); case eIDLType.ENUM: return("int"); case eIDLType.STRING when lang == CodeLanguage.CPP: return("std::string"); case eIDLType.LIST when lang == CodeLanguage.CPP: return("std::vector<" + GetFieldTypeName(t.inner_type[0], lang) + ">"); case eIDLType.DICT when lang == CodeLanguage.CPP: return("std::map<" + GetFieldTypeName(t.inner_type[0], lang) + "," + GetFieldTypeName(t.inner_type[1], lang) + ">"); case eIDLType.STRING when lang == CodeLanguage.CS: return("string"); case eIDLType.LIST when lang == CodeLanguage.CS: return("List<" + GetFieldTypeName(t.inner_type[0], lang) + ">"); case eIDLType.DICT when lang == CodeLanguage.CS: return("H3DDictionary<" + GetFieldTypeName(t.inner_type[0], lang) + "," + GetFieldTypeName(t.inner_type[1], lang) + ">"); case eIDLType.STRING when lang == CodeLanguage.LUA: return("string"); case eIDLType.LIST when lang == CodeLanguage.LUA: return("list<" + GetFieldTypeName(t.inner_type[0], lang) + ">"); case eIDLType.DICT when lang == CodeLanguage.LUA: return("map<" + GetFieldTypeName(t.inner_type[0], lang) + "," + GetFieldTypeName(t.inner_type[1], lang) + ">"); case eIDLType.CLASS when lang == CodeLanguage.LUA: { if (t.type_name == "TPersistID") { return("int64"); } if (t.type_name == "time_t") { return("int64"); } return(t.type_name); } case eIDLType.CLASS when lang == CodeLanguage.CS: { if (t.type_name == "TPersistID") { return("long"); } if (t.type_name == "time_t") { return("long"); } return(t.type_name); } case eIDLType.CLASS when lang == CodeLanguage.CPP: return(t.type_name); } return(null);; }