CppType GetType(Node n, CppType modifiers) { var fundamental = CppTypes.Unknown; switch (n.Type) { case "Typedef": return(GetType(GetTypeNode(n), modifiers)); case "ArrayType": CppModifiers mod = null; var max = n.Attributes ["max"]; var min = n.Attributes ["min"]; if (max != null && min != null) { var l = GetLongValue(max) - GetLongValue(min); mod = new CppModifiers.ArrayModifier((int)l + 1); } else { mod = CppModifiers.Array; } return(GetType(GetTypeNode(n), modifiers.Modify(mod))); case "PointerType": return(GetType(GetTypeNode(n), modifiers.Modify(CppModifiers.Pointer))); case "ReferenceType": return(GetType(GetTypeNode(n), modifiers.Modify(CppModifiers.Reference))); case "FundamentalType": return(modifiers.CopyTypeFrom(new CppType(n.Name))); case "CvQualifiedType": if (n.IsTrue("const")) { return(GetType(GetTypeNode(n), modifiers.Modify(CppModifiers.Const))); } else { throw new NotImplementedException(); } case "Class": fundamental = CppTypes.Class; break; case "Struct": fundamental = CppTypes.Struct; break; case "Enumeration": fundamental = CppTypes.Enum; break; case "FunctionType": fundamental = CppTypes.Delegate; break; default: return(CppTypes.Unknown); } if (!NodeToNamespace.ContainsKey(n)) { // FIXME: Do something better if (string.IsNullOrEmpty(n.Name)) { Console.WriteLine("WARNING: Could not find type with id '{0}'", n.Id); } else { Console.WriteLine("WARNING: Could not find type '{0}'", n.Name); } return(CppTypes.Unknown); } return(modifiers.CopyTypeFrom(new CppType(fundamental, string.Join("::", NodeToNamespace [n].FullyQualifiedName)))); }
CppType GetType(Node n, CppType modifiers) { var fundamental = CppTypes.Unknown; switch (n.Type) { case "Typedef": return(GetType(GetTypeNode(n), modifiers)); case "ArrayType": CppModifiers mod = null; if (n.Attributes ["max"] != null && n.Attributes ["min"] != null) { mod = new CppModifiers.ArrayModifier(int.Parse(n.Attributes ["max"].TrimEnd('u')) - int.Parse(n.Attributes ["min"].TrimEnd('u')) + 1); } else { mod = CppModifiers.Array; } return(GetType(GetTypeNode(n), modifiers.Modify(mod))); case "PointerType": return(GetType(GetTypeNode(n), modifiers.Modify(CppModifiers.Pointer))); case "ReferenceType": return(GetType(GetTypeNode(n), modifiers.Modify(CppModifiers.Reference))); case "FundamentalType": return(modifiers.CopyTypeFrom(new CppType(n.Name))); case "CvQualifiedType": if (n.IsTrue("const")) { return(GetType(GetTypeNode(n), modifiers.Modify(CppModifiers.Const))); } else { throw new NotImplementedException(); } case "Class": fundamental = CppTypes.Class; break; case "Struct": fundamental = CppTypes.Struct; break; case "Enumeration": fundamental = CppTypes.Enum; break; default: return(CppTypes.Unknown); } if (!NodeToNamespace.ContainsKey(n)) { // FIXME: Do something better return(CppTypes.Unknown); } return(modifiers.CopyTypeFrom(new CppType(fundamental, string.Join("::", NodeToNamespace [n].FullyQualifiedName)))); }