File indexing completed on 2024-05-12 04:39:19

0001 /*
0002     SPDX-FileCopyrightText: 2013 Olivier de Gaalon <olivier.jg@gmail.com>
0003     SPDX-FileCopyrightText: 2013 Milian Wolff <mail@milianw.de>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #ifndef CLANGTYPES_H
0009 #define CLANGTYPES_H
0010 
0011 #include <clang-c/Index.h>
0012 
0013 #include <util/path.h>
0014 
0015 #include "clangprivateexport.h"
0016 
0017 #include <iterator>
0018 
0019 class QTextStream;
0020 
0021 namespace KTextEditor {
0022 class Cursor;
0023 class Range;
0024 }
0025 
0026 namespace KDevelop {
0027 class DocumentCursor;
0028 class DocumentRange;
0029 class CursorInRevision;
0030 class RangeInRevision;
0031 class IndexedString;
0032 }
0033 
0034 inline uint qHash(const CXCursor& cursor) noexcept
0035 {
0036     return clang_hashCursor(cursor);
0037 }
0038 
0039 inline bool operator==(const CXCursor& lhs, const CXCursor& rhs) noexcept
0040 {
0041     return clang_equalCursors(lhs, rhs);
0042 }
0043 
0044 class ClangString
0045 {
0046 public:
0047     explicit ClangString(CXString string);
0048     ~ClangString();
0049 
0050     ClangString(const ClangString&) = delete;
0051     ClangString& operator=(const ClangString&) = delete;
0052 
0053     /**
0054      * Might return nullptr for invalid strings
0055      */
0056     const char* c_str() const;
0057 
0058     bool isEmpty() const;
0059 
0060     QString toString() const;
0061     QByteArray toByteArray() const;
0062     KDevelop::IndexedString toIndexed() const;
0063 
0064 private:
0065     CXString string;
0066 };
0067 
0068 QTextStream& operator<<(QTextStream& stream, const ClangString& str);
0069 QDebug operator<<(QDebug stream, const ClangString& str);
0070 
0071 class ClangLocation
0072 {
0073 public:
0074     explicit ClangLocation(CXSourceLocation cursor);
0075     ~ClangLocation();
0076 
0077     operator KDevelop::DocumentCursor() const;
0078 
0079     operator KTextEditor::Cursor() const;
0080 
0081     operator KDevelop::CursorInRevision() const;
0082 
0083     operator CXSourceLocation() const;
0084 
0085 private:
0086     CXSourceLocation location;
0087 };
0088 
0089 QDebug operator<<(QDebug stream, const ClangLocation& str);
0090 
0091 class KDEVCLANGPRIVATE_EXPORT ClangRange
0092 {
0093 public:
0094     explicit ClangRange(CXSourceRange range);
0095 
0096     ~ClangRange();
0097 
0098     ClangLocation start() const;
0099     ClangLocation end() const;
0100 
0101     CXSourceRange range() const;
0102 
0103     KDevelop::DocumentRange toDocumentRange() const;
0104 
0105     KTextEditor::Range toRange() const;
0106 
0107     KDevelop::RangeInRevision toRangeInRevision() const;
0108 
0109 private:
0110     CXSourceRange m_range;
0111 };
0112 
0113 QDebug operator<<(QDebug stream, const ClangRange& str);
0114 
0115 class KDEVCLANGPRIVATE_EXPORT ClangTokens
0116 {
0117 public:
0118     ClangTokens(CXTranslationUnit unit, CXSourceRange range);
0119     ClangTokens(const ClangTokens&) = delete;
0120     ClangTokens& operator=(const ClangTokens&) = delete;
0121     ~ClangTokens();
0122     CXToken* begin() const;
0123     CXToken* end() const;
0124     std::reverse_iterator<CXToken*> rbegin() const;
0125     std::reverse_iterator<CXToken*> rend() const;
0126     uint size() const;
0127     CXToken at(uint index) const;
0128     CXTranslationUnit unit() const;
0129 private:
0130     CXTranslationUnit m_unit;
0131     CXToken* m_tokens;
0132     uint m_numTokens;
0133 };
0134 
0135 QDebug operator<<(QDebug stream, const ClangTokens& str);
0136 QDebug operator<<(QDebug stream, const CXToken& token);
0137 
0138 #endif // CLANGTYPES_H