// 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 "qbslanguageclient.h" #include "qbsproject.h" #include "qbssettings.h" #include #include #include #include #include #include #include #include #include using namespace Core; using namespace LanguageClient; using namespace TextEditor; using namespace Utils; namespace QbsProjectManager::Internal { class QbsLanguageClientInterface : public LocalSocketClientInterface { public: QbsLanguageClientInterface(const QString &serverPath, const FilePath &qbsExecutable) : LocalSocketClientInterface(serverPath), m_qbsExecutable(qbsExecutable) {} private: Utils::FilePath serverDeviceTemplate() const override{ return m_qbsExecutable; }; const FilePath m_qbsExecutable; }; class QbsLanguageClient::Private { public: Private(QbsLanguageClient * q) : q(q) {} void checkDocument(IDocument *document); QbsLanguageClient * const q; QPointer buildSystem; }; QbsLanguageClient::QbsLanguageClient(const QString &serverPath, QbsBuildSystem *buildSystem) : Client(new QbsLanguageClientInterface( serverPath, QbsSettings::qbsExecutableFilePath(*buildSystem->kit()))) , d(new Private(this)) { d->buildSystem = buildSystem; setName(QString::fromLatin1("qbs@%1").arg(serverPath)); setCurrentBuildConfiguration(buildSystem->buildConfiguration()); LanguageFilter langFilter; langFilter.mimeTypes << Utils::Constants::QBS_MIMETYPE; setSupportedLanguage(langFilter); connect(EditorManager::instance(), &EditorManager::documentOpened, this, [this](IDocument *document) { d->checkDocument(document); }); const QList &allDocuments = DocumentModel::openedDocuments(); for (IDocument * const document : allDocuments) d->checkDocument(document); start(); } QbsLanguageClient::~QbsLanguageClient() { delete d; } bool QbsLanguageClient::isActive() const { if (!d->buildSystem) return false; if (!d->buildSystem->project()->activeBuildConfiguration()) return false; if (d->buildSystem->project()->activeBuildSystem() != d->buildSystem) return false; return true; } void QbsLanguageClient::Private::checkDocument(IDocument *document) { if (const auto doc = qobject_cast(document)) q->openDocument(doc); } } // namespace QbsProjectManager::Internal