CppType GetType(Node n, CppType modifiers) { switch (n.Type) { case "ArrayType": return GetType (GetTypeNode (n), modifiers.Modify (CppModifiers.Array)); 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": case "Struct": if (!NodeToClass.ContainsKey (n)) { if (modifiers.Modifiers.Count () == 1 && modifiers.Modifiers [0] == CppModifiers.Pointer) // Map these to void* return modifiers.CopyTypeFrom (CppTypes.Void); else return CppTypes.Unknown; } return modifiers.CopyTypeFrom (new CppType (CppTypes.Class, NodeToClass [n].Name)); default: return CppTypes.Unknown; } }