1 /* 2 SPDX-FileCopyrightText: 2013 Olivier de Gaalon <olivier.jg@gmail.com> 3 SPDX-FileCopyrightText: 2013 Milian Wolff <mail@milianw.de> 4 5 SPDX-License-Identifier: LGPL-2.0-or-later 6 */ 7 8 #ifndef CLANGTYPES_H 9 #define CLANGTYPES_H 10 11 #include <clang-c/Index.h> 12 13 #include <util/path.h> 14 15 #include "clangprivateexport.h" 16 17 #include <iterator> 18 19 class QTextStream; 20 21 namespace KTextEditor { 22 class Cursor; 23 class Range; 24 } 25 26 namespace KDevelop { 27 class DocumentCursor; 28 class DocumentRange; 29 class CursorInRevision; 30 class RangeInRevision; 31 class IndexedString; 32 } 33 qHash(const CXCursor & cursor)34inline uint qHash(const CXCursor& cursor) noexcept 35 { 36 return clang_hashCursor(cursor); 37 } 38 39 inline bool operator==(const CXCursor& lhs, const CXCursor& rhs) noexcept 40 { 41 return clang_equalCursors(lhs, rhs); 42 } 43 44 class ClangString 45 { 46 public: 47 explicit ClangString(CXString string); 48 ~ClangString(); 49 50 ClangString(const ClangString&) = delete; 51 ClangString& operator=(const ClangString&) = delete; 52 53 /** 54 * Might return nullptr for invalid strings 55 */ 56 const char* c_str() const; 57 58 bool isEmpty() const; 59 60 QString toString() const; 61 QByteArray toByteArray() const; 62 KDevelop::IndexedString toIndexed() const; 63 64 private: 65 CXString string; 66 }; 67 68 QTextStream& operator<<(QTextStream& stream, const ClangString& str); 69 QDebug operator<<(QDebug stream, const ClangString& str); 70 71 class ClangLocation 72 { 73 public: 74 explicit ClangLocation(CXSourceLocation cursor); 75 ~ClangLocation(); 76 77 operator KDevelop::DocumentCursor() const; 78 79 operator KTextEditor::Cursor() const; 80 81 operator KDevelop::CursorInRevision() const; 82 83 operator CXSourceLocation() const; 84 85 private: 86 CXSourceLocation location; 87 }; 88 89 QDebug operator<<(QDebug stream, const ClangLocation& str); 90 91 class KDEVCLANGPRIVATE_EXPORT ClangRange 92 { 93 public: 94 explicit ClangRange(CXSourceRange range); 95 96 ~ClangRange(); 97 98 ClangLocation start() const; 99 ClangLocation end() const; 100 101 CXSourceRange range() const; 102 103 KDevelop::DocumentRange toDocumentRange() const; 104 105 KTextEditor::Range toRange() const; 106 107 KDevelop::RangeInRevision toRangeInRevision() const; 108 109 private: 110 CXSourceRange m_range; 111 }; 112 113 QDebug operator<<(QDebug stream, const ClangRange& str); 114 115 class KDEVCLANGPRIVATE_EXPORT ClangTokens 116 { 117 public: 118 ClangTokens(CXTranslationUnit unit, CXSourceRange range); 119 ClangTokens(const ClangTokens&) = delete; 120 ClangTokens& operator=(const ClangTokens&) = delete; 121 ~ClangTokens(); 122 CXToken* begin() const; 123 CXToken* end() const; 124 std::reverse_iterator<CXToken*> rbegin() const; 125 std::reverse_iterator<CXToken*> rend() const; 126 uint size() const; 127 CXToken at(uint index) const; 128 CXTranslationUnit unit() const; 129 private: 130 CXTranslationUnit m_unit; 131 CXToken* m_tokens; 132 uint m_numTokens; 133 }; 134 135 QDebug operator<<(QDebug stream, const ClangTokens& str); 136 QDebug operator<<(QDebug stream, const CXToken& token); 137 138 #endif // CLANGTYPES_H 139