From 4e83fb7953fb670abd4de1b685ef0142da241cba Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Tue, 21 Feb 2012 16:52:28 +0100
Subject: [PATCH] Port Qt Creator to the new plugin system of Qt 5.

- Add Q_PLUGIN_METADATA for Qt 5, use Q_EXPORT_PLUGIN
  for Qt 4.
- Generate the Json files for Qt 5 from the pluginspec
  files by using a XSLT sheet.

Change-Id: I8653f182ae7d61615971c093df10b84fb06c2172
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
---
 src/libs/extensionsystem/iplugin.h            | 15 +++++++++++
 .../qtcomponents/styleitem/qstyleplugin.cpp   |  2 ++
 .../qtcomponents/styleitem/qstyleplugin.h     |  5 ++++
 .../qtcomponents/styleitem/styleitem.json     |  1 +
 src/pluginjsonmetadata.xsl                    | 27 +++++++++++++++++++
 src/plugins/analyzerbase/analyzerplugin.h     |  1 +
 .../autotoolsprojectplugin.h                  |  3 +++
 src/plugins/bazaar/bazaarplugin.h             |  1 +
 src/plugins/bineditor/bineditorplugin.h       |  1 +
 src/plugins/bookmarks/bookmarksplugin.h       |  1 +
 src/plugins/classview/classviewplugin.h       |  1 +
 .../cmakeprojectmanager/cmakeprojectplugin.h  |  1 +
 src/plugins/coreplugin/coreplugin.h           |  1 +
 src/plugins/cpaster/cpasterplugin.h           |  1 +
 src/plugins/cppeditor/cppplugin.h             |  1 +
 src/plugins/cpptools/cpptoolsplugin.h         |  1 +
 src/plugins/cvs/cvsplugin.h                   |  1 +
 src/plugins/debugger/debuggerplugin.h         |  1 +
 src/plugins/designer/formeditorplugin.h       |  1 +
 src/plugins/fakevim/fakevimplugin.h           |  1 +
 src/plugins/find/findplugin.h                 |  1 +
 .../genericprojectplugin.h                    |  1 +
 src/plugins/git/gitplugin.h                   |  1 +
 src/plugins/glsleditor/glsleditorplugin.h     |  1 +
 src/plugins/helloworld/helloworldplugin.h     |  1 +
 src/plugins/help/helpplugin.h                 |  1 +
 src/plugins/imageviewer/imageviewerplugin.h   |  1 +
 src/plugins/locator/locatorplugin.h           |  5 ++++
 src/plugins/macros/macrosplugin.h             |  1 +
 src/plugins/madde/maddeplugin.h               |  2 ++
 src/plugins/mercurial/mercurialplugin.h       |  1 +
 src/plugins/perforce/perforceplugin.h         |  1 +
 src/plugins/projectexplorer/projectexplorer.h |  1 +
 src/plugins/qmldesigner/qmldesignerplugin.h   |  1 +
 src/plugins/qmljseditor/qmljseditorplugin.h   |  1 +
 .../qmljsinspector/qmljsinspectorplugin.h     |  1 +
 src/plugins/qmljstools/qmljstoolsplugin.h     |  1 +
 src/plugins/qmlprofiler/qmlprofilerplugin.h   |  1 +
 .../qmlprojectmanager/qmlprojectplugin.h      |  1 +
 .../qt4projectmanagerplugin.h                 |  1 +
 src/plugins/qtsupport/qtsupportplugin.h       |  1 +
 src/plugins/remotelinux/remotelinuxplugin.h   |  1 +
 .../resourceeditor/resourceeditorplugin.h     |  1 +
 src/plugins/subversion/subversionplugin.h     |  1 +
 src/plugins/tasklist/tasklistplugin.h         |  1 +
 src/plugins/texteditor/texteditorplugin.h     |  1 +
 src/plugins/todo/todoplugin.h                 |  2 ++
 src/plugins/updateinfo/updateinfoplugin.h     |  2 ++
 src/plugins/valgrind/valgrindplugin.h         |  1 +
 src/plugins/vcsbase/vcsplugin.h               |  1 +
 src/plugins/welcome/welcomeplugin.h           |  2 ++
 src/qtcreatorplugin.pri                       | 16 +++++++++++
 52 files changed, 122 insertions(+)
 create mode 100644 src/libs/qtcomponents/styleitem/styleitem.json
 create mode 100644 src/pluginjsonmetadata.xsl

diff --git a/src/libs/extensionsystem/iplugin.h b/src/libs/extensionsystem/iplugin.h
index 37f474a09ce..598eef9aab4 100644
--- a/src/libs/extensionsystem/iplugin.h
+++ b/src/libs/extensionsystem/iplugin.h
@@ -36,6 +36,9 @@
 #include "extensionsystem_global.h"
 
 #include <QObject>
+#if QT_VERSION >= 0x050000
+#    include <QtPlugin>
+#endif
 
 namespace ExtensionSystem {
 
@@ -83,4 +86,16 @@ private:
 
 } // namespace ExtensionSystem
 
+// The macros Q_EXPORT_PLUGIN, Q_EXPORT_PLUGIN2 become obsolete in Qt 5.
+#if QT_VERSION >= 0x050000
+#    if defined(Q_EXPORT_PLUGIN)
+#        undef Q_EXPORT_PLUGIN
+#        undef Q_EXPORT_PLUGIN2
+#    endif
+#    define Q_EXPORT_PLUGIN(plugin)
+#    define Q_EXPORT_PLUGIN2(function, plugin)
+#else
+#    define Q_PLUGIN_METADATA(x)
+#endif
+
 #endif // IPLUGIN_H
diff --git a/src/libs/qtcomponents/styleitem/qstyleplugin.cpp b/src/libs/qtcomponents/styleitem/qstyleplugin.cpp
index d615bd4a2f4..4eb4427ff3b 100644
--- a/src/libs/qtcomponents/styleitem/qstyleplugin.cpp
+++ b/src/libs/qtcomponents/styleitem/qstyleplugin.cpp
@@ -95,4 +95,6 @@ void StylePlugin::initializeEngine(QDeclarativeEngine *engine, const char *uri)
     engine->addImageProvider("desktoptheme", new DesktopIconProvider);
 }
 
+#if QT_VERSION < 0x050000
 Q_EXPORT_PLUGIN2(styleplugin, StylePlugin)
+#endif
diff --git a/src/libs/qtcomponents/styleitem/qstyleplugin.h b/src/libs/qtcomponents/styleitem/qstyleplugin.h
index 74cf097a2e7..c10d5a5e023 100644
--- a/src/libs/qtcomponents/styleitem/qstyleplugin.h
+++ b/src/libs/qtcomponents/styleitem/qstyleplugin.h
@@ -50,6 +50,11 @@
 class StylePlugin : public QDeclarativeExtensionPlugin
 {
     Q_OBJECT
+#if QT_VERSION >= 0x050000
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDeclarativeExtensionInterface" FILE "styleitem.json")
+    Q_INTERFACES(QDeclarativeExtensionInterface)
+#endif
+
 public:
     void registerTypes(const char *uri);
     void initializeEngine(QDeclarativeEngine *engine, const char *uri);
diff --git a/src/libs/qtcomponents/styleitem/styleitem.json b/src/libs/qtcomponents/styleitem/styleitem.json
new file mode 100644
index 00000000000..0967ef424bc
--- /dev/null
+++ b/src/libs/qtcomponents/styleitem/styleitem.json
@@ -0,0 +1 @@
+{}
diff --git a/src/pluginjsonmetadata.xsl b/src/pluginjsonmetadata.xsl
new file mode 100644
index 00000000000..dff00332b72
--- /dev/null
+++ b/src/pluginjsonmetadata.xsl
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!-- XSL sheet to transform Qt Creator's pluginspec files into json files required
+     for the new Qt 5 plugin system. -->
+<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:strip-space elements="plugin vendor category description url"/>
+<xsl:template match="/">
+{
+    <xsl:apply-templates/>
+}
+</xsl:template>
+<xsl:template match="license"/>
+<xsl:template match="dependencyList"/>
+<xsl:template match="copyright"/>
+<xsl:template match="argumentList"/>
+<xsl:template match="vendor">
+"Vendor" : "<xsl:apply-templates/>",
+</xsl:template>
+<xsl:template match="category">
+"Category" : "<xsl:apply-templates/>",
+</xsl:template>
+<xsl:template match="description">
+"Description" : "<xsl:apply-templates/>",
+</xsl:template>
+<xsl:template match="url">
+"Url" : "<xsl:apply-templates/>"
+</xsl:template>
+</xsl:stylesheet>
diff --git a/src/plugins/analyzerbase/analyzerplugin.h b/src/plugins/analyzerbase/analyzerplugin.h
index 7db7c8c2064..da5d80588ce 100644
--- a/src/plugins/analyzerbase/analyzerplugin.h
+++ b/src/plugins/analyzerbase/analyzerplugin.h
@@ -43,6 +43,7 @@ namespace Internal {
 class AnalyzerPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "AnalyzerBase.json")
 
 public:
     static AnalyzerPlugin *instance();
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectplugin.h b/src/plugins/autotoolsprojectmanager/autotoolsprojectplugin.h
index e7210d0ac32..2e46de17467 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsprojectplugin.h
+++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectplugin.h
@@ -70,6 +70,9 @@ namespace Internal {
 
 class AutotoolsProjectPlugin : public ExtensionSystem::IPlugin
 {
+    Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "AutotoolsProjectManager.json")
+
 public:
     AutotoolsProjectPlugin();
 
diff --git a/src/plugins/bazaar/bazaarplugin.h b/src/plugins/bazaar/bazaarplugin.h
index dff76119778..f64372c814d 100644
--- a/src/plugins/bazaar/bazaarplugin.h
+++ b/src/plugins/bazaar/bazaarplugin.h
@@ -81,6 +81,7 @@ class BazaarEditor;
 class BazaarPlugin : public VcsBase::VcsBasePlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Bazaar.json")
 
 public:
     BazaarPlugin();
diff --git a/src/plugins/bineditor/bineditorplugin.h b/src/plugins/bineditor/bineditorplugin.h
index 2db7c380010..b4fd4050892 100644
--- a/src/plugins/bineditor/bineditorplugin.h
+++ b/src/plugins/bineditor/bineditorplugin.h
@@ -60,6 +60,7 @@ class BinEditorFactory;
 class BinEditorPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "BinEditor.json")
 
 public:
     BinEditorPlugin();
diff --git a/src/plugins/bookmarks/bookmarksplugin.h b/src/plugins/bookmarks/bookmarksplugin.h
index 2607ebcb213..7f03ce93b8a 100644
--- a/src/plugins/bookmarks/bookmarksplugin.h
+++ b/src/plugins/bookmarks/bookmarksplugin.h
@@ -59,6 +59,7 @@ class BookmarkManager;
 class BookmarksPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Bookmarks.json")
 
 public:
     BookmarksPlugin();
diff --git a/src/plugins/classview/classviewplugin.h b/src/plugins/classview/classviewplugin.h
index 912856b064f..3a0f8d455a4 100644
--- a/src/plugins/classview/classviewplugin.h
+++ b/src/plugins/classview/classviewplugin.h
@@ -46,6 +46,7 @@ namespace Internal {
 class Plugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "ClassView.json")
 
 public:
     //! Constructor
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.h b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.h
index 913f1b2ced6..f876807d595 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.h
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.h
@@ -44,6 +44,7 @@ class CMakeProjectPlugin
   : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "CMakeProjectManager.json")
 
 public:
     CMakeProjectPlugin();
diff --git a/src/plugins/coreplugin/coreplugin.h b/src/plugins/coreplugin/coreplugin.h
index 947abf800f6..e8a444b3e5e 100644
--- a/src/plugins/coreplugin/coreplugin.h
+++ b/src/plugins/coreplugin/coreplugin.h
@@ -45,6 +45,7 @@ class MainWindow;
 class CorePlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Core.json")
 
 public:
     CorePlugin();
diff --git a/src/plugins/cpaster/cpasterplugin.h b/src/plugins/cpaster/cpasterplugin.h
index 4b50faa91ce..f7c93526b53 100644
--- a/src/plugins/cpaster/cpasterplugin.h
+++ b/src/plugins/cpaster/cpasterplugin.h
@@ -63,6 +63,7 @@ public slots:
 class CodepasterPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "CodePaster.json")
 
 public:
     CodepasterPlugin();
diff --git a/src/plugins/cppeditor/cppplugin.h b/src/plugins/cppeditor/cppplugin.h
index acc251e5cb8..3b42b0b28b2 100644
--- a/src/plugins/cppeditor/cppplugin.h
+++ b/src/plugins/cppeditor/cppplugin.h
@@ -55,6 +55,7 @@ class CppQuickFixAssistProvider;
 class CppPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "CppEditor.json")
 
 public:
     CppPlugin();
diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h
index 51319ffc965..b4b167b9a1a 100644
--- a/src/plugins/cpptools/cpptoolsplugin.h
+++ b/src/plugins/cpptools/cpptoolsplugin.h
@@ -63,6 +63,7 @@ struct CppFileSettings;
 class CppToolsPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "CppTools.json")
 
 public:
     CppToolsPlugin();
diff --git a/src/plugins/cvs/cvsplugin.h b/src/plugins/cvs/cvsplugin.h
index f95caff99c1..6f077e61a1a 100644
--- a/src/plugins/cvs/cvsplugin.h
+++ b/src/plugins/cvs/cvsplugin.h
@@ -74,6 +74,7 @@ struct CvsResponse
 class CvsPlugin : public VcsBase::VcsBasePlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "CVS.json")
 
 public:
     CvsPlugin();
diff --git a/src/plugins/debugger/debuggerplugin.h b/src/plugins/debugger/debuggerplugin.h
index c18f93bbe90..48504595729 100644
--- a/src/plugins/debugger/debuggerplugin.h
+++ b/src/plugins/debugger/debuggerplugin.h
@@ -53,6 +53,7 @@ class DebuggerStartParameters;
 class DEBUGGER_EXPORT DebuggerPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Debugger.json")
 
 public:
     DebuggerPlugin();
diff --git a/src/plugins/designer/formeditorplugin.h b/src/plugins/designer/formeditorplugin.h
index a6a9bab9597..6d11abeb037 100644
--- a/src/plugins/designer/formeditorplugin.h
+++ b/src/plugins/designer/formeditorplugin.h
@@ -41,6 +41,7 @@ namespace Internal {
 class FormEditorPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Designer.json")
 
 public:
     FormEditorPlugin();
diff --git a/src/plugins/fakevim/fakevimplugin.h b/src/plugins/fakevim/fakevimplugin.h
index 88f60f619c2..c7dba08b426 100644
--- a/src/plugins/fakevim/fakevimplugin.h
+++ b/src/plugins/fakevim/fakevimplugin.h
@@ -44,6 +44,7 @@ class FakeVimPluginPrivate;
 class FakeVimPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "FakeVim.json")
 
 public:
     FakeVimPlugin();
diff --git a/src/plugins/find/findplugin.h b/src/plugins/find/findplugin.h
index f5862087dbf..9a34b9a3c9d 100644
--- a/src/plugins/find/findplugin.h
+++ b/src/plugins/find/findplugin.h
@@ -54,6 +54,7 @@ class CurrentDocumentFind;
 class FIND_EXPORT FindPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Find.json")
 
 public:
     FindPlugin();
diff --git a/src/plugins/genericprojectmanager/genericprojectplugin.h b/src/plugins/genericprojectmanager/genericprojectplugin.h
index 277d219d55f..29b1477fa91 100644
--- a/src/plugins/genericprojectmanager/genericprojectplugin.h
+++ b/src/plugins/genericprojectmanager/genericprojectplugin.h
@@ -51,6 +51,7 @@ class ProjectFilesFactory;
 class GenericProjectPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "GenericProjectManager.json")
 
 public:
     GenericProjectPlugin();
diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h
index e8c3d15f0ca..75bab4fc58d 100644
--- a/src/plugins/git/gitplugin.h
+++ b/src/plugins/git/gitplugin.h
@@ -86,6 +86,7 @@ typedef QPair<Utils::ParameterAction *, Core::Command* > ParameterActionCommandP
 class GitPlugin : public VcsBase::VcsBasePlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Git.json")
 
 public:
     GitPlugin();
diff --git a/src/plugins/glsleditor/glsleditorplugin.h b/src/plugins/glsleditor/glsleditorplugin.h
index 4951cdeb46b..37e892b4726 100644
--- a/src/plugins/glsleditor/glsleditorplugin.h
+++ b/src/plugins/glsleditor/glsleditorplugin.h
@@ -73,6 +73,7 @@ class GLSLQuickFixCollector;
 class GLSLEditorPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "GLSLEditor.json")
 
 public:
     GLSLEditorPlugin();
diff --git a/src/plugins/helloworld/helloworldplugin.h b/src/plugins/helloworld/helloworldplugin.h
index 3e0852ca651..0702513b256 100644
--- a/src/plugins/helloworld/helloworldplugin.h
+++ b/src/plugins/helloworld/helloworldplugin.h
@@ -42,6 +42,7 @@ class HelloWorldPlugin
   : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "HelloWorld.json")
 
 public:
     HelloWorldPlugin();
diff --git a/src/plugins/help/helpplugin.h b/src/plugins/help/helpplugin.h
index 17c01383188..4a0b10df123 100644
--- a/src/plugins/help/helpplugin.h
+++ b/src/plugins/help/helpplugin.h
@@ -70,6 +70,7 @@ class SearchWidget;
 class HelpPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Help.json")
 
 public:
     HelpPlugin();
diff --git a/src/plugins/imageviewer/imageviewerplugin.h b/src/plugins/imageviewer/imageviewerplugin.h
index 66aba081575..c077f7b767e 100644
--- a/src/plugins/imageviewer/imageviewerplugin.h
+++ b/src/plugins/imageviewer/imageviewerplugin.h
@@ -46,6 +46,7 @@ class ImageViewerFactory;
 class ImageViewerPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "ImageViewer.json")
 
 public:
     ImageViewerPlugin();
diff --git a/src/plugins/locator/locatorplugin.h b/src/plugins/locator/locatorplugin.h
index 8c5a56a9e7e..99913c1bfa8 100644
--- a/src/plugins/locator/locatorplugin.h
+++ b/src/plugins/locator/locatorplugin.h
@@ -44,6 +44,10 @@
 #include <QTimer>
 #include <QFutureWatcher>
 
+#if QT_VERSION >= 0x050000
+#    include <QtPlugin>
+#endif
+
 namespace Locator {
 namespace Internal {
 
@@ -56,6 +60,7 @@ class LocatorPlugin;
 class LocatorPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Locator.json")
 
 public:
     LocatorPlugin();
diff --git a/src/plugins/macros/macrosplugin.h b/src/plugins/macros/macrosplugin.h
index f434508480b..39c85476869 100644
--- a/src/plugins/macros/macrosplugin.h
+++ b/src/plugins/macros/macrosplugin.h
@@ -44,6 +44,7 @@ namespace Internal {
 class MacrosPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Macros.json")
 
 public:
     MacrosPlugin();
diff --git a/src/plugins/madde/maddeplugin.h b/src/plugins/madde/maddeplugin.h
index 1d686023424..60930b83c5a 100644
--- a/src/plugins/madde/maddeplugin.h
+++ b/src/plugins/madde/maddeplugin.h
@@ -41,6 +41,8 @@ namespace Internal {
 class MaddePlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Madde.json")
+
 public:
     MaddePlugin();
     ~MaddePlugin();
diff --git a/src/plugins/mercurial/mercurialplugin.h b/src/plugins/mercurial/mercurialplugin.h
index f020d672446..17596be5f35 100644
--- a/src/plugins/mercurial/mercurialplugin.h
+++ b/src/plugins/mercurial/mercurialplugin.h
@@ -68,6 +68,7 @@ class MercurialSettings;
 class MercurialPlugin : public VcsBase::VcsBasePlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Mercurial.json")
 
 public:
     MercurialPlugin();
diff --git a/src/plugins/perforce/perforceplugin.h b/src/plugins/perforce/perforceplugin.h
index 1c2f7ed36cf..51ae8cc2bd3 100644
--- a/src/plugins/perforce/perforceplugin.h
+++ b/src/plugins/perforce/perforceplugin.h
@@ -80,6 +80,7 @@ struct PerforceResponse
 class PerforcePlugin : public VcsBase::VcsBasePlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Perforce.json")
 
 public:
     PerforcePlugin();
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index 49145de8f21..c111150cb1a 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -72,6 +72,7 @@ class PROJECTEXPLORER_EXPORT ProjectExplorerPlugin
     : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "ProjectExplorer.json")
 
 public:
     ProjectExplorerPlugin();
diff --git a/src/plugins/qmldesigner/qmldesignerplugin.h b/src/plugins/qmldesigner/qmldesignerplugin.h
index ec5cbb9af31..87d192e24a8 100644
--- a/src/plugins/qmldesigner/qmldesignerplugin.h
+++ b/src/plugins/qmldesigner/qmldesignerplugin.h
@@ -65,6 +65,7 @@ class DesignModeContext;
 class BauhausPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "QmlDesigner.json")
 
 public:
     BauhausPlugin();
diff --git a/src/plugins/qmljseditor/qmljseditorplugin.h b/src/plugins/qmljseditor/qmljseditorplugin.h
index 1633f0fd84b..daafed94232 100644
--- a/src/plugins/qmljseditor/qmljseditorplugin.h
+++ b/src/plugins/qmljseditor/qmljseditorplugin.h
@@ -79,6 +79,7 @@ class QmlTaskManager;
 class QmlJSEditorPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "QmlJSEditor.json")
 
 public:
     QmlJSEditorPlugin();
diff --git a/src/plugins/qmljsinspector/qmljsinspectorplugin.h b/src/plugins/qmljsinspector/qmljsinspectorplugin.h
index 34bedf6d659..d3322121fda 100644
--- a/src/plugins/qmljsinspector/qmljsinspectorplugin.h
+++ b/src/plugins/qmljsinspector/qmljsinspectorplugin.h
@@ -52,6 +52,7 @@ class InspectorUi;
 class InspectorPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "QmlJSInspector.json")
 
 public:
     InspectorPlugin();
diff --git a/src/plugins/qmljstools/qmljstoolsplugin.h b/src/plugins/qmljstools/qmljstoolsplugin.h
index f35917fd4d8..54b8837a37d 100644
--- a/src/plugins/qmljstools/qmljstoolsplugin.h
+++ b/src/plugins/qmljstools/qmljstoolsplugin.h
@@ -56,6 +56,7 @@ class ModelManager;
 class QmlJSToolsPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "QmlJSTools.json")
 
 public:
     static QmlJSToolsPlugin *instance() { return m_instance; }
diff --git a/src/plugins/qmlprofiler/qmlprofilerplugin.h b/src/plugins/qmlprofiler/qmlprofilerplugin.h
index 624d2a69880..6e0512e2e08 100644
--- a/src/plugins/qmlprofiler/qmlprofilerplugin.h
+++ b/src/plugins/qmlprofiler/qmlprofilerplugin.h
@@ -43,6 +43,7 @@ namespace Internal {
 class QmlProfilerPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "QmlProfiler.json")
 
 public:
     QmlProfilerPlugin() {}
diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.h b/src/plugins/qmlprojectmanager/qmlprojectplugin.h
index 224c572aac6..c9b10b7fe79 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectplugin.h
+++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.h
@@ -42,6 +42,7 @@ namespace QmlProjectManager {
 class QMLPROJECTMANAGER_EXPORT QmlProjectPlugin: public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "QmlProjectManager.json")
 
 public:
     QmlProjectPlugin();
diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h
index c0bbe0ce3aa..aa80311bf0c 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h
+++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h
@@ -59,6 +59,7 @@ class ProFileEditorFactory;
 class Qt4ProjectManagerPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Qt4ProjectManager.json")
 
 public:
     Qt4ProjectManagerPlugin();
diff --git a/src/plugins/qtsupport/qtsupportplugin.h b/src/plugins/qtsupport/qtsupportplugin.h
index 8ea327febde..0400e313e9a 100644
--- a/src/plugins/qtsupport/qtsupportplugin.h
+++ b/src/plugins/qtsupport/qtsupportplugin.h
@@ -45,6 +45,7 @@ class ExamplesWelcomePage;
 class QtSupportPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "QtSupport.json")
 
 public:
     bool initialize(const QStringList &arguments, QString *errorMessage);
diff --git a/src/plugins/remotelinux/remotelinuxplugin.h b/src/plugins/remotelinux/remotelinuxplugin.h
index 4ea667c8448..f8cc714074a 100644
--- a/src/plugins/remotelinux/remotelinuxplugin.h
+++ b/src/plugins/remotelinux/remotelinuxplugin.h
@@ -41,6 +41,7 @@ namespace Internal {
 class RemoteLinuxPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "RemoteLinux.json")
 
 public:
     RemoteLinuxPlugin();
diff --git a/src/plugins/resourceeditor/resourceeditorplugin.h b/src/plugins/resourceeditor/resourceeditorplugin.h
index 60a5ee63af9..8415d623aad 100644
--- a/src/plugins/resourceeditor/resourceeditorplugin.h
+++ b/src/plugins/resourceeditor/resourceeditorplugin.h
@@ -49,6 +49,7 @@ class ResourceEditorFactory;
 class ResourceEditorPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "ResourceEditor.json")
 
 public:
     ResourceEditorPlugin();
diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h
index e3487521016..aaf504a1425 100644
--- a/src/plugins/subversion/subversionplugin.h
+++ b/src/plugins/subversion/subversionplugin.h
@@ -79,6 +79,7 @@ struct SubversionResponse
 class SubversionPlugin : public VcsBase::VcsBasePlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Subversion.json")
 
 public:
     SubversionPlugin();
diff --git a/src/plugins/tasklist/tasklistplugin.h b/src/plugins/tasklist/tasklistplugin.h
index c2647739869..57873d370db 100644
--- a/src/plugins/tasklist/tasklistplugin.h
+++ b/src/plugins/tasklist/tasklistplugin.h
@@ -47,6 +47,7 @@ class TaskListPluginPrivate;
 class TaskListPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "TaskList.json")
 
 public:
     TaskListPlugin();
diff --git a/src/plugins/texteditor/texteditorplugin.h b/src/plugins/texteditor/texteditorplugin.h
index 1927cf8bb07..d518a67897c 100644
--- a/src/plugins/texteditor/texteditorplugin.h
+++ b/src/plugins/texteditor/texteditorplugin.h
@@ -55,6 +55,7 @@ class BaseTextMarkRegistry;
 class TextEditorPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "TextEditor.json")
 
 public:
     TextEditorPlugin();
diff --git a/src/plugins/todo/todoplugin.h b/src/plugins/todo/todoplugin.h
index efac7a23233..537d89d735c 100755
--- a/src/plugins/todo/todoplugin.h
+++ b/src/plugins/todo/todoplugin.h
@@ -49,6 +49,8 @@ class TodoItem;
 class TodoPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Todo.json")
+
 public:
     TodoPlugin();
     ~TodoPlugin();
diff --git a/src/plugins/updateinfo/updateinfoplugin.h b/src/plugins/updateinfo/updateinfoplugin.h
index fdc4c4c0e5b..0c8511e6c64 100644
--- a/src/plugins/updateinfo/updateinfoplugin.h
+++ b/src/plugins/updateinfo/updateinfoplugin.h
@@ -45,6 +45,8 @@ class UpdateInfoPluginPrivate;
 class UpdateInfoPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "UpdateInfo.json")
+
 public:
     UpdateInfoPlugin();
     virtual ~UpdateInfoPlugin();
diff --git a/src/plugins/valgrind/valgrindplugin.h b/src/plugins/valgrind/valgrindplugin.h
index 937ce38d962..9aa9e9c946e 100644
--- a/src/plugins/valgrind/valgrindplugin.h
+++ b/src/plugins/valgrind/valgrindplugin.h
@@ -44,6 +44,7 @@ namespace Internal {
 class ValgrindPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Valgrind.json")
 
 public:
     ValgrindPlugin() {}
diff --git a/src/plugins/vcsbase/vcsplugin.h b/src/plugins/vcsbase/vcsplugin.h
index 0147ece563b..d60f13c2c14 100644
--- a/src/plugins/vcsbase/vcsplugin.h
+++ b/src/plugins/vcsbase/vcsplugin.h
@@ -51,6 +51,7 @@ class CoreListener;
 class VcsPlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "VcsBase.json")
 
 public:
     VcsPlugin();
diff --git a/src/plugins/welcome/welcomeplugin.h b/src/plugins/welcome/welcomeplugin.h
index 68664e3103d..32cfb79e9f6 100644
--- a/src/plugins/welcome/welcomeplugin.h
+++ b/src/plugins/welcome/welcomeplugin.h
@@ -47,6 +47,8 @@ class WelcomeMode;
 class WelcomePlugin : public ExtensionSystem::IPlugin
 {
     Q_OBJECT
+    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Welcome.json")
+
 public:
     WelcomePlugin();
 
diff --git a/src/qtcreatorplugin.pri b/src/qtcreatorplugin.pri
index 1e659e6ab8d..53ceac018b9 100644
--- a/src/qtcreatorplugin.pri
+++ b/src/qtcreatorplugin.pri
@@ -57,6 +57,22 @@ copy2build.name = COPY ${QMAKE_FILE_IN}
 copy2build.CONFIG += no_link
 QMAKE_EXTRA_COMPILERS += copy2build
 
+greaterThan(QT_MAJOR_VERSION, 4) {
+#   Create a Json file containing the plugin information required by
+#   Qt 5's plugin system by running a XSLT sheet on the
+#   pluginspec file before moc runs.
+    XMLPATTERNS = $$targetPath($$[QT_INSTALL_BINS]/xmlpatterns)
+
+    pluginspec2json.name = Create Qt 5 plugin json file
+    pluginspec2json.input = PLUGINSPEC
+    pluginspec2json.variable_out = GENERATED_FILES
+    pluginspec2json.output = $${TARGET}.json
+    pluginspec2json.commands = $$XMLPATTERNS -no-format -output $$pluginspec2json.output $$PWD/pluginjsonmetadata.xsl $$PLUGINSPEC
+    pluginspec2json.CONFIG += no_link
+    moc_header.depends += $$pluginspec2json.output
+    QMAKE_EXTRA_COMPILERS += pluginspec2json
+}
+
 macx {
     !isEmpty(TIGER_COMPAT_MODE) {
         QMAKE_LFLAGS_SONAME = -Wl,-install_name,@executable_path/../PlugIns/$${PROVIDER}/
-- 
GitLab