Пример #1
0
        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);
        }
Пример #2
0
        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);;
        }