public void AddAttribute(ObjectInfo objTemp) { if (!string.IsNullOrEmpty(objTemp.Code)) { AttributeInfo attr = new AttributeInfo(); attr.Store(objTemp); this.Attributes.Add(attr); } }
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); }
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"); } }
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); } }
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); } }
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; } } }
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 ObjectInfo Clone() { ObjectInfo obj = new ObjectInfo(); obj.Store(this); return obj; }
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; }