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)34 inline 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