File indexing completed on 2024-05-05 04:39:25

0001 /*
0002     SPDX-FileCopyrightText: 2006 Matt Rogers <mattr@kde.org>
0003     SPDX-FileCopyrightText: 2007-2009 Aleix Pol <aleixpol@kde.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #ifndef CMAKEMANAGER_H
0009 #define CMAKEMANAGER_H
0010 
0011 #include <QList>
0012 #include <QPointer>
0013 #include <QString>
0014 #include <QVariant>
0015 
0016 #include <project/interfaces/iprojectfilemanager.h>
0017 #include <project/interfaces/ibuildsystemmanager.h>
0018 #include <project/abstractfilemanagerplugin.h>
0019 #include <sublime/message.h>
0020 #include <language/interfaces/ilanguagesupport.h>
0021 #include <interfaces/iplugin.h>
0022 
0023 #include "cmakeprojectdata.h"
0024 #include "icmakemanager.h"
0025 
0026 class WaitAllJobs;
0027 struct CMakeProjectData;
0028 class QObject;
0029 class CMakeHighlighting;
0030 class CMakeDocumentation;
0031 
0032 namespace KDevelop
0033 {
0034     class IProject;
0035     class IProjectBuilder;
0036     class ICodeHighlighting;
0037     class ProjectFolderItem;
0038     class ProjectBaseItem;
0039     class ProjectFileItem;
0040     class ProjectTargetItem;
0041     class ParseJob;
0042     class ContextMenuExtension;
0043     class Context;
0044     class IRuntime;
0045 }
0046 
0047 class CMakeFolderItem;
0048 class CTestSuite;
0049 class CTestFindJob;
0050 
0051 class CMakeManager
0052     : public KDevelop::AbstractFileManagerPlugin
0053     , public KDevelop::IBuildSystemManager
0054     , public KDevelop::ILanguageSupport
0055     , public ICMakeManager
0056 {
0057 Q_OBJECT
0058 Q_INTERFACES( KDevelop::IBuildSystemManager )
0059 Q_INTERFACES( KDevelop::IProjectFileManager )
0060 Q_INTERFACES( KDevelop::ILanguageSupport )
0061 Q_INTERFACES( ICMakeManager )
0062 public:
0063     explicit CMakeManager( QObject* parent = nullptr, const QVariantList& args = QVariantList() );
0064 
0065     ~CMakeManager() override;
0066 
0067     Features features() const override { return Features(Folders | Targets | Files ); }
0068     KDevelop::IProjectBuilder* builder() const override;
0069     bool hasBuildInfo(KDevelop::ProjectBaseItem*) const override;
0070     KDevelop::Path buildDirectory(KDevelop::ProjectBaseItem*) const override;
0071     KDevelop::Path::List includeDirectories(KDevelop::ProjectBaseItem *) const override;
0072     KDevelop::Path::List frameworkDirectories(KDevelop::ProjectBaseItem *item) const override;
0073     QHash<QString, QString> defines(KDevelop::ProjectBaseItem *) const override;
0074     QString extraArguments(KDevelop::ProjectBaseItem *item) const override;
0075 
0076     KDevelop::ProjectTargetItem* createTarget( const QString&, KDevelop::ProjectFolderItem* ) override { return nullptr; }
0077 
0078     virtual QList<KDevelop::ProjectTargetItem*> targets() const;
0079     QList<KDevelop::ProjectTargetItem*> targets(KDevelop::ProjectFolderItem* folder) const override;
0080     bool addFilesToTarget( const QList<KDevelop::ProjectFileItem*> &files, KDevelop::ProjectTargetItem* target) override;
0081 
0082     bool removeTarget( KDevelop::ProjectTargetItem* ) override { return false; }
0083     bool removeFilesFromTargets( const QList<KDevelop::ProjectFileItem*> &files ) override;
0084 
0085     KDevelop::ProjectFolderItem* import( KDevelop::IProject *project ) override;
0086     KJob* createImportJob(KDevelop::ProjectFolderItem* item) override;
0087     bool reload(KDevelop::ProjectFolderItem*) override;
0088 
0089 
0090     KDevelop::ProjectFolderItem* createFolderItem(KDevelop::IProject* project, const KDevelop::Path& path, KDevelop::ProjectBaseItem* parent = nullptr) override;
0091     QPair<QString, QString> cacheValue(KDevelop::IProject* project, const QString& id) const override;
0092     
0093     //LanguageSupport
0094     QString name() const override;
0095     KDevelop::ParseJob *createParseJob(const KDevelop::IndexedString &url) override;
0096     KDevelop::ICodeHighlighting* codeHighlighting() const override;
0097     QPair<QWidget*, KTextEditor::Range> specialLanguageObjectNavigationWidget(const QUrl& url, const KTextEditor::Cursor& position) override;
0098 
0099     static KDevelop::IndexedString languageName();
0100 
0101     int perProjectConfigPages() const override;
0102     KDevelop::ConfigPage* perProjectConfigPage(int number, const KDevelop::ProjectConfigOptions& options, QWidget* parent) override;
0103 
0104     void integrateData(const CMakeProjectData &data, KDevelop::IProject* project,
0105                        const QSharedPointer<CMakeServer>& server = {});
0106 
0107     KDevelop::Path compiler(KDevelop::ProjectTargetItem * p) const override;
0108 
0109 private Q_SLOTS:
0110     void projectClosing(KDevelop::IProject*);
0111 
0112 private:
0113     void reloadProjects();
0114     CMakeFile fileInformation(KDevelop::ProjectBaseItem* item) const;
0115     CMakeTarget targetInformation(KDevelop::ProjectTargetItem* item) const;
0116 
0117     void folderAdded(KDevelop::ProjectFolderItem* folder);
0118     KTextEditor::Range termRangeAtPosition(const KTextEditor::Document* textDocument,
0119                                            const KTextEditor::Cursor& position) const;
0120 
0121     void showConfigureOutdatedMessage(const KDevelop::IProject& project);
0122     void showConfigureErrorMessage(const KDevelop::IProject& project, const QString& errorMessage);
0123     void showConfigureStatusMessage(const KDevelop::IProject& project, const QString& messageText,
0124                                     Sublime::Message::MessageType messageType);
0125 
0126     KJob* createImportJob(KDevelop::ProjectFolderItem* item, bool forceConfigure);
0127 
0128 private:
0129     struct PerProjectData
0130     {
0131         CMakeProjectData data;
0132         QSharedPointer<CMakeServer> server;
0133         QVector<CTestSuite*> testSuites;
0134         QVector<CTestFindJob*> testSuiteJobs;
0135     };
0136     QHash<KDevelop::IProject*, PerProjectData> m_projects;
0137     // When an error occurs during the initial project import, the project is not inserted into m_projects, but the
0138     // project's status message must be stored to remove it once obsolete. Thus a separate QHash for the messages.
0139     QHash<const KDevelop::IProject*, QPointer<Sublime::Message>> m_configureStatusMessages;
0140     KDevelop::ICodeHighlighting* m_highlight;
0141 };
0142 
0143 #endif
0144 
0145