Example #1
0
 public void AddAttribute(ObjectInfo objTemp)
 {
     if (!string.IsNullOrEmpty(objTemp.Code))
     {
         AttributeInfo attr = new AttributeInfo();
         attr.Store(objTemp);
         this.Attributes.Add(attr);
     }
 }
Example #2
0
        public void AddMethord(ObjectInfo objTemp, List<ObjectInfo> paramList)
        {
            MethordInfo mi = new MethordInfo();

            mi.Store(objTemp);
            if (paramList.Count > 0)
            {
                if (mi.Parameters == null) mi.Parameters = new List<ObjectInfo>();
                mi.Parameters.AddRange(paramList);
            }
            if (string.IsNullOrEmpty(mi.Code) && mi.Type == this.Code)
            {
                // 构造函数
                mi.Code = mi.Name = mi.Type;
                mi.Type = "";
            }
            this.Methords.Add(mi);
        }
Example #3
0
 private void AddParameter(Operation aMethod, ObjectInfo aParam, PdOOM.BasePackage aPckg)
 {
     Parameter aPrm = (Parameter)aMethod.CreateObject(0x1811206d, "", -1, true);
     string str = "I";    // aParam.IsOut ? "O" : "I";
     ////Type parameterType = aParam.Type;
     ////if (parameterType.IsGenericType && !parameterType.IsGenericTypeDefinition)
     ////{
     ////    parameterType = parameterType.GetGenericTypeDefinition();
     ////}
     ////if (parameterType.IsByRef)
     ////{
     ////    if (str == "I")
     ////    {
     ////        str = "IO";
     ////    }
     ////    parameterType = parameterType.GetElementType();
     ////}
     ////if (parameterType.IsArray)
     ////{
     ////    aPrm.Array = true;
     ////    parameterType = parameterType.GetElementType();
     ////}
     ////this.ProcessType(parameterType, false);
     ////TypeMapping aType = TypeMapping.Retrieve(aParam.Type);
     ////if (aType.HasClassifier())
     ////{
     ////    PdOOM.BaseObject obj2 = ProperRef.Link(NamespaceMapping.Retrieve(aPckg), aParam.Type);
     ////    aPrm.UseQualifiedDataType = false;
     ////    aPrm.DataTypeObject = obj2;
     ////}
     ////else
     {
         aPrm.DataType = aParam.Name;
     }
     aPrm.ParameterType = str;
     aPrm.Name = aPrm.Code = aParam.Name;
     CustomHandlerParam param = new CustomHandlerParam(aParam, aPrm);
     param.Convert();
     if (param.Params)
     {
         aPrm.SetExtendedAttribute("C#.params", "true");
     }
 }
Example #4
0
        private void ProcessAType(ref TypeInfo ti, ref string sModifier, string[] list, bool bIsValueType)
        {
            string word = NextTokenText(list);
            ti = new TypeInfo();
            ti.Name = ti.Code = word;
            word = NextTokenText(list);
            string wordNext = GetTokenText(list, tokenCurrent);


            if (word == ";")
            {
                ti.IsClass = false;
                return;
            }
            ti.IsClass = true;

            ObjectInfo obj = null, objTemp = new ObjectInfo(), paramObj = new ObjectInfo();
            MethordInfo mi = null;
            List<ObjectInfo> paramList = new List<ObjectInfo>();
            AttributeInfo attr = null;
            bool isTypeBody = false, isMethord = false, isOperator = false;
            Stack<int> stack = new Stack<int>();
            stack.Push(0);
            while (stack.Count > 0)
            {
                switch(word)
                {
                    case "operator":
                        ReadMethordBody(list, word);
                        objTemp.Clear();
                        break;
                    case "virtual":
                    case "afx_msg":
                        mi = new MethordInfo();
                        mi.Virtual = word;
                        break;
                    case "private":
                    case "protected":
                    case "public":
                        sModifier = word;
                        break;
                    case ":":
                        if (isTypeBody)
                        {
                            
                        }
                        else
                        {
                            word = NextTokenText(list);
                            ////obj = new ObjectInfo();
                            ////switch (word)
                            ////{
                            ////    case "private":
                            ////    case "protected":
                            ////    case "public":
                            ////        obj.Modifier = word;
                            ////        word = NextTokenText(list);
                            ////        break;
                            ////    default:
                            ////        break;
                            ////}
                            ////obj.Code = word;
                            ////obj.Name = word;
                            ////ti.Parents.Add(obj);
                        }
                        break;
                    case "(":
                        if (mi == null)  mi = new MethordInfo();
                        isMethord = true;
                        paramList.Clear();
                        paramObj.Clear();
                        break;
                    case ")":
                        break;
                    case "}":
                        stack.Pop();
                        break;
                    case "{":
                        if (isTypeBody)
                        {
                            // 这里应该是方法

                            // 方法或属性定义结束
                            if (isMethord)
                            {
                                if (mi != null)
                                {
                                    mi.Store(objTemp);
                                    if (!string.IsNullOrEmpty(paramObj.Code))
                                    {
                                        ObjectInfo param = new ObjectInfo();
                                        param.Store(paramObj);
                                        paramList.Add(param);

                                        if (mi.Parameters == null) mi.Parameters = new List<ObjectInfo>();
                                        mi.Parameters.AddRange(paramList);
                                    }
                                    ti.Methords.Add(mi);
                                }
                            }
                            else
                            {
                                if (!string.IsNullOrEmpty(objTemp.Code))
                                {
                                    attr = new AttributeInfo();
                                    attr.Store(objTemp);
                                    ti.Attributes.Add(attr);
                                }
                            }
                            objTemp.Clear();
                            mi = null;
                            attr = null;
                            isMethord = false;

                            ReadMethordBody(list, word);

                            break;
                        }

                        // 类体定义,方法或属性
                        if (!isTypeBody)
                        {
                            isTypeBody = true;
                        }
                        break;
                    case "DECLARE_DYNCREATE":
                    case "DECLARE_MESSAGE_MAP":
                        // 读取到行尾
                        word = ReadToLineEnd(list);
                        wordNext = GetTokenText(list, tokenCurrent);
                        continue;

                    case ";":
                        // 方法或属性定义结束
                        if (isMethord)
                        {
                            if (mi != null)
                            {
                                mi.Store(objTemp);
                                if (!string.IsNullOrEmpty(paramObj.Code))
                                {
                                    ObjectInfo param = new ObjectInfo();
                                    param.Store(paramObj);
                                    paramList.Add(param);

                                    if (mi.Parameters == null) mi.Parameters = new List<ObjectInfo>();
                                    mi.Parameters.AddRange(paramList);
                                }
                                ti.Methords.Add(mi);
                            }
                        }
                        else
                        {
                            if (!string.IsNullOrEmpty(objTemp.Code))
                            {
                                attr = new AttributeInfo();
                                attr.Store(objTemp);
                                ti.Attributes.Add(attr);
                            }
                        }
                        objTemp.Clear();
                        mi = null;
                        attr = null;
                        isMethord = false;
                        break;
                    case ",":
                        if (isMethord)
                        {
                            if (!string.IsNullOrEmpty(paramObj.Code))
                            {
                                ObjectInfo param = new ObjectInfo();
                                param.Store(paramObj);
                                paramList.Add(param);
                            }
                            paramObj.Clear();
                        }
                        break;
                    default:
                        if (word == ti.Code)
                        {
                            // 构造函数
                            objTemp.Modifier = sModifier;
                            objTemp.Code = objTemp.Name = word;
                        }
                        else if(word == "~" && GetTokenText(list, tokenCurrent.next) == ti.Code)
                        {
                            // 析构函数
                            objTemp.Modifier = sModifier;
                            objTemp.Code = objTemp.Name = word + ti.Code;
                            word = NextTokenText(list);
                        }
                        else
                        {
                            if (string.IsNullOrEmpty(objTemp.Type))
                            {
                                objTemp.Modifier = sModifier;
                                switch (word)
                                {
                                    case "const":
                                        objTemp.IsConst = true;
                                        break;
                                    case "inline":
                                        break;
                                    default:
                                        objTemp.Type = word;
                                        break;
                                }
                            }
                            else if (string.IsNullOrEmpty(objTemp.Code))
                            {
                                switch (word)
                                {
                                    case "*":
                                    case "&":
                                        objTemp.Type += word;
                                        break;
                                    default:
                                        objTemp.Code = objTemp.Name = word;
                                        break;
                                }
                            }
                            else if (isMethord)
                            {
                                // 一般应该为参数

                                if (string.IsNullOrEmpty(paramObj.Type))
                                {
                                    paramObj.Modifier = sModifier;

                                    if (word == "const")
                                    {
                                        paramObj.IsConst = true;
                                    }
                                    else
                                    {
                                        paramObj.Type = word;
                                    }
                                }
                                else if (string.IsNullOrEmpty(paramObj.Code))
                                {
                                    switch(word)
                                    {
                                        case "*":
                                        case "&":
                                            paramObj.Type += word;
                                            break;
                                        default:
                                            paramObj.Code = paramObj.Name = word;
                                            break;
                                    }
                                }
                            }
                        }

                        break;
                }

                if (tokenCurrent.next == null)
                {
                    break;
                }
                word = NextTokenText(list);
                wordNext = GetTokenText(list, tokenCurrent.next);
            }
        }
Example #5
0
        private void ProcessAType(ref TypeInfo ti, ref string sModifier, bool bIsValueType)
        {
            string word = NextTokenText();
            ti.Name = ti.Code = word;
            word = NextTokenText();
            string wordNext = GetTokenText(tokenCurrent.next);


            if (word == ";" || word == "*" || ";" == wordNext || wordNext == "*")
            {
                ti.IsClass = false;
                return;
            }
            ti.IsClass = true;

            ObjectInfo objTemp = new ObjectInfo(), paramObj = new ObjectInfo();
            List<ObjectInfo> paramList = new List<ObjectInfo>();
            bool isTypeBody = false, isMethord = false;
            Stack<int> stack = new Stack<int>();
            stack.Push(0);
            while (stack.Count > 0)
            {
                switch(word)
                {
                    case "operator":
                        ReadMethordBody(word, null);
                        objTemp.Clear();
                        break;
                    case "volatile":
                        objTemp.IsVolatile = true;
                        break;
                    case "static":
                        objTemp.IsStatic = true;
                        break;
                    case "virtual":
                        objTemp.IsVirtual = true;
                        objTemp.Virtual = word;
                        break;
                    case "WINAPI":
                    case "afx_msg":
                        break;
                    case "private":
                    case "protected":
                    case "public":
                        sModifier = word;
                        break;
                    case "union":
                        objTemp.Type = word;
                        ReadMethordBody(word, null);
                        break;
                    case ":":
                        if (!isTypeBody)
                        {
                            // 处理继承
                            ReadParentInfo(ti, word);
                        }
                        break;
                    case "(":
                        isMethord = true;
                        paramList.Clear();
                        paramObj.Clear();
                        break;
                    case ")":
                        if (isMethord && tokenCurrent.next != null && tokenCurrent.next.next != null && ("=" == GetTokenText(tokenCurrent.next)) && ("0" == GetTokenText(tokenCurrent.next.next)))
                        {
                            objTemp.IsAbstract = true;
                            ti.IsAbstract = true;
                            tokenCurrent = tokenCurrent.next.next;
                        }
                        if (isMethord && wordNext == ":")
                        {
                            // 构造函数后有参数初始化的
                            ReadMethordBody(word, objTemp.Implementation);

                            if (isTypeBody)
                            {
                                if (!string.IsNullOrEmpty(paramObj.Code))
                                {
                                    ObjectInfo param = new ObjectInfo();
                                    param.Store(paramObj);
                                    paramList.Add(param);
                                }
                                paramObj.Clear();

                                // 方法或属性定义结束
                                ti.AddMethord(objTemp, paramList);

                                objTemp.Clear();
                                isMethord = false;
                            }
                        }
                        break;
                    case "}":
                        stack.Pop();
                        break;
                    case "{":
                    case ";":
                    case ",":
                        if (isTypeBody && isMethord)    //  && (word == "," || word == ";")
                        {
                            if (!string.IsNullOrEmpty(paramObj.Code))
                            {
                                ObjectInfo param = new ObjectInfo();
                                param.Store(paramObj);
                                paramList.Add(param);
                            }
                            paramObj.Clear();
                        }

                        if (isTypeBody && word != ",") //  || word == ";"
                        {
                            // 方法或属性定义结束
                            if (isMethord)
                            {
                                // 跳过方法体
                                if (word == "{")
                                {
                                    ReadMethordBody(word, objTemp.Implementation);
                                }

                                ti.AddMethord(objTemp, paramList);
                            }
                            else
                            {
                                ti.AddAttribute(objTemp);
                            }

                            objTemp.Clear();
                            isMethord = false;

                            break;
                        }

                        // 类体定义,方法或属性
                        if (!isTypeBody && word == "{")
                        {
                            isTypeBody = true;
                        }
                        break;
                    case "DECLARE_DYNCREATE":
                    case "DECLARE_MESSAGE_MAP":
                        // 读取到行尾
                        word = ReadToLineEnd();
                        wordNext = GetTokenText(tokenCurrent);
                        continue;
                    default:
                        if (word == "~" && GetTokenText(tokenCurrent.next) == ti.Code)
                        {
                            // 析构函数
                            objTemp.Modifier = sModifier;
                            objTemp.Code = objTemp.Name = word + ti.Code;
                            word = NextTokenText();
                        }
                        else
                        {
                            if (isMethord)
                            {
                                if (word == "=")
                                {
                                    // 忽略参数的默认值
                                    wordNext = GetTokenText(tokenCurrent.next);
                                    Stack sTemp = new Stack();
                                    while ((wordNext != "," && wordNext != ")") || sTemp.Count > 0)
                                    {
                                        switch (wordNext)
                                        {
                                            case "(":
                                                sTemp.Push("(");
                                                break;
                                            case ")":
                                                if (sTemp.Count > 0) sTemp.Pop();
                                                break;
                                        }
                                        word = NextTokenText();
                                        paramObj.Default += word;
                                        if (tokenCurrent == null || tokenCurrent.next == null)
                                        {
                                            break;
                                        }
                                        wordNext = GetTokenText(tokenCurrent.next);
                                    }
                                }
                                else
                                {
                                    // 一般应该为参数
                                    ChangeObjectInfo(paramObj, word, sModifier);
                                }
                            }
                            else
                            {
                                // 可能为构造函数或属性定义【指针】
                                ChangeObjectInfo(objTemp, word, sModifier);
                            }
                        }

                        break;
                }

                if (tokenCurrent == null ||tokenCurrent.next == null)
                {
                    break;
                }
                word = NextTokenText();
                wordNext = GetTokenText(tokenCurrent.next);
            }
        }
Example #6
0
        private void ChangeObjectInfo(ObjectInfo obj, string word, string sModifier)
        {
            if (string.IsNullOrEmpty(obj.Type))
            {
                obj.Modifier = sModifier;
                switch (word)
                {
                    case "unsigned":
                        obj.FullType += word;
                        break;
                    case "volitale":
                        obj.IsVolatile = true;
                        obj.FullType += word;
                        break;
                    case "const":
                        obj.IsConst = true;
                        break;
                    case "inline":
                        break;
                    default:
                        obj.Type = word;
                        obj.FullType += word;

                        string wordNext = GetTokenText(tokenCurrent.next);
                        switch (wordNext)
                        {
                            case "<":
                                word = NextTokenText();
                                obj.IsGenericType = true;
                                // 处理类似于THash<int, tagUser>之类的定义
                                while (tokenCurrent != null)
                                {
                                    obj.FullType += word;

                                    if (word == ">") break;
                                    word = NextTokenText();
                                }
                                break;
                            case "[":
                                obj.IsArray = true;
                                word = NextTokenText();
                                while (tokenCurrent != null)
                                {
                                    obj.FullType += word;

                                    if (word == "]") break;
                                    word = NextTokenText();
                                }
                                break;
                            case "*":
                                obj.IsArray = true;
                                obj.IsPointer = true;
                                word = NextTokenText();
                                break;
                            case "&":
                                obj.IsByRef = true;
                                word = NextTokenText();
                                break;
                        }
                        break;
                }
            }
            else if (string.IsNullOrEmpty(obj.Code))
            {
                switch (word)
                {
                    case "*":
                        obj.IsArray = true;
                        obj.IsPointer = true;
                        word = NextTokenText();
                        break;
                    case "&":
                        obj.IsByRef = true;
                        word = NextTokenText();
                        break;
                    case "<":
                        obj.FullType += word;
                        break;
                    default:
                        obj.Code = obj.Name = word;
                        break;
                }
            }
        }
Example #7
0
        private void AddParameter(Operation aMethod, ObjectInfo aParam, PdOOM.BasePackage aPckg)
        {
            Parameter aPrm = (Parameter)aMethod.CreateObject(0x1811206d, "", -1, true);
            string str = "I";    // aParam.IsOut ? "O" : "I";
            ////Type parameterType = aParam.Type;
            ////if (parameterType.IsGenericType && !parameterType.IsGenericTypeDefinition)
            ////{
            ////    parameterType = parameterType.GetGenericTypeDefinition();
            ////}
            if (aParam.IsConst)
            {
                aPrm.SetExtendedAttribute("C++.const", "true");
            }
            if (aParam.IsByRef)
            {
                aPrm.SetExtendedAttribute("C++.ref", "true");
            }
            if (!aParam.IsConst && (aParam.IsByRef || aParam.IsPointer))
            {
                str = "IO";
            }
            if (aParam.IsArray)
            {
                aPrm.Array = true;
            }
            aPrm.SetExtendedAttribute("C++.init", aParam.Default);

            TypeInfo tiField = new TypeInfo();
            tiField.Code = tiField.Name = aParam.Type;
            tiField.IsClass = true;
            tiField.Comment = ((PdOOM.NamedObject)aMethod.Parent).Comment;
            this.AddClassifier(tiField, false);
            bool bCreate = true;
            TypeMapping aType = TypeMapping.Retrieve(tiField, ref bCreate);
            if (aType.HasClassifier())
            {
                PdOOM.BaseObject obj2 = ProperRef.Link(NamespaceMapping.Retrieve(aPckg), aType);
                aPrm.UseQualifiedDataType = false;
                aPrm.DataTypeObject = obj2;
            }
            aPrm.ParameterType = str;
            aPrm.DataType = aParam.FullType;
            aPrm.Name = aPrm.Code = aParam.Name;
            CustomHandlerParam param = new CustomHandlerParam(aParam, aPrm);
            param.Convert();
            if (param.Params)
            {
                aPrm.SetExtendedAttribute("C++.params", "true");
            }
        }
 public CustomHandlerParam(ObjectInfo aParam, Parameter aPrm)
     : base(null, aParam.Name, aPrm)
 {
     base.ProcessAttrs();
 }
 public CustomHandlerParam(ObjectInfo aParam, Parameter aPrm)
     : base(null, aParam.Name, aPrm)
 {
     base.ProcessAttrs();
 }
Example #10
0
        public ObjectInfo Clone()
        {
            ObjectInfo obj = new ObjectInfo();

            obj.Store(this);

            return obj;
        }
Example #11
0
        public void Store(ObjectInfo obj)
        {
            this.Modifier = obj.Modifier;
            this.Code = obj.Code;
            this.Name = obj.Name;
            this.Type = obj.Type;
            this.Virtual = obj.Virtual;
            this.Comment = obj.Comment;

            this.IsStatic = obj.IsStatic;
            this.IsConst = obj.IsConst;
            this.IsArray = obj.IsArray;
            this.IsAbstract = obj.IsAbstract;
            this.IsClass = obj.IsClass;
            this.IsInterface = obj.IsInterface;
            this.IsGenericType = obj.IsGenericType;
            this.IsValueType = obj.IsValueType;
            this.IsGenericTypeDefinition = obj.IsGenericTypeDefinition;
            this.IsVirtual = obj.IsVirtual;
            this.IsGenericMethod = obj.IsGenericMethod;
            this.IsVolatile = obj.IsVolatile;
            this.IsByRef = obj.IsByRef;
            this.IsPointer = obj.IsPointer;
            this.FullType = obj.FullType;
            this.Implementation.Length = 0;
            this.Implementation.Append(obj.Implementation.ToString());
            this.Default = obj.Default;
        }