2021-04-20 14:42:29 +02:00
|
|
|
/****************************************************************************
|
|
|
|
|
**
|
|
|
|
|
** Copyright (C) 2021 The Qt Company Ltd.
|
|
|
|
|
** Contact: https://www.qt.io/licensing/
|
|
|
|
|
**
|
|
|
|
|
** This file is part of Qt Creator.
|
|
|
|
|
**
|
|
|
|
|
** Commercial License Usage
|
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
|
|
|
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
|
|
|
** information use the contact form at https://www.qt.io/contact-us.
|
|
|
|
|
**
|
|
|
|
|
** GNU General Public License Usage
|
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
|
|
|
** General Public License version 3 as published by the Free Software
|
|
|
|
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
|
|
|
|
** included in the packaging of this file. Please review the following
|
|
|
|
|
** information to ensure the GNU General Public License requirements will
|
|
|
|
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
|
|
|
|
**
|
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include "clangdclient.h"
|
|
|
|
|
|
|
|
|
|
#include <cpptools/cppcodemodelsettings.h>
|
|
|
|
|
#include <cpptools/cpptoolsreuse.h>
|
|
|
|
|
#include <languageclient/languageclientinterface.h>
|
|
|
|
|
|
|
|
|
|
using namespace LanguageClient;
|
2021-04-20 15:46:35 +02:00
|
|
|
using namespace LanguageServerProtocol;
|
2021-04-20 14:42:29 +02:00
|
|
|
|
|
|
|
|
namespace ClangCodeModel {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
|
|
|
|
static Q_LOGGING_CATEGORY(clangdLog, "qtc.clangcodemodel.clangd", QtWarningMsg);
|
|
|
|
|
|
2021-04-20 15:46:35 +02:00
|
|
|
static QString indexingToken() { return "backgroundIndexProgress"; }
|
|
|
|
|
|
2021-04-20 14:42:29 +02:00
|
|
|
static BaseClientInterface *clientInterface(const Utils::FilePath &jsonDbDir)
|
|
|
|
|
{
|
2021-04-30 08:25:10 +02:00
|
|
|
Utils::CommandLine cmd{CppTools::codeModelSettings()->clangdFilePath(),
|
|
|
|
|
{"--index", "--background-index", "--limit-results=0"}};
|
2021-04-20 14:42:29 +02:00
|
|
|
if (!jsonDbDir.isEmpty())
|
2021-04-30 08:25:10 +02:00
|
|
|
cmd.addArg("--compile-commands-dir=" + jsonDbDir.toString());
|
2021-04-20 14:42:29 +02:00
|
|
|
if (clangdLog().isDebugEnabled())
|
2021-04-30 08:25:10 +02:00
|
|
|
cmd.addArgs({"--log=verbose", "--pretty"});
|
2021-04-20 14:42:29 +02:00
|
|
|
const auto interface = new StdIOClientInterface;
|
2021-04-30 08:25:10 +02:00
|
|
|
interface->setCommandLine(cmd);
|
2021-04-20 14:42:29 +02:00
|
|
|
return interface;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ClangdClient::ClangdClient(ProjectExplorer::Project *project, const Utils::FilePath &jsonDbDir)
|
|
|
|
|
: Client(clientInterface(jsonDbDir))
|
|
|
|
|
{
|
|
|
|
|
setName(tr("clangd"));
|
|
|
|
|
LanguageFilter langFilter;
|
|
|
|
|
langFilter.mimeTypes = QStringList{"text/x-chdr", "text/x-c++hdr", "text/x-c++src",
|
|
|
|
|
"text/x-objc++src", "text/x-objcsrc"};
|
|
|
|
|
setSupportedLanguage(langFilter);
|
|
|
|
|
LanguageServerProtocol::ClientCapabilities caps = Client::defaultClientCapabilities();
|
|
|
|
|
caps.clearExperimental();
|
|
|
|
|
caps.clearTextDocument();
|
|
|
|
|
setClientCapabilities(caps);
|
|
|
|
|
setLocatorsEnabled(false);
|
2021-04-20 15:46:35 +02:00
|
|
|
setProgressTitleForToken(indexingToken(), tr("Parsing C/C++ Files (clangd)"));
|
2021-04-20 14:42:29 +02:00
|
|
|
setCurrentProject(project);
|
2021-04-20 15:46:35 +02:00
|
|
|
connect(this, &Client::workDone, this, [this](const ProgressToken &token) {
|
|
|
|
|
const QString * const val = Utils::get_if<QString>(&token);
|
|
|
|
|
if (val && *val == indexingToken())
|
|
|
|
|
m_isFullyIndexed = true;
|
|
|
|
|
});
|
2021-04-20 14:42:29 +02:00
|
|
|
start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace ClangCodeModel
|