2012-02-22 2 views
7

Sto provando a riformattare/ristampare il codice sorgente haskell (rimuovere/aggiungere spazi, interruzioni di riga, modificare lo stile di indentazione ...). Ho trovato il pacchetto haskell-src-exts che può analizzare e stampare codice sorgente haskell.Codice sorgente haskell pretty-print con commenti

Utilizzo della funzione parseFileWithComments :: ParseMode -> FilePath -> IO (ParseResult (Module, [Comment])) Ottengo anche i commenti inclusi nel codice sorgente. Ora voglio stampare il modulo/AST con i commenti nelle posizioni originali, ma non riesco a trovare una funzione che lo faccia. Posso solo stampare l'AST. Devo implementare la stampa dell'AST più i commenti o esiste già una tale libreria?

Per chiarire considerazione seguente esempio:

A.hs file:

module A (fn1) where 

-- | Haddock-comment 
fn1 :: 
    String -> 
    String 
fn1 _ = "" -- another comment 

In ghci, digitando

Prelude Control.Monad.Reader Language.Haskell.Exts> (liftM prettyPrint) $ (liftM fst) $ (liftM fromParseResult) $ parseFileWithComments defaultParseMode "A.hs"` 

stampe il codice sorgente del modulo (senza i commenti, ovviamente) . Posso usare qualsiasi funzione prettyPrint per modificare la formattazione del codice sorgente.

Ora voglio essere in grado di fare qualcosa del genere:

do 
    (ast, comments) <- fromParseResult $ parseFileWithComments defaultParseMode "A.hs" 
    prettyPrintWithComments ast comments 

per ottenere una versione pretty-stampata del file originale compreso i commenti.

risposta

4

Utilizzare le versioni Annotated dei moduli, ad es. Language.Haskell.Exts.Annotated vs Language.Haskell.Exts.

+0

Questo è abbastanza utile, ma non esattamente quello che volevo. Voglio comunque essere in grado di riformattare il codice sorgente effettivo con uno 'Stile' e una' PPHsMode' di stampa abbastanza precisi. – haja

+0

@haja: perché non puoi? È ancora un'istanza della classe 'Pretty' di haskell-src-ext ... – ivanm

+0

ma poi di nuovo, come possono essere inclusi i commenti originali nell'output di pretty-print? Non riesco a trovare una funzione che metta in bella mostra i commenti di _including_. – haja

2

A seconda del tipo di stampa carina che si desidera eseguire, è possibile dare un'occhiata al pacchetto hscolour, che viene utilizzato per colorare il codice sorgente Haskell in vari formati di output.

In particolare, il modulo Language.Haskell.HsColour.Classify contiene un tokenizzatore Haskell che conserva spazi e commenti, che potrebbe servire come un buon punto di partenza.

+0

grazie, ma non sto cercando questo tipo di stampa carina. Ho aggiornato la mia domanda per chiarire che tipo di stampa carina desidero. – haja