2013-07-11 19 views
6

Ho bisogno di fare l'analisi di alcune intestazioni Objective-C.Analisi intestazione Objective-C

  • Ho provato con Doxygen e l'analisi l'output XML, ma non supporta completamente le intestazioni Obiettivo C senza commenti (che soffoca sul macro definite nelle proprietà, controllare Doxygen not properly recognizing properties)
  • Ho anche provato usando appledoc, ma l'output XML non è abbastanza completo (ad esempio, non ci sono informazioni sull'ereditarietà per le classi) e ha lo stesso problema con le macro sulle proprietà.
  • Ho anche provato verificando l'output della libreria di metadati Objective C (usando otool), ma ha notato che i metadati non tiene i tipi di metodi (in modo da ottenere method:(id)param:(id))

Qualcuno sa un buon strumento per fare ciò che voglio? Sto sospettando che lo clang mi aiuti, ma finora le opzioni -ast-dump e simili cercano di generare un AST per una fonte che non ho (solo intestazioni).

risposta

15

Potrebbe essere possibile utilizzare libclang. libclang è un'interfaccia programmatica progettata per implementare strumenti come l'evidenziazione della sintassi e il completamento del codice.

clang -ast-dump funziona per me. (Si noti che -ast-dump non è supportato dal driver, in modo da avere a che fare un po 'di lavoro extra per passare le bandiere che solitamente l'autista gestisce. È possibile utilizzare clang -### ... per vedere esattamente ciò che il conducente sta facendo.)

% clang -cc1 -ast-dump -fblocks -x objective-c /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h 
[...] 
|-ObjCInterfaceDecl 0x1023727c0 <line:50:1, line:96:2> NSObject 
| |-ObjCProtocol 0x102371350 'NSObject' 
[...] 
+1

Era questo. Non so perché questo non funzionasse prima, ma ho funzionato ora.Un problema che ho ora è che alcune importazioni non funzionano (cose come '#import ', ma come hai detto, dovrò passare i parametri al driver) –

-4

Penso che usare suoni clang sia troppo difficile. Vorrei solo usare RegEx.

Invece scriverei un semplice wrapper di shell shell attorno a Doxygen che commenta la sintassi problematica.

Dovrebbe essere abbastanza semplice da cambiare:

@property(nonatomic, retain) BOOL myProperty NS_AVAILABLE_IOS(3_2); 

A:

@property(nonatomic, retain) BOOL myProperty /*NS_AVAILABLE_IOS(3_2)*/; 

Si potrebbe anche convertire le cose come NS_DEPRECATED() a un @deprecated commento.

+2

No , le espressioni regolari non saranno d'aiuto per tutti i motivi citati in questa risposta: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – bbum

+0

@bbum I wouldn Esegui regex da solo, farei un ibrido di regex e qualche altro linguaggio di scripting. Ho anni di esperienza nell'analisi dei linguaggi di programmazione con regex, può essere fatto ed è facile in questo caso. –

+2

Garantisco per ogni combinazione di regex + linguaggio di scripting che dovevi applicare, potrei trovare un bit perfettamente valido della sintassi ObjC che lo romperà fino a quando non avresti finito a reinventare l'intero compilatore standard compatibile ...;) – bbum