Creating Language Plugin not used for new language

Roland Plüss roland at
Fri Sep 14 17:41:05 BST 2018

Seems some caching got me. I had test files open before installing the
Kate XML file and it seems KDevelop remembered the "no highlighting"
setting and did not automatically adjust. When I opened a new file I
never opened it worked with auto-selection.

Now something else. I've got quite a problem with this configuration
here and I'm at a loss on how I do it correctly.

My language plugin has a bunch of documentary source files it installs
into the shared directly alongside the plugin library. These are
syntactically valid files only serving to parse the basic language
classes available. I based this concept on the python plugin. So far
this works with one major problem. When I open KDevelop and it opens a
previously opened source file all the uses are broken. It seems the
language plugin provided documentary source files are not automatically
loaded and/or the source files are not re-processed if these basic
language files are parsed.

I tried fixing the problem with "context imports" like this:

    const QVector<ReferencedTopDUContext> contexts(
Helpers::getDocumentationFileContexts() );
    QList<QPair<TopDUContext*, CursorInRevision>> imports;
    foreach( const ReferencedTopDUContext &each, contexts ){
        imports.append( qMakePair( each, CursorInRevision( 1, 0 ) ) );
    top->addImportedParentContexts( imports );

This is called from the ContextBuilder whener a top context is created:

   TopDUContext *ContextBuilder::newTopContext( const RangeInRevision
&range, ParsingEnvironmentFile *file ) { ... }

In my understanding this should be like an implicit "import/include" of
all the basic language files in every source file parsed. Nevertheless
the uses are broken when I open KDevelop with a previously opened file.

What am I not understanding here?

NOTE: To be complete here the implementation of

    QVector<ReferencedTopDUContext> Helpers::getDocumentationFileContexts(){
        if( ! documentationFileContextsReady ){
            const QVector<IndexedString> &files = getDocumentationFiles();
            if( documentationFileContexts.isEmpty() ){
                foreach( const IndexedString &file, files ){
ReferencedTopDUContext() );
            documentationFileContextsReady = true;
            for( int i=0; i<documentationFileContexts.size(); i++ ){
                if( i ) ){
                documentationFileContexts.replace( i,
                    DUChain::self()->chainForDocument( i ) ) ) );
                if( ! i ) ){
                    // basic language information not parse yet. parse
it at high priority
                    documentationFileContextsReady = false;
ICore::self()->languageController()->backgroundParser()->addDocument( i ),
                        0, ParseJob::FullSequentialProcessing );
        QVector<ReferencedTopDUContext> contexts;
        foreach( const ReferencedTopDUContext &context,
documentationFileContexts ){
            if( context ){
                contexts.append( context );
        return contexts;

I experiment a lot with this stuff looking at the python plugin to
figure out how this is supposed to work. As I understand it I need to
parse the files with the background parser. What I don't get though is
how I can link this "in the process of being parsed" source files to
actual source files opened in KDevelop. I think I am missing here
something but without proper documentation I'm guessing around left and

Mit freundlichen Grüssen
Plüss Roland

Leader und Head Programmer
- Game: Epsylon ( )
- Game Engine: Drag[en]gine (
, )
- Sowie verschiedene Blender Export-Skripts und Game-Tools

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: OpenPGP digital signature
URL: <>

More information about the KDevelop-devel mailing list