Un plugin spotlight pour indexer les classes Obj-C

laurrislaurris Membre
juillet 2006 modifié dans API AppKit #1
Bonjour les summer coders,
Je suis à  la recherche d'un "parser" pour Objective-C. Je compte l'utiliser dans un plugin spotlight pour indexer les fichiers .m (je sais, Apple en a sorti un mais son indexation semble très basique).

Est-ce que quelqu'un connaà®trait une façon simple de faire ça ? J'imagine que les languages les plus adaptés pour ce genre de chose sont python ou bison. En cherchant un peu sur les listes Apple ou sur cocoadev, je me suis aperçu que les questions de ce genre obtenaient toujours la même réponse: il faudrait utiliser le parser de gcc ... oui mais c'est très compliqué pasqu'il y a plein de dépendances ... donc abandonne.
Moi j'aurais besoin de quelque chose de beaucoup plus simple que la solution gcc puisqu'il s'agit simplement de récupérer le nom des classes, les méthodes utilisées, les frameworks liés et d'autres petites choses intéressantes.

Voilà , avant de mettre les mains dans le cambouis j'aimerais savoir si des experts connaissent un parser adapté à  mes besoins, comment ils voient la chose en terme de difficulté, ou si parser l'objective-c pose des problèmes insolubles auxquels je n'aurais pas pensé (*) ...

(*) et qui expliqueraient que je n'ai pas trouvé de parser simple à  utiliser. 


 

Réponses

  • AliGatorAliGator Membre, Modérateur
    04:39 modifié #2
    Moi je me pencherai sur les RegEx ou alors sur le couple bison/flex (ou yacc & lex et tout ça c'est pareil en gros)
  • laurrislaurris Membre
    juillet 2006 modifié #3
    Je m'y suis mis, à  créer cet mdimporter pour le code Objective-c. Pour l'instant j'ai une indexation très minimale, mais à  mon avis suffisante pour obtenir des résultats de recherche intéressants.
    J'ai utilisé les regex, comme le conseille Aligator, pasque mine de rien c'est quand même le plus efficace.
    Mon plugin spotlight appelé ClassImporter permet d'indexer, pour un fichier d'implémentation donné (.m), la classe dont il hérite. Pour l'instant cette infos est placée dans l'attribut "built-in" keyword, mais ça peut changer à  l'avenir.

    Dans la vie réelle, ça permet par exemple de rechercher toutes les classes qui sont des sous-classes de NSTableView. On peut alors créer un dossier intelligent à  partir de ces critères et visualiser d'un coup tous ses fichiers .m sur son disque qui sous-classent NStableView.
    Comment ça marche en gros ? ben en gros, le mdimporter trouve le nom de la classe implémentée, puis cherche l'interface où se trouve une mention de la superclass. S'il ne trouve pas d'interface dans le même fichier .m (c'est courant), il va la chercher dans le fichier header du même nom.

    Il y a encore des petites choses à  améliorer (par exemple, je ne traite pas le cas où plusieurs implementations se partagent le même fichier .m ou le cas où l'interface se trouve dans un autre header spécifié avec #import.) mais pour uen configuration "normale" de codage, ça fonctionne.

    Le source est disponible en version subversion:
    svn co http://OpenSVN.csie.org/cocoa/ClassImporter
    Précision: tout se passe dans le main.m > fonction GetMetaDataForFile(). C'est un peu commenté.

    Si ce plugin peut vous être utile pour retrouver des classes enfouies sous des montagnes de code, tant mieux.
    Si vous avez des idées d'autres critères de recherche intéressants, je suis preneur aussi.
    Pour désinstaller, après une compilation en configuration "Release", il faut supprimer ~/Library/Spotlight/ClassImporter.mdimporter.





    [Fichier joint supprimé par l'administrateur]
Connectez-vous ou Inscrivez-vous pour répondre.