1//===-- FormatClasses.h -----------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef lldb_FormatClasses_h_ 11#define lldb_FormatClasses_h_ 12 13// C Includes 14#include <stdint.h> 15#include <unistd.h> 16 17// C++ Includes 18#include <string> 19#include <vector> 20 21// Other libraries and framework includes 22 23// Project includes 24#include "lldb/lldb-public.h" 25#include "lldb/lldb-enumerations.h" 26 27#include "lldb/Core/ValueObject.h" 28#include "lldb/Interpreter/ScriptInterpreterPython.h" 29#include "lldb/Symbol/ClangASTType.h" 30#include "lldb/Symbol/Type.h" 31 32#include "lldb/DataFormatters/TypeFormat.h" 33#include "lldb/DataFormatters/TypeSummary.h" 34#include "lldb/DataFormatters/TypeSynthetic.h" 35 36namespace lldb_private { 37 38class TypeNameSpecifierImpl 39{ 40public: 41 TypeNameSpecifierImpl() : 42 m_is_regex(false), 43 m_type() 44 { 45 } 46 47 TypeNameSpecifierImpl (const char* name, bool is_regex) : 48 m_is_regex(is_regex), 49 m_type() 50 { 51 if (name) 52 m_type.m_type_name.assign(name); 53 } 54 55 // if constructing with a given type, is_regex cannot be true since we are 56 // giving an exact type to match 57 TypeNameSpecifierImpl (lldb::TypeSP type) : 58 m_is_regex(false), 59 m_type() 60 { 61 if (type) 62 { 63 m_type.m_type_name.assign(type->GetName().GetCString()); 64 m_type.m_typeimpl_sp = lldb::TypeImplSP(new TypeImpl(type)); 65 } 66 } 67 68 TypeNameSpecifierImpl (ClangASTType type) : 69 m_is_regex(false), 70 m_type() 71 { 72 if (type.IsValid()) 73 { 74 m_type.m_type_name.assign(type.GetConstTypeName().GetCString()); 75 m_type.m_typeimpl_sp = lldb::TypeImplSP(new TypeImpl(type)); 76 } 77 } 78 79 const char* 80 GetName() 81 { 82 if (m_type.m_type_name.size()) 83 return m_type.m_type_name.c_str(); 84 return NULL; 85 } 86 87 lldb::TypeSP 88 GetTypeSP () 89 { 90 if (m_type.m_typeimpl_sp && m_type.m_typeimpl_sp->IsValid()) 91 return m_type.m_typeimpl_sp->GetTypeSP(); 92 return lldb::TypeSP(); 93 } 94 95 ClangASTType 96 GetClangASTType () 97 { 98 if (m_type.m_typeimpl_sp && m_type.m_typeimpl_sp->IsValid()) 99 return m_type.m_typeimpl_sp->GetClangASTType(); 100 return ClangASTType(); 101 } 102 103 bool 104 IsRegex() 105 { 106 return m_is_regex; 107 } 108 109private: 110 bool m_is_regex; 111 // this works better than TypeAndOrName because the latter only wraps a TypeSP 112 // whereas TypeImplSP can also be backed by a ClangASTType which is more commonly 113 // used in LLDB. moreover, TypeImplSP is also what is currently backing SBType 114 struct TypeOrName 115 { 116 std::string m_type_name; 117 lldb::TypeImplSP m_typeimpl_sp; 118 }; 119 TypeOrName m_type; 120 121 122private: 123 DISALLOW_COPY_AND_ASSIGN(TypeNameSpecifierImpl); 124}; 125 126} // namespace lldb_private 127 128#endif // lldb_FormatClasses_h_ 129