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

0001 /*
0002     SPDX-FileCopyrightText: 2014 Olivier de Gaalon <olivier.jg@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "clangpch.h"
0008 
0009 #include <language/duchain/duchain.h>
0010 
0011 #include "clanghelpers.h"
0012 #include "util/clangtypes.h"
0013 #include "clangparsingenvironment.h"
0014 
0015 using namespace KDevelop;
0016 
0017 namespace {
0018 
0019 //Map a file from one translation unit to another
0020 inline CXFile mapFile(CXFile file, CXTranslationUnit tu)
0021 {
0022     return clang_getFile(tu, ClangString(clang_getFileName(file)).c_str());
0023 }
0024 
0025 }
0026 
0027 ClangPCH::ClangPCH(const ClangParsingEnvironment& environment, ClangIndex* index)
0028     : m_session({})
0029 {
0030     const auto& pchInclude = environment.pchInclude();
0031     Q_ASSERT(pchInclude.isValid());
0032 
0033     const TopDUContext::Features pchFeatures = TopDUContext::AllDeclarationsContextsUsesAndAST;
0034     const IndexedString doc(pchInclude.pathOrUrl());
0035 
0036     ClangParsingEnvironment pchEnv;
0037     pchEnv.setPchInclude(Path());
0038     pchEnv.setTranslationUnitUrl(doc);
0039     m_session.setData(ParseSessionData::Ptr(new ParseSessionData({}, index, pchEnv, ParseSessionData::PrecompiledHeader)));
0040 
0041     if (!m_session.unit()) {
0042         return;
0043     }
0044 
0045     auto imports = ClangHelpers::tuImports(m_session.unit());
0046     m_context = ClangHelpers::buildDUChain(m_session.mainFile(), imports, m_session, pchFeatures, m_includes, {}, {});
0047 }
0048 
0049 IncludeFileContexts ClangPCH::mapIncludes(CXTranslationUnit tu) const
0050 {
0051     IncludeFileContexts mapped;
0052     mapped.reserve(m_includes.size());
0053     for (auto it = m_includes.constBegin(); it != m_includes.constEnd(); ++it) {
0054         mapped.insert(::mapFile(it.key(), tu), it.value());
0055     }
0056     return mapped;
0057 }
0058 
0059 CXFile ClangPCH::mapFile(CXTranslationUnit tu) const
0060 {
0061     return ::mapFile(m_session.mainFile(), tu);
0062 }
0063 
0064 ReferencedTopDUContext ClangPCH::context() const
0065 {
0066     return m_context;
0067 }