2012-01-29 6 views
5

Sto usando clang biblioteca 3.0 per alcune analisi di codice C/C++, e ho bisogno di ottenere la posizione di dichiarazione di variabile, ho provato questo codice:Come per ottenere la posizione del nome variabile nel clangore :: VarDecl

clang::VarDecl * vd = ...; 
clang::SourceManager & srcMgr = ...; 

clang::SourceRange loc = vd->getSourceRange(); 
clang::PresumedLoc locStart = srcMgr.getPresumedLoc(loc.getBegin()); 
clang::PresumedLoc locEnd = srcMgr.getPresumedLoc(loc.getEnd()); 

Ma locStart e locEnd punta all'inizio (e finale) di variabile (dichiarazione con tipo, ed eventualmente initialiser). Ad esempio:

const char * ptr = 0; 
^   ^^ ^

locStart punterà al primo puntatore (^), e locEnd punterà all'ultimo puntatore. Come posso ottenere la posizione del secondo e del terzo puntatore (solo nome, senza tipo e inizializzatore)?

risposta

4

Attualmente non sono nella posizione di testarlo ma penso che si desideri estrarre lo SourceLocation ottenuto da getLocation() dal proprio VarDecl. Questa funzione è effettivamente definita dalla classe base Decl. Anche se sembra identificare solo una posizione, sembra che sia possibile identificare l'intero nome (non ho provato ad estrarne le estremità individuali, ma l'ho usato per indicare la variabile).

+0

Siamo spiacenti, ma 'getQualifierLoc()' non aiuta. Questa funzione restituisce 'NestedNameSpecifierLoc', e nel mio caso restituisce un oggetto vuoto (senza alcuna informazione). – Alexey

+0

Sì, hai ragione: questo è in realtà per la posizione di cose come 'const' o' volatile'. Ho provato con un programma di esempio e sembra che sia semplice come usare 'getLocation()': mentre il 'VarDecl' stesso vuole iniziare con il tipo, il' SourceLocation' restituito da 'getLocation()' sembra identificare il nome. –

+0

Grazie, mi aiuta davvero, non so, perché ho iniziato a usare 'getSourceRange',' getLocation' funziona per me! – Alexey

Problemi correlati