sábado, 29 de marzo de 2008

Levi's awesome patch

Yesterday Levi Bard (tak) sent a patch that adds code completion to members and local variables in CBinding (MonoDevelop's C/C++ binding). So that is right, the most often requested feature is now commited in trunk!

Thanks Levi!

Forgot to mention that it is not context sensitive, so local variables to one function will be available for completion in other functions, and conflicts will arise when different variables have the same name (even if they exist in different scopes). For this reason completion for local variables can be turned off in the C/C++ Preferences.

If only we had a C++ parser... things would be much better.

viernes, 11 de enero de 2008

Tag Parsing Improvements

Well, well, first post since the end of SoC 2007... whooops!
The reason I haven't blogged in so long is because I have been working very little on CBinding, just fixing simple bugs and adding small features, nothing really worth mentioning. But I think I have finally done something worth announcing!

First off, to build the class pad from from the output of ctags, one has to do a lot of searching in the outputted tags because the tags are not outputted in a hierarchical manner, they are just outputted as a list of tags and each tag entry is marked with the 'parent' tag (namespace, class, struct etc., if any). My original implementation was to do a linear search every time I needed to find a specific tag and I just left it at that and forgot about it. As you have probably noticed, CBinding takes quite some time parsing the tags, this is especially noticeable when parsing the system tags which tend to be many.

Luckily, ctags outputs sorted tags, so I recently changed the search algorithm from linear to binary, which greatly decreases the time it takes to parse tag files, here are some numbers for parsing one of my project's tags (this includes parsing system tags):
before: 102,640 milliseconds
after: 15,731 milliseconds

Nice! well, to be honest I still think it is rather slow... next I'm going to try to implement some caching to improve this even more.

viernes, 7 de septiembre de 2007

CBinding on main trunk!

It seems I didn't completely screw up this summer with CBinding, so it is now on the main MonoDevelop trunk :) :)

To try out CBinding from now on all you have to do is run configure/autogen.sh with --enable-c and thats it!

CBinding is functional on svn as of revision 85496.

Hope you enjoy and don't forget to get those bugs reported ;)

sábado, 18 de agosto de 2007

Twelfth Status Report

This week I mostly did small improvements and fixed bugs, among the more notable I made certain paths to be serialized as relative to the project, attempt to always parse functions from it's prototype unless it does not have one, added commands to context menus, hide resources node in the project pad, added custom icons to stock icons so they can be used in the completion widget, made it possible for C/C++ projects to depend on other C/C++ projects that compile into a shared library, keep a project's internal pkg-config package updated and implemented IDeployable.

Other than that I added project templates for console project, static library project and shared library project for both C and C++.

sábado, 11 de agosto de 2007

Building libbanshee with MonoDevelop

Today I checked out Banshee and made a MonoDevelop C Project for libbanshee using CBinding these are the current requirements to do this:
  • You must have a recent MonoDevelop svn checkout (There are breaking changes that did not make it into MD 0.15, specifically an updated addin extension tree) so the checkout needs to be quite recent.
  • The banshee source which comes with an MD solution, I checked out todays svn, I'm not sure if the packaged tarball includes this.
  • Download this file: http://groups.google.com/group/mono-soc-2007/web/libbanshee.tar.gz
In the tar file you will find the following files:
  • CBinding.dll: This is the C/C++ AddIn I have been working on, all you have to do is copy it to (assumming you use make run to run your svn MD) {MD_ROOT}/build/AddIns/BackendBindings. Alternatively you can follow these instructions if you want to keep up with CBinding development from svn: http://mdmagsoc.blogspot.com/2007/07/testing-out-current-work.html.
  • libbanshee.mdp: This is the MonoDevelop project for libbanshee, just copy it to {BANSHEE_ROOT}/libbanshee
  • libbanshee.diff (optional): This is a patch that adds libbanshee.mdp to the banshee MD solution.
And thats it, this should work, but I don't guarantee anything. Please let me know if anything went wrong when you did this.

It should be noted that I'm not at all familiar with the banshee build process, so I just made the output of libbanshee go to the build folder in the banshee root folder, I'm not sure if this is correct behavior.

sábado, 4 de agosto de 2007

Tenth Status Report

I spent most of this week learning ANTLR which is a parser generator, my hope is that I would be able to use this tool to generate a simple parser to keep track of variables, their, type, scope and name. Apparently there is no easy way to instruct the parser to filter out everything else except what I'm interested in, so doing this won't be so simple, and I didn't get much real work done in this area (except learn a bunch of ANTLR stuff).

I also implemented :: completion which means I only have left to implement . and -> completion but for these I do need the parser. Here is a screencast to show the completion work that is done by now:

While watching the screencast I noticed there was some inconsistencies between the icons used in the completion widget and those used in the class pad, I will fix this shortly.

So I think CBinding is pretty much complete for now, I think now it is more important to test, bugfix and polish current work, so unless something comes up I will probably spend the rest of soc doing this and working on the parser.

viernes, 27 de julio de 2007

Ninth Status Report

This week I started by implementing parameter completion, I'm pretty satisfied with the result, the parameter list widget is shown as soon as you press (, and it behaves like it does on C#, you can see other overloads by using the up and down arrow keys and the current parameter is highlighted in blue (this was already provided by MD).

Then I created "global" code completion, when you press ctrl+space it shows a list of available namespaces, classes, functions, structures, constants, etc. This was pretty straight forward since it doesn't have to resolve anything.

Also I changed how the class pad tree is built, instead of creating a single tags file for the entire project and then parsing that, now I create tags for each file (and it's non system #included files) and update the class pad information with this. This is done each time a file is saved.

Here is a screen shot of a C++ project and it's (wacky) class pad tree:

I also wanted to upload some images of the code completion and parameter completion, unfortunately when I press the screenshot key the widgets disappear and don't appear on the screenshots.

Supposedly this week I was going to create a simple parser to keep track of local variables and in what method the caret is currently in so that I can provide completion for something like coord. (and then the completion widget with the available fields would appear), but I found this would not be so simple and it would be very important that it is fast and efficient, so I decided to put it off until I have some information on what a good way to do this would be. So if anyone knows of any code that does something like this that I can look at or has any advice on how I should do this, I would love to know.