ClangFormat: Add caching of current style

Previously, ClangFormat was getting the style for a file
every time styleForFile was called, which could cause
unnecessary delays and impact performance. This commit
adds caching of the current style with a timeout of 1s,
so that ClangFormat can quickly access the cached style
instead of recalculating it each time.

Change-Id: I33c114d51d6ce1acd0b6d9d2a28e2b6712e149dd
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Artem Sokolovskii
2023-05-12 11:57:26 +02:00
parent 375db16ac4
commit 74f77f6407
3 changed files with 46 additions and 7 deletions

View File

@@ -774,10 +774,28 @@ clang::format::FormatStyle overrideStyle(const Utils::FilePath &fileName)
return currentSettingsStyle; return currentSettingsStyle;
} }
clang::format::FormatStyle ClangFormatBaseIndenter::styleForFile() const static std::chrono::milliseconds getCacheTimeout()
{ {
if (getCurrentOverriddenSettings(m_fileName)) using namespace std::chrono_literals;
return overrideStyle(m_fileName); bool ok = false;
const int envCacheTimeout = qEnvironmentVariableIntValue("CLANG_FORMAT_CACHE_TIMEOUT", &ok);
return ok ? std::chrono::milliseconds(envCacheTimeout) : 1s;
}
const clang::format::FormatStyle &ClangFormatBaseIndenter::styleForFile() const
{
using namespace std::chrono_literals;
static const std::chrono::milliseconds cacheTimeout = getCacheTimeout();
QDateTime time = QDateTime::currentDateTime();
if (m_cachedStyle.expirationTime > time && !(m_cachedStyle.style == clang::format::getNoStyle()))
return m_cachedStyle.style;
if (getCurrentOverriddenSettings(m_fileName)) {
clang::format::FormatStyle style = overrideStyle(m_fileName);
m_cachedStyle.setCache(style, cacheTimeout);
return m_cachedStyle.style;
}
llvm::Expected<clang::format::FormatStyle> styleFromProjectFolder llvm::Expected<clang::format::FormatStyle> styleFromProjectFolder
= clang::format::getStyle("file", = clang::format::getStyle("file",
@@ -788,14 +806,17 @@ clang::format::FormatStyle ClangFormatBaseIndenter::styleForFile() const
if (styleFromProjectFolder && !(*styleFromProjectFolder == clang::format::getNoStyle())) { if (styleFromProjectFolder && !(*styleFromProjectFolder == clang::format::getNoStyle())) {
addQtcStatementMacros(*styleFromProjectFolder); addQtcStatementMacros(*styleFromProjectFolder);
return *styleFromProjectFolder; m_cachedStyle.setCache(*styleFromProjectFolder, cacheTimeout);
return m_cachedStyle.style;
} }
handleAllErrors(styleFromProjectFolder.takeError(), [](const llvm::ErrorInfoBase &) { handleAllErrors(styleFromProjectFolder.takeError(), [](const llvm::ErrorInfoBase &) {
// do nothing // do nothing
}); });
return qtcStyle();
m_cachedStyle.setCache(qtcStyle(), 0ms);
return m_cachedStyle.style;
} }
} // namespace ClangFormat } // namespace ClangFormat

View File

@@ -46,7 +46,7 @@ public:
std::optional<int> margin() const override; std::optional<int> margin() const override;
clang::format::FormatStyle styleForFile() const; const clang::format::FormatStyle &styleForFile() const;
protected: protected:
virtual bool formatCodeInsteadOfIndent() const { return false; } virtual bool formatCodeInsteadOfIndent() const { return false; }
@@ -71,6 +71,18 @@ private:
ReplacementsToKeep replacementsToKeep, ReplacementsToKeep replacementsToKeep,
const QChar &typedChar = QChar::Null, const QChar &typedChar = QChar::Null,
bool secondTry = false) const; bool secondTry = false) const;
struct CachedStyle {
clang::format::FormatStyle style = clang::format::getNoStyle();
QDateTime expirationTime;
void setCache(clang::format::FormatStyle newStyle, std::chrono::milliseconds timeout)
{
style = newStyle;
expirationTime = QDateTime::currentDateTime() + timeout;
}
};
mutable CachedStyle m_cachedStyle;
}; };
} // namespace ClangFormat } // namespace ClangFormat

View File

@@ -31,7 +31,7 @@ using namespace Utils;
namespace ClangFormat { namespace ClangFormat {
clang::format::FormatStyle qtcStyle() clang::format::FormatStyle calculateQtcStyle()
{ {
clang::format::FormatStyle style = getLLVMStyle(); clang::format::FormatStyle style = getLLVMStyle();
style.Language = FormatStyle::LK_Cpp; style.Language = FormatStyle::LK_Cpp;
@@ -179,6 +179,12 @@ clang::format::FormatStyle qtcStyle()
return style; return style;
} }
clang::format::FormatStyle qtcStyle()
{
static clang::format::FormatStyle style = calculateQtcStyle();
return style;
}
QString projectUniqueId(ProjectExplorer::Project *project) QString projectUniqueId(ProjectExplorer::Project *project)
{ {
if (!project) if (!project)