Exemplo n.º 1
0
        public static NativeType GetNativeType(AST ast, CXType cxType, TypeVisitContext context = null)
        {
            CXType type = cxType;

            if (ClangTraits.IsElaboratedType(type) || ClangTraits.IsUnexposedType(type))
            {
                type = clang.getCursorType(clang.getTypeDeclaration(type));
            }
            Debug.Assert(!ClangTraits.IsInvalid(type));

            string typeName = clang.getTypeSpelling(type).ToString();

            Debug.Assert(typeName.Length > 0);
            NativeType nativeType = ast.GetType(typeName);

            if (!nativeType.Parsed)
            {
                nativeType.Parsed = true;

                // get cursor spelling as unscoped name
                CXCursor declaration = clang.getTypeDeclaration(type);
                nativeType.UnscopedName = clang.getCursorSpelling(declaration).ToString();

                // not a type reference nor a type with qualifiers
                if (ClangTraits.IsTypeEntity(type) || typeName == "std::nullptr_t")
                {
                    ProcessTypeEntity(ast, nativeType, type, context);
                }
                // using or typedef
                else if (ClangTraits.IsTypedef(type))
                {
                    ProcessTypedef(ast, nativeType, type, context);
                }
                else if (ClangTraits.IsArray(type))
                {
                    ProcessArray(ast, nativeType, type, context);
                }
                // reference and pointer
                else if (ClangTraits.IsReference(type) || ClangTraits.IsPointer(type))
                {
                    ProcessReferencePointer(ast, nativeType, type, context);
                }
                else if (ClangTraits.IsMemberPointer(type))
                {
                    ProcessMemberPointer(ast, nativeType, cxType, context);
                }
                else
                {
                    Debug.Assert(false);
                }
            }

            return(nativeType);
        }