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)