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

0001 /*
0002     SPDX-FileCopyrightText: 2014 Milian Wolff <mail@milianw.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "clangparsingenvironmentfile.h"
0008 
0009 #include "parsesession.h"
0010 #include "clangparsingenvironment.h"
0011 
0012 #include "../util/clangdebug.h"
0013 
0014 using namespace KDevelop;
0015 
0016 class ClangParsingEnvironmentFileData : public ParsingEnvironmentFileData
0017 {
0018 public:
0019     ClangParsingEnvironmentFileData()
0020         : ParsingEnvironmentFileData()
0021         , environmentHash(0)
0022         , tuUrl()
0023         , quality(ClangParsingEnvironment::Unknown)
0024     {
0025     }
0026 
0027     ClangParsingEnvironmentFileData(const ClangParsingEnvironmentFileData& rhs)
0028         : ParsingEnvironmentFileData(rhs)
0029         , environmentHash(rhs.environmentHash)
0030         , tuUrl(rhs.tuUrl)
0031         , quality(rhs.quality)
0032     {
0033     }
0034 
0035     ~ClangParsingEnvironmentFileData() = default;
0036 
0037     uint environmentHash;
0038     IndexedString tuUrl;
0039     ClangParsingEnvironment::Quality quality;
0040 };
0041 
0042 ClangParsingEnvironmentFile::ClangParsingEnvironmentFile(const IndexedString& url,
0043                                                          const ClangParsingEnvironment& environment)
0044     : ParsingEnvironmentFile(*(new ClangParsingEnvironmentFileData), url)
0045 {
0046   d_func_dynamic()->setClassId(this);
0047   setEnvironment(environment);
0048   setLanguage(ParseSession::languageString());
0049 }
0050 
0051 ClangParsingEnvironmentFile::ClangParsingEnvironmentFile(ClangParsingEnvironmentFileData& data)
0052     : ParsingEnvironmentFile(data)
0053 {
0054 }
0055 
0056 ClangParsingEnvironmentFile::~ClangParsingEnvironmentFile() = default;
0057 
0058 int ClangParsingEnvironmentFile::type() const
0059 {
0060     return CppParsingEnvironment;
0061 }
0062 
0063 bool ClangParsingEnvironmentFile::needsUpdate(const ParsingEnvironment* environment) const
0064 {
0065     if (environment) {
0066         Q_ASSERT(dynamic_cast<const ClangParsingEnvironment*>(environment));
0067         auto env = static_cast<const ClangParsingEnvironment*>(environment);
0068         if (env->quality() > d_func()->quality) {
0069             clangDebug() << "Found better quality environment, require update:" << url()
0070                 << "new environment quality:" << env->quality()
0071                 << "old environment quality:" << d_func()->quality;
0072             return true;
0073         }
0074         if (env->translationUnitUrl() == d_func()->tuUrl && env->hash() != d_func()->environmentHash) {
0075             clangDebug() << "TU environment changed, require update" << url() << "TU url:" << env->translationUnitUrl() << "old hash:" << d_func()->environmentHash << "new hash:" << env->hash();
0076             return true;
0077         }
0078     }
0079 
0080     bool ret = KDevelop::ParsingEnvironmentFile::needsUpdate(environment);
0081     if (ret) {
0082         clangDebug() << "modification revision requires update:" << url();
0083     }
0084     return ret;
0085 }
0086 
0087 void ClangParsingEnvironmentFile::setEnvironment(const ClangParsingEnvironment& environment)
0088 {
0089     d_func_dynamic()->tuUrl = environment.translationUnitUrl();
0090     d_func_dynamic()->environmentHash = environment.hash();
0091     d_func_dynamic()->quality = environment.quality();
0092 }
0093 
0094 bool ClangParsingEnvironmentFile::matchEnvironment(const ParsingEnvironment* environment) const
0095 {
0096     return dynamic_cast<const ClangParsingEnvironment*>(environment);
0097 }
0098 
0099 ClangParsingEnvironment::Quality ClangParsingEnvironmentFile::environmentQuality() const
0100 {
0101     return d_func()->quality;
0102 }
0103 
0104 uint ClangParsingEnvironmentFile::environmentHash() const
0105 {
0106     return d_func()->environmentHash;
0107 }
0108 
0109 DUCHAIN_DEFINE_TYPE(ClangParsingEnvironmentFile)