/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ #pragma once #include #include #include #include #include #include using uint = unsigned int; namespace llvm { class StringRef; } namespace clang { class SourceManager; class LangOptions; class SourceRange; class FullSourceLoc; class FileID; class FileEntry; } namespace ClangBackEnd { class SourceRangesContainer; class SourceRangeWithTextContainer; class SourceRangeExtractor { public: SourceRangeExtractor(const clang::SourceManager &sourceManager, const clang::LangOptions &languageOptions, FilePathCachingInterface &filePathCache, SourceRangesContainer &sourceRangesContainer); void addSourceRange(const clang::SourceRange &sourceRange); void addSourceRanges(const std::vector &sourceRanges); const std::vector &sourceRangeWithTextContainers() const; static const char *findStartOfLineInBuffer(const llvm::StringRef buffer, uint startOffset); static const char *findEndOfLineInBuffer(llvm::StringRef buffer, uint endOffset); static Utils::SmallString getExpandedText(llvm::StringRef buffer, uint startOffset, uint endOffset); const clang::SourceRange extendSourceRangeToLastTokenEnd(const clang::SourceRange sourceRange); private: void insertSourceRange(FilePathId filePathId, const clang::FullSourceLoc &startLocation, uint startOffset, const clang::FullSourceLoc &endLocation, uint endOffset, Utils::SmallString &&lineSnippet); FilePathId findFileId(clang::FileID fileId, const clang::FileEntry *fileEntry) const; private: mutable std::unordered_map m_fileIdMapping; const clang::SourceManager &sourceManager; const clang::LangOptions &languageOptions; FilePathCachingInterface &filePathCache; SourceRangesContainer &sourceRangesContainer; }; } // namespace ClangBackEnd