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); }