Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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());
        }
Ejemplo n.º 5
0
        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());
        }
Ejemplo n.º 6
0
        public static bool IsPointer(this CXType type)
        {
            var t2 = type.Desugar();

            return(t2.kind.IsPointer());
        }
Ejemplo n.º 7
0
        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());
        }