KDevelop5/LanguagePlugin: Difference between revisions

    From KDE TechBase
    No edit summary
    m (Add syntaxhighlight)
     
    (6 intermediate revisions by 3 users not shown)
    Line 4: Line 4:


    * <code>X-KDE-Library=...</code> this must be the same as the name of your library, i.e. look into the <code>CMakeLists.txt</code> for your <code>kde4_add_plugin</code> line and use the same name
    * <code>X-KDE-Library=...</code> this must be the same as the name of your library, i.e. look into the <code>CMakeLists.txt</code> for your <code>kde4_add_plugin</code> line and use the same name
    * <code>X-KDE-PluginInfo-Name=...</code> this must be the same as the name of your plugin in the code, i.e. look into your main plugin .cpp file and find the <code>K_EXPORT_PLUGIN</code> line, more exactly the first argument to the <code>KAboutData</code>.
    * <code>X-KDE-PluginInfo-Name=...</code> this must be a unique name that is used to reference and find your plugin.


    After installing your plugin, make sure to run <code>kbuildsycoca4</code>. For testing, try duchainify or ktraderclient.
    After installing your plugin, make sure to run <code>kbuildsycoca4</code>. For testing, try duchainify or ktraderclient.
    Line 12: Line 12:
    A basic plugin's header looks like this:
    A basic plugin's header looks like this:


    <pre>
    <syntaxhighlight lang="cpp">
    #include <interfaces/iplugin.h>
    #include <interfaces/iplugin.h>
    #include <language/interfaces/ilanguagesupport.h>
    #include <language/interfaces/ilanguagesupport.h>
    Line 21: Line 21:
         Q_INTERFACES( KDevelop::ILanguageSupport )
         Q_INTERFACES( KDevelop::ILanguageSupport )
         public:
         public:
             explicit KDevQmlJsPlugin( QObject* parent, const QVariantList& args = QVariantList() );
             explicit KDevTestLangPlugin( QObject* parent, const QVariantList& args = QVariantList() );
              
              
             virtual KDevelop::ParseJob* createParseJob(const KUrl& url);
             virtual KDevelop::ParseJob* createParseJob(const KDevelop::IndexedString& url);
             virtual QString name() const;
             virtual QString name() const;
    };
    };
    </pre>
    </syntaxhighlight>


    An implementation could look like this:
    An implementation could look like this:


    <pre>
    <syntaxhighlight lang="cpp">


    #include "kdevqmljsplugin.h"
    #include "kdevtestlangplugin.h"
    #include <KPluginFactory>
    #include <KPluginFactory>
    #include <KAboutData>
    #include <KAboutData>


    #include "qmljsparsejob.h"
    #include "testlangparsejob.h"


    K_PLUGIN_FACTORY(KDevQmlJsSupportFactory, registerPlugin<KDevQmlJsPlugin>(); )
    K_PLUGIN_FACTORY(KDevTestLangSupportFactory, registerPlugin<KDevTestLangPlugin>(); )
    // note: "kdevtestlangsupport" must be the same as you used in X-KDE-PluginInfo-Name!
    K_EXPORT_PLUGIN(KDevTestLangSupportFactory(KAboutData("kdevtestlangsupport",0, ki18n("TestLanguage Support"), "0.1", ki18n("Support for Some Test Language"), KAboutData::License_GPL)))
    K_EXPORT_PLUGIN(KDevQmlJsSupportFactory(KAboutData("kdevtestlangsupport","kdevtestlang", ki18n("TestLanguage Support"), "0.1", ki18n("Support for Some Test Language"), KAboutData::License_GPL)))


    KDevQmlJsPlugin::KDevQmlJsPlugin(QObject* parent, const QVariantList& )
    using namespace KDevelop;
         : KDevelop::IPlugin( KDevQmlJsSupportFactory::componentData(), parent )
     
         , KDevelop::ILanguageSupport()
    KDevTestLangPlugin::KDevTestLangPlugin(QObject* parent, const QVariantList& )
         : IPlugin( KDevTestLangSupportFactory::componentData(), parent )
         , ILanguageSupport()
    {
    {
         // NOTE: this is important!
         // NOTE: this is important!
         KDEV_USE_EXTENSION_INTERFACE(KDevelop::ILanguageSupport)
         KDEV_USE_EXTENSION_INTERFACE(ILanguageSupport)
    }
    }


    KDevelop::ParseJob* KDevTestLangPlugin::createParseJob(const KUrl& url)
    ParseJob* KDevTestLangPlugin::createParseJob(const IndexedString& url)
    {
    {
         return new TestLangParseJob(url, this);
         return new TestLangParseJob(url, this);
    Line 60: Line 61:
         return "testlang";
         return "testlang";
    }
    }
    </pre>
    </syntaxhighlight>

    Latest revision as of 18:37, 18 August 2019

    .desktop file

    In order to find your language support plugin, KDE needs a .desktop file with some meta information.

    • X-KDE-Library=... this must be the same as the name of your library, i.e. look into the CMakeLists.txt for your kde4_add_plugin line and use the same name
    • X-KDE-PluginInfo-Name=... this must be a unique name that is used to reference and find your plugin.

    After installing your plugin, make sure to run kbuildsycoca4. For testing, try duchainify or ktraderclient.

    the plugin

    A basic plugin's header looks like this:

    #include <interfaces/iplugin.h>
    #include <language/interfaces/ilanguagesupport.h>
    
    class KDevTestLangPlugin : public KDevelop::IPlugin, public KDevelop::ILanguageSupport
    {
        Q_OBJECT
        Q_INTERFACES( KDevelop::ILanguageSupport )
        public:
            explicit KDevTestLangPlugin( QObject* parent, const QVariantList& args = QVariantList() );
            
            virtual KDevelop::ParseJob* createParseJob(const KDevelop::IndexedString& url);
            virtual QString name() const;
    };
    

    An implementation could look like this:

    #include "kdevtestlangplugin.h"
    #include <KPluginFactory>
    #include <KAboutData>
    
    #include "testlangparsejob.h"
    
    K_PLUGIN_FACTORY(KDevTestLangSupportFactory, registerPlugin<KDevTestLangPlugin>(); )
    K_EXPORT_PLUGIN(KDevTestLangSupportFactory(KAboutData("kdevtestlangsupport",0, ki18n("TestLanguage Support"), "0.1", ki18n("Support for Some Test Language"), KAboutData::License_GPL)))
    
    using namespace KDevelop;
    
    KDevTestLangPlugin::KDevTestLangPlugin(QObject* parent, const QVariantList& )
         : IPlugin( KDevTestLangSupportFactory::componentData(), parent )
         , ILanguageSupport()
    {
        // NOTE: this is important!
        KDEV_USE_EXTENSION_INTERFACE(ILanguageSupport)
    }
    
    ParseJob* KDevTestLangPlugin::createParseJob(const IndexedString& url)
    {
        return new TestLangParseJob(url, this);
    }
    
    QString KDevTestLangPlugin::name() const
    {
        // some unique id for your language
        return "testlang";
    }