2012-11-05 8 views
5

Sto scrivendo un semplice strumento per aiutare con il refactoring del codice sorgente della nostra applicazione. Vorrei analizzare il codice C++ basato sulla libreria wxWidgets, che definisce la GUI e produce file XML .ui da utilizzare con Qt. Ho bisogno di ottenere tutte le chiamate di funzione e il valore degli argomenti.Come analizzare un singolo file usando i collegamenti Python su Clang?

Attualmente sto giocando con i collegamenti Python a Clang, utilizzando il codice di esempio seguente ricevo i token e il loro tipo e posizione, ma il tipo di cursore è sempre CursorKind.INVALID_FILE.

import sys 
import clang.cindex 

def find_typerefs(node): 
    """ Find all references to the type named 'typename' 
    """ 

    for t in node.get_tokens(): 
     if not node.location.file != sys.argv[1]: 
      continue 
     if t.kind.value != 0 and t.kind.value != 1 and t.kind.value != 4: 
      print t.spelling 
      print t.location 
      print t.cursor.kind 
      print t.kind 
      print "\n" 

index = clang.cindex.Index.create() 
tu = index.parse(sys.argv[1]) 
print 'Translation unit:', tu.spelling 
find_typerefs(tu.cursor) 

Qual è il modo corretto per determinare il tipo di cursore?

Non sono riuscito a trovare alcuna documentazione tranne alcuni post di blog, ma erano obsoleti o non coprivano questo argomento. Non ero nemmeno in grado di elaborarlo dagli esempi forniti con Clang.

+0

Potresti fornire l'output di 'lista (f.source.name per f in tu.get_includes())'? (basta stamparlo alla fine del tuo script) – forivall

+3

proprio come un altro c compilatore, la cartella include deve essere impostata correttamente, index.parse (sys.argv [1], args = ['I./path/to/ include ',' I./another/include ']) –

+0

Non è un peccato affidarsi al lavoro altrui, non dimenticare di menzionarlo: il tuo codice è in qualche modo molto simile al primo esempio nella pagina di Eli: http: //eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang –

risposta

4

Per gli oggetti del cursore, dovrebbe essere corretto utilizzare solo cursor.kind. Forse il problema è che stai camminando su token invece di oggetti cursore figlio (non ne sono sicuro). Invece di get_tokens, è possibile utilizzare get_children per percorrere l'AST.

Per vedere come appare l'AST, quando voglio scrivere una funzione AST walking, utilizzo questo script: https://gist.github.com/2503232. Questo mostra solo cursor.kind e fornisce output sensibili sul mio sistema. No CursorKind.INVALID_FILE.

Problemi correlati