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 }