Pretty-print исходный код на haskell с комментариями - PullRequest
8 голосов
/ 22 февраля 2012

Я пытаюсь переформатировать / перепечатать исходный код haskell (удалить / добавить пробелы, разрывы строк, изменить стиль отступов ...).Я нашел пакет haskell-src-exts , который может анализировать и печатать исходный код haskell.

Используя функцию parseFileWithComments :: ParseMode -> FilePath -> IO (ParseResult (Module, [Comment])), я также получаю комментарии, включенные в исходный код,Теперь я хочу напечатать модуль / AST с комментариями в исходных позициях, но я не могу найти функцию, которая будет делать это.Я могу только красиво напечатать АСТ.Нужно ли самому печатать AST плюс комментарии или такая библиотека уже существует?

Для пояснения рассмотрим следующий пример:

file A.hs:

module A (fn1) where

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

В ghci, набрав

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

, печатается исходный код модуля (конечно, без комментариев).Я могу использовать любую функцию prettyPrint для изменения форматирования исходного кода.

Теперь я хочу иметь возможность сделать что-то вроде этого:

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

, чтобы получить печатную версиюисходного файла, включая комментарии.

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

Используйте Annotated версии модулей, например, Language.Haskell.Exts.Annotated против Language.Haskell.Exts.

3 голосов
/ 22 февраля 2012

В зависимости от того, какую красивую печать вы хотите сделать, вы можете взглянуть на пакет hscolour, который используется для раскраски исходного кода на Haskell в различные выходные форматы.

В частности, модуль Language.Haskell.HsColour.Classify содержит токенизатор Haskell, который сохраняет пробелы и комментарии, которые могут послужить хорошей отправной точкой.

...