› kde

Today, after a bit more than a month since I started working on it, I merged the projectfilter branches into KDevplatform/KDevelop. This is a generic configuration interface and library which allows users to customize which folders/files KDevelop includes in a project.

How to use it

Context Menu

The simplest way to use the new code to exclude items from a project, is to use the context menu. Simply right click on any folder/file (not the project root, or anything target related) and choose the “exclude item from project” action. This will then add a filter for the selected item(s). If you want to undo this, go to the project configuration (see below) and remove the filter.

Configuration

For more advanced management of project filters, or to remove filters and/or adapt the default filters, you need to go to the project configuration and select the new “Project Filter” config page. This allows you to add new filters, remove existing ones or edit them, including reordering them.

How it works

The pattern syntax uses QRegExp::WildcardUnix on relative project paths. This should be fairly easy to grasp and similar to what you know from e.g. .gitignore or svn:ignore. Generally, if you can write a .gitignore file then you should be able to configure your KDevelop project as well!

If you wonder what you can do with the include/exclude pattern type, see again the documentation of .gitignore and it’s !pattern syntax. It allows you to selectively unhide some paths which where previously hidden. E.g. you can only show *.cpp files in your project by first excluding all files * and then adding an inclusive pattern for *.cpp.

Note that the distinction between files/folders is probably not required most of the time. It does allow for some better performance though and may make some patterns more easy to write.

Note to Users-Who-Compile-Master-From-Source

Those of you who build KDevelop/KDevplatfrom from git master, please make sure to remove kcm_kdev_genericprojectmanagersettings.so and just to make sure also remove kcm_kdev_genericprojectmanagersettings.desktop. Otherwise you’ll get the old generic manager configuration alongside the new project filter, which may break things.

If you install KDevelop via the package manager of your distribution, you should have nothing to do but wait until we release a new KDevelop version (4.6) which will then include this new feature!

Anyhow, please test this and report bugs on bugs.kde.org. Feature requests also welcome, but I like that this new UI is rather simple and still powerful. I’m reluctant to add more here. Something which I do want to implement in the future though is support for reading e.g. .gitignore files and hiding files based on that from the project. The new API I added to KDevplatform should make this rather easy btw. You/I just have to write a new plugin implementing the IProjectFilterProvider interface and then we could e.g. query git directly for whether a given path is included or not.

I’ve been gone for eight days and returned just a few hours ago to Berlin. It doesn’t feel like that. The last days went by in a blur of awesomeness! The reason why I didn’t write a single blog post in between is just that I never had a spare minute for that. I arrived on Thursday and instantly enjoyed the warmth of Spain / the Basque country and had a tasty and cheap Menu del Dia at a local Restaurant with fellow KDABians and other KDE friends. Then just a few hours later the first party started, near the old district of the city - amazing!
More and more hackers and helpers arrived, the atmosphere was once again so good. The social aspect of this years Akademy was without comparison in my opinion - seriously: Hats off to the local team, you did an amazing job!

While the social events on the following days have been just as awesome or even awesomer to awesomest - I especially enjoyed the day trip and jumping into the ocean! - the technical side of Akademy delivered just as well: My favorite talks this year where Mirko’s about ThreadWeaver, which we heavily use in KDevelop. His roadmap and polished API looks much better than what we have nowadays and should allow for much nicer code which might even perform better - kudos!

Oh boy, I already wrote a lot, yet only covered the first three days… After the AGM and presentations on the week end followed a full week of highly educational BoF’s - both around KDE topics (such as KF5, KDevelop, …) or “plain” Qt during the Qt Contributor Summit. This was my first time attending the QtCS and I definitely want to see more of this! Discussing the future of QtWebKit and learning more about whats cooking in QtCore was certainly worth it. Being in contact to the QtCreator and QML guys also helps from a tooling point of view in general and from a KDevelop pov in particular. Oh and we got a nice BlackBerry Z10 phone - many thanks for that!

The afternoons are mostly a blur - I mostly remember lots of Foosball, Socializing, Drinking, meeting Friends of Old and New, Eating, Partying etc. pp.

Anyhow, I think I need to stop here.

tl;dr; Thank you local KDE team for organizing such an awesome Akademy + QtCS 2013! Thank you Sponsors for making this possible!

PS: All of you who attended talks on the weekend: Go and rate them! The speakers will love you and provide you with even better talks next year! Go to either the page for the talks on saturday or the talks on sunday, then pick the sessions you attended and finally hit the “Feedback” link!

PPS: I definitely have to come back to the Basque country, the country side looked beautiful and Bilbao alone is worth the trip! And I didn’t even have time to visit the Guggenheim…

you didn’t hear anything from me since quite some time… Thing is, this is my last “regular” semester of university where I have two lab courses that are very time demanding. The year after, I’ll be spending time on my master thesis, which hopefully will allow for some more leisure time for KDE.

Anyhow, a small project which I just worked on to write some small lines of code again was to make my BKO backtrace highlighter work on Chromium. It requires the Tampermonkey extension to get more compatibility with Greasemonkey of Firefox fame, otherwise it works more or less out of the box!

After fixing some small other inconsistencies I can now say that it works fine in both, Firefox and Chromium! I furthermore took the liberty to extend its functionality a bit: You now also get highlighted Valgrind traces, i.e. generated by memcheck and other error reporting tools - yay!

highlighting of a Valgrind memcheck trace on bugs.kde.org with additional navigation helpers, using Chromium

Oh and before I forget it: See you all next week at Akademy! I’m so looking forward for the intense hacking and socializing, esp. since I missed last year! And: If you are interested in how to improve the performance of your application(s), make sure to attend my talk on Sunday: Apps On Speed

Thankfully someone stood up and started contributing - none other than Andrea Scarpino of ArchLinux KDE/Qt packaging fame. With some help of me and Sven he managed to get the JavaScript support into a much more shiny state - behold:

Colorful JavaScript Analysis in KDevelop

For simple JavaScript files we already have proper context browsing, uses and declarations. And all that in just a few lines of code thanks to the good work of the QtCreator team, whose JavaScript/QML parser we use (which is the one of the most complicated parts of a language support plugin). Thanks again, guys!

The next steps on the JavaScript side will be proper support for objects and prototypes - I’m interested to see how we can cope with that. Then we’ll need support for built-in APIs such as DOM window, document and such. But we’ll keep the other use-cases of JavaScript in mind, like using it to extend your own applications (see e.g. Kate).

Anyone else out there who wants to help? Or maybe someone wants to work on our QML support? We KDevelop hackers would be happy to help!

I’m investigating the feasibility of allowing a subset of C++11 in the KDevelop code base, starting after the branch of 4.5 in a few weeks. I do not want to blindly start going that route just to realize afterwards that I’ve alienated a large portion of our user base. Thus I’d very much welcome if you could read through this blog post and give some feedback which we can build our decision on top.

Here’s the email I sent to the KDevelop development mailing list:

Is anyone opposed to open KDevelop 4.6 for C++11? I.e. that means we continue
to work as-is and provide a kick-ass KDevelop 4.5. Once we branch 4.5, we
enable C++11 mode globally and start using it in master.

Reasons:

KDevelop is a free time project and it should be fun to work on it. C++11 is
quite a lot of fun, if not only because it’s new. This is actually the main
reason for me to go down the C++11 route. This would also allow us to learn
C+11 which is a benefit for those of us who do professional work-work
programming.

Potential Issues:

FreeBSD situation? http://wiki.freebsd.org/NewC%2B%2BStack <— I’m not sure
how far they are. But quite frankly, I’d say they can stick to KDevelop 4.5
until they have a modern compiler like clang 3.1.

Debian? Wheezy should come with GCC 4.7 if I’m not mistaken:
http://packages.debian.org/wheezy/gcc Imo it’s fine if we only support that
version of Debian. All other distros probably already have GCC 4.7 available,
or will have it in their next distro release in time for KDevelop 4.6

Windows? If anything breaks on MSVC it’s imo not an issue as KDevelop is
defacto dead on Windows (noone is working on it there). Also considering that
the windows team is actually working on proper C++11 support (see link above)
its only a matter of time until it has everything we need.

Backporting: Now this is imo a potential issue, but considering that we
don’t do such a good job in that regard anyways, it’s not that big a deal…
And most of the fixes we do backport are oneliners which could be done in the
4.5 branches and forward ported to 4.6.

More Issues

So far a few more concerns where raised:

Mac OSX: only “recent” Mac OSX come with a clang that is new enough. Question is: Which version is that exactly? Do people use KDevelop on an older Mac OS? My personal impression was that most Mac users upgrade asap to the newest OS version, thus this should not be an issue?

Windows: While the team around Herb Sutter is doing a tremendous job in advancing the compiler to provide kick-ass standard support, apparently the Windows users are reluctant to upgrade… But the obvious question is: Should we be held back by an imaginary Windows user base? KDevelop does compile on Windows, and mostly works but afaik there are still some very sore spots, esp. in the CMake project management and the lack of a MSVC debugger integration. Anyhow, would allowing C++11 in the KDevelop code base make it considerably harder for potential contributors? Considering that even now we do not get any contributions from Windows users, I doubt it can get any worse… But I do see that it’s a hen/egg problem.

BSD: FreeBSD is in the process of using Clang. But is that process already finished? If not, is there any ETA? Will there be Clang 3.1? What about other BSDs and Unixoids?

What about unsupported platforms?

Personally, I think KDevelop is currently in a pretty good shape. If some platforms would have to stick to KDevelop 4.5, I don’t see such a big issue in that. We could also think about making it our first “LTS” release and backport essential bug fixes for a longer period.

Why not the Qt way?

Qt 5 makes use of C++11 features where possible in a backwards compatible way. It is of course the correct choice for a library that wants to support multiple platforms. But imo, KDevelop does not have such strict requirements. Rather, it should offer maintainable code that is fun to work on. Thus I am stricly against introducing Q_DECL_CONSTEXPR in our code, instead of using constexpr directly. And of course, in Qt you cannot use auto, nor lambdas, nor many other things as you always have to provide a C++03 fallback.

Lets try it out, no?

As Aleix pointed out, I’ll probably just start a new branch and introduce some C++11 features there. Then we can see whether the gain in code readability or performance is worth the introduction of the mandatory C++11 requirement.

Before I continue blogging about actual coding achievements, I must mention something else: Many many thanks to Niko’s company Vivid Planet for sponsoring one awesome dinner here at the KDevelop/Kate sprint in Vieanna. The Schnitzel and beer was much appreciated :)

So besides the promising work towards a JavaScript/QML plugin for KDevelop, what have I been up to in the past days?

Merging Code

Static Code Analysis

I spent a considerable amount of time to review some feature branches and working towards integrating them. This means that now Aleix’s master thesis work was merged. This one is about a static analysis framework, which he has implemented for C++. This should allow his other work to be merged as well eventually, showing control flow graphs or writing checkers like finding inquired include statements. I hope he’ll blog about that eventually.

File & Project Templates

Furthermore, I’ve finally merged Miha’s GSOC Code which gives us a much better project template support. Furthermore, you can now create (and share!) file templates. A few good examples are the existing QTestLib template e.g. I’m pretty sure that what we have right now is quite cool already. It needs to be polished though to make it nicer to use. Suggestions and bug reports welcome!

Rename file after renaming a class

Unit testing

Another feature that Miha worked on was unit test integration for KDevelop. The branches for that are now also merged into master, awaiting testing and feedback. Aleix and Niko also worked on improving it already, so I hope they will all blog about it.

Rename File Assistant

Aleix had a pending review request which renames the host file when you used ‘Rename Declaration’ on a class. I’ve included that and fixed the implementation. Furthermore, I’ve integrated it into the existing rename assistant, fixing a few bugs there while at it. This is a quite nice addition I think! Please test it and report bugs or suggestions.

Other Stuff

Besides merging other people’s work and improving it, I actually spend some time on new stuff on my own :)

Uses in Tool View

Have you ever tried the “show uses” action from the context browser tooltip? It worked but you had to be really careful in not moving the mouse anywhere such that the tooltip was closed… That just sucked. I now fixed this to always use the tool view instead to show the uses. Looking at that code part though made me realize that some serious cleanup work should be done there eventually… And the UI also could use a serious make over, it looks pretty ugly imo. But while at it, I’ve also fixed the bug where the uses in the uses widget where marked with a yellow background without overwriting the foreground color. This yielded unreadable results (white text on bright yellow) for dark color scheme users.

Cleaned Up Open With

Open With

Triggered by a review request I decided to cleanup our Open With plugin. Now, the actions are properly grouped and show whether they open an external app or whether they have an embedded editor. I also took the liberty to rename “Advanced Embedded Text Editor” (i.e. Katepart) to “Default Editor”. Oh and see how it’s bold-fonted? Thats the currently configured option by the user. For .ui files e.g. the designer is usually selected. I think the new UI is so simple that we don’t need any extra configuration dialog for that.

Wow… the last days are a blur. I hoped to blog more but once more failed at doing so. What an awesome sprint this is… Once again, many thanks to Joseph for organizing this! But lets now blog about really noteworthy stuff!

Inline Syntax Errors for QML in KDevelop

QML/JS language support

Aleix was doing quite some QML work-work recently. Sadly KDevelop has no language support for that, so to stay productive you start to use Qt Creator for the QML files sooner or later. This is of course perfectly fine, except for those people that love to use Kate e.g. or for those that prefer our interpretation of the IDE metaphor and C++ language support. So what should we do about that? Right, lets write a QML/JS Plugin.

Cannot Parse

But writing a KDevelop language plugin is not an easy task. To get something useful, probably the most essential ingredient is a proper language parser. And of course that is nothing you do over night. Furthermore, you should always try to not write that stuff on your own, instead leverage the work done by others. This is what Aleix did. We now use an internal copy (not a fork, see below) of the QML/JS parser from Qt Creator. I’ve wrapped that in the basic KDevelop language plugin code. Without much work we are now already able to show syntax errors inside the editor for JavaScript and QML files!

Inline Syntax Errors for JavaScript in KDevelop

The Future

Of course it is still a long long way until we even get close to the feature set offered by Qt Creator for QML files. I’m quite sure though that we will continue to work on that. Considering more and more people relying on QML/JS for their UI work, or looking at the role of JS in the web, I think this is an essential step towards a better KDevelop.

So what are the next steps? Personally, I think we should try to whip up a basic DUChain integration that gives you some context browsing. Once that is done, try to support imports such that we can figure out the QML API for Qt built in files. Then, we can think about kick-ass code completion. It’s going to take time but we can do it!

Legalese

Now I said this is not a fork, and I mean it. We copied the code since there is no reusable library (and that just makes sense, you don’t want to keep a stable API for a language AST). I’ve added a README to the copy though, that reads the following:

This contents of this folder can be found in src/libs/. For license information see
LICENSE.LGPL and LGPLG_EXCEPTION.TXT.

NOTE: This is not a fork! Do not touch anything beside the CMake build files.
Everything else must stay in sync. If you find a bug or have an improvement,
make sure to contribute it back to Qt Creator! This plugin would not be possible
without their work, so that is the least we can do.

I mean what I wrote there. Many many thanks to the work done by the diligent Trolls and Nokia for creating a reusable parser for QML/JS. I’ve talked with a few Qt Creator developers over the years, and they are a nice bunch of talented developers. I tip my virtual hat and bow to their achievements.

And last but not least: Thanks Aleix for doing the dirty lib import and CMake build system so I could concentrate on the KDevelop language plugin integration :) Without you I wouldn’t have done that! And once more many thanks to the KDE e.V. and Joseph for making the sprint possible!