forked from qt-creator/qt-creator
Do not automatically setup a clangd that is too old and mark them as invalid if they are manually selected. Change-Id: Ie9662a8821df8fc678eabc4b8a08375723b4d1c3 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: hjk <hjk@qt.io>
67 lines
2.0 KiB
C++
67 lines
2.0 KiB
C++
// Copyright (C) 2023 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
|
|
|
#include "clangutils.h"
|
|
|
|
#include "filepath.h"
|
|
#include "qtcprocess.h"
|
|
#include "utilstr.h"
|
|
|
|
#include <QVersionNumber>
|
|
|
|
namespace Utils {
|
|
|
|
static QVersionNumber getClangdVersion(const FilePath &clangdFilePath)
|
|
{
|
|
QtcProcess clangdProc;
|
|
clangdProc.setCommand({clangdFilePath, {"--version"}});
|
|
clangdProc.runBlocking();
|
|
if (clangdProc.result() != ProcessResult::FinishedWithSuccess)
|
|
return {};
|
|
const QString output = clangdProc.allOutput();
|
|
static const QString versionPrefix = "clangd version ";
|
|
const int prefixOffset = output.indexOf(versionPrefix);
|
|
if (prefixOffset == -1)
|
|
return {};
|
|
return QVersionNumber::fromString(output.mid(prefixOffset + versionPrefix.length()));
|
|
}
|
|
|
|
QVersionNumber clangdVersion(const FilePath &clangd)
|
|
{
|
|
static QHash<FilePath, QPair<QDateTime, QVersionNumber>> versionCache;
|
|
const QDateTime timeStamp = clangd.lastModified();
|
|
const auto it = versionCache.find(clangd);
|
|
if (it == versionCache.end()) {
|
|
const QVersionNumber version = getClangdVersion(clangd);
|
|
versionCache.insert(clangd, {timeStamp, version});
|
|
return version;
|
|
}
|
|
if (it->first != timeStamp) {
|
|
it->first = timeStamp;
|
|
it->second = getClangdVersion(clangd);
|
|
}
|
|
return it->second;
|
|
}
|
|
|
|
bool checkClangdVersion(const FilePath &clangd, QString *error)
|
|
{
|
|
const QVersionNumber version = clangdVersion(clangd);
|
|
if (version >= minimumClangdVersion())
|
|
return true;
|
|
if (error) {
|
|
*error = version.isNull()
|
|
? Tr::tr("Failed to retrieve clangd version: Unexpected clangd output.")
|
|
: Tr::tr("The clangd version is %1, but %2 or greater is required.")
|
|
.arg(version.toString())
|
|
.arg(minimumClangdVersion().majorVersion());
|
|
}
|
|
return false;
|
|
}
|
|
|
|
QVersionNumber minimumClangdVersion()
|
|
{
|
|
return QVersionNumber(14);
|
|
}
|
|
|
|
} // namespace Utils
|