Vous êtes ici

Ajouter un commentaire

Tutoriel : auto-compléter du code Vala avec LibAfrodite

Objectifs : proposer des types GTK+ pour compléter du code Vala erroné.

LibAfrodite est une bibliothèque de complétion automatique de code source Vala.
Faisant à l'origine partie des Vala-Toys pour gEdit, elle a suscité l'intérêt des contributeurs des EDI MonoDevelop et ValaIDE qui ont développé des plugins d'interface dédiés.

Aujourd'hui pour un non-initié, l'usage de LibAfrodite pose deux problèmes majeurs :
- elle n'est plus officiellement maintenue depuis 2011, et reste liée à Vala 0.12 (nous sommes aujourd'hui à la version 0.18 - mais ceci est corrigeable) ;
- surtout, elle est très mal documentée. Sa généricité rend d'ailleurs son usage difficile pour un novice.

J'ai personnellement passé plusieurs heures à lire et analyser le code source, aussi bien de la bibliothèque que des plugins, pour en déduire l'usage. Ça a été une expérience longue et frustrante que je ne souhaite à personne... D'où cet article qui détaille un usage très basique de LibAfrodite.

1) Installer Vala et LibAfrodite

(LibAfrodite dépend de LibVala, donc vous n'y couperez pas)
Suivez les instructions à la fin de cet article.

2) Ecrire le programme

Nous allons utiliser ce code source pour analyser cet autre code source incomplet.

Il s'agit d'un programme GTK+3 où le type de certaines variables n'a pas été complété (Gtk.Wi à la place de Gtk.Window, Gtk.L à la place de Gtk.Label)

Voici les parties notables :

var engine = new Afrodite.CompletionEngine ("afrodite-my-engine");

crée le moteur d'auto-complétion. Le nom n'a aucune importance et peut même être vide ;

engine.begin_parsing.connect (on_begin_parsing);
engine.end_parsing.connect (on_end_parsing);

associent des actions au lancement et à la fin du parsing du moteur, lancé par la boucle MainLoop () plus bas.

engine.queue_sourcefile ("gtk3source.vala"); 
engine.queue_sourcefile ("gtk+-3.0.vapi",null,true);
loop.run ();

envoient les fichier requis (source Vala + VAPI) dans le moteur Afrodite, puis lancent leur parsing via la boucle MainLoop.run ().
(Afrodite ne détecte pas automatiquement les VAPIs de référence, nous devons les ajouter mauellement. Ici, pour contourner les différences d'emplacement entre systèmes, nous allons copier "gtk+-3.0.vapi" dans le même dossier que notre programme)

Quand la boucle sera finie et donc les fichiers analysés, la méthode "on_end_parsing ()" sera lancée automatiquement comme défini plus haut. Elle appelera elle-même la méthode "dump ()", qui fera le travail de lister les symboles dans la source à l'emplacement "ligne/colonne" que nous donnons :

var sym = engine.codedom.lookup_symbol_at ("gtk3source.vala", line, 1);

Un symbole de premier niveau dans un source Vala, c'est pour Afrodite une méthode ("main ()" p.ex.). Ce sont les variables dans la méthode qui nous intéressent :

Vala.List localvars = sym.local_variables;

Les variables dont le type est incomplet sont faciles à retrouver, leur champ "symbol" n'est pas recoupé avec le VAPI et est donc à NULL :

if (localvar.symbol == null)
{

On cherche dans le VAPI un type commençant par la même chaine de caractères :

if (subchild.fully_qualified_name.has_prefix (localvar.type_name))
{

(A contrario de la source Vala, un symbole de 1er niveau dans un VAPI pour Afrodite, c'est un namespace -ici "Gtk"- ; et de 2ème niveau, un type -Gtk.Window p.ex.... ce que nous cherchons ! D'où les itérations imbriquées en 3 niveaux : root -> Gtk -> Gtk.Window )

3) Compiler et tester

Placer dans le même dossier afrodite-gtk3.vala, gtk3source.vala, et gtk+-3.0.vapi. Ce dernier est trouvable à un emplacement différent suivant le système d'exploitation :

- "/Documents and Settings/All Users/Application Data/vala-0.12" (Windows XP)
- "/ProgramData/vala-0.12/vapi" (Windows Vista/7)
- "/usr/share/vala-0.12/vapi" (Linux)

Compiler :
valac --pkg afrodite-0.12 afrodite-gtk3.vala

Puis l'exécuter sur une ligne du source où nous nous trouvons dans la méthode main () ; par exemple la ligne 7 :
afrodite-gtk3 7

Vous devriez obtenir ce genre de résultat :

Voilà !

Filtered HTML

  • Les adresses de pages web et de courriels sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de courriels sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Cette question permet de vérifier que vous êtes un humain et d'éviter les commentaires automatiques.
Image CAPTCHA
Enter the characters shown in the image.