private static string ProcessPointerType(this CXType type, bool treatArrayAsPointer) { type = type.Desugar(); if (type.kind == CXTypeKind.CXType_Void) { return(!Parameters.GenerateSafeCode ? "void *" : "FakePtr<byte>"); } var sb = new StringBuilder(); sb.Append(ToCSharpTypeString(type, treatArrayAsPointer)); RecordType recordType; string recordName; type.ResolveRecord(out recordType, out recordName); if (recordType != RecordType.Class) { if (!Parameters.GenerateSafeCode) { sb.Append("*"); } else { return("FakePtr<" + sb.ToString() + ">"); } } return(sb.ToString()); }
public static void ResolveRecord(this CXType type, out RecordType recordType, out string name) { recordType = RecordType.None; name = string.Empty; var run = true; var determine = false; while (run) { type = type.Desugar(); switch (type.kind) { case CXTypeKind.CXType_Record: { determine = true; run = false; break; } case CXTypeKind.CXType_IncompleteArray: case CXTypeKind.CXType_ConstantArray: type = clang.getArrayElementType(type); continue; case CXTypeKind.CXType_Pointer: type = clang.getPointeeType(type); continue; default: determine = clang.getTypeSpelling(type).ToString().Contains("struct "); run = false; break; } } if (determine) { name = clang.getTypeSpelling(type).ToString(); var isConstQualifiedType = clang.isConstQualifiedType(type) != 0; if (isConstQualifiedType) { name = name.Replace("const ", string.Empty); // ugh } name = name.Replace("struct ", string.Empty); recordType = (Parameters.Classes != null && Parameters.Classes.Contains(name)) ? RecordType.Class : RecordType.Struct; } if (Parameters.TypeNameReplacer != null) { name = Parameters.TypeNameReplacer(name); } }
public static CXType GetPointeeType(this CXType type) { while (true) { type = type.Desugar(); switch (type.kind) { case CXTypeKind.CXType_IncompleteArray: case CXTypeKind.CXType_ConstantArray: type = clang.getArrayElementType(type); continue; case CXTypeKind.CXType_Pointer: type = clang.getPointeeType(type); continue; } return(type); } }
private static string ProcessPointerType(this CXType type, bool treatArrayAsPointer) { type = type.Desugar(); if (type.kind == CXTypeKind.CXType_Void) { return("void *"); } var sb = new StringBuilder(); sb.Append(ToCSharpTypeString(type, treatArrayAsPointer)); RecordType recordType; string recordName; type.ResolveRecord(out recordType, out recordName); if (recordType != RecordType.Class) { sb.Append("*"); } return(sb.ToString()); }
private static string ProcessPointerType(this CXType type, bool treatArrayAsPointer) { type = type.Desugar(); if (type.kind == CXTypeKind.CXType_Void) { return("*mut u8"); } var sb = new StringBuilder(); if (type.kind.IsPrimitiveNumericType()) { sb.Append("*mut "); } else { sb.Append("*mut "); } sb.Append(ToCSharpTypeString(type, treatArrayAsPointer)); return(sb.ToString()); }
public static bool IsPointer(this CXType type) { var t2 = type.Desugar(); return(t2.kind.IsPointer()); }
public static string ToCSharpTypeString(this CXType type, bool treatArrayAsPointer = false, bool replace = true) { var isConstQualifiedType = clang.isConstQualifiedType(type) != 0; var spelling = string.Empty; var sb = new StringBuilder(); type = type.Desugar(); switch (type.kind) { case CXTypeKind.CXType_Record: spelling = clang.getTypeSpelling(type).ToString(); break; case CXTypeKind.CXType_IncompleteArray: sb.Append(clang.getArrayElementType(type).ToCSharpTypeString()); spelling = "[]"; break; case CXTypeKind.CXType_Unexposed: // Often these are enums and canonical type gets you the enum spelling var canonical = clang.getCanonicalType(type); // unexposed decl which turns into a function proto seems to be an un-typedef'd fn pointer spelling = canonical.kind == CXTypeKind.CXType_FunctionProto ? "IntPtr" : clang.getTypeSpelling(canonical).ToString(); break; case CXTypeKind.CXType_ConstantArray: var t = clang.getArrayElementType(type); if (treatArrayAsPointer) { sb.Append(ProcessPointerType(t, true)); } else { if (!Parameters.GenerateSafeCode || (Parameters.Classes != null && Parameters.Classes.Contains(t.ToCSharpTypeString(false, false)))) { sb.Append(t.ToCSharpTypeString() + "[]"); } else { sb.Append(t.ToCSharpTypeString().WrapIntoFakePtr()); } } break; case CXTypeKind.CXType_Pointer: sb.Append(ProcessPointerType(clang.getPointeeType(type), treatArrayAsPointer)); break; default: spelling = clang.getCanonicalType(type).ToPlainTypeString(); break; } if (isConstQualifiedType) { spelling = spelling.Replace("const ", string.Empty); // ugh } spelling = spelling.Replace("struct ", string.Empty); if (spelling.StartsWith("enum ")) { spelling = "int"; } if (replace && Parameters.TypeNameReplacer != null) { spelling = Parameters.TypeNameReplacer(spelling); } sb.Append(spelling); return(sb.ToString()); }