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