{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Ormolu.Printer.Meat.ImportExport
( p_hsmodExports,
p_hsmodImport,
)
where
import Control.Monad
import GHC
import HsImpExp (IE (..))
import Ormolu.Printer.Combinators
import Ormolu.Printer.Meat.Common
import Ormolu.Utils
p_hsmodExports :: [LIE GhcPs] -> R ()
p_hsmodExports [] = do
txt "("
breakpoint'
txt ")"
p_hsmodExports xs =
parens N . sitcc $ do
layout <- getLayout
sep breakpoint (sitcc . located' (uncurry (p_lie layout))) (attachPositions xs)
p_hsmodImport :: ImportDecl GhcPs -> R ()
p_hsmodImport ImportDecl {..} = do
txt "import"
space
when ideclSource (txt "{-# SOURCE #-}")
space
when ideclSafe (txt "safe")
space
when ideclQualified (txt "qualified")
space
case ideclPkgQual of
Nothing -> return ()
Just slit -> atom slit
space
inci $ do
located ideclName atom
case ideclAs of
Nothing -> return ()
Just l -> do
space
txt "as"
space
located l atom
space
case ideclHiding of
Nothing -> return ()
Just (hiding, _) ->
when hiding (txt "hiding")
case ideclHiding of
Nothing -> return ()
Just (_, (L _ xs)) -> do
breakpoint
parens N . sitcc $ do
layout <- getLayout
sep breakpoint (sitcc . located' (uncurry (p_lie layout))) (attachPositions xs)
newline
p_hsmodImport (XImportDecl NoExt) = notImplemented "XImportDecl"
p_lie :: Layout -> (Int, Int) -> IE GhcPs -> R ()
p_lie encLayout (i, totalItems) = \case
IEVar NoExt l1 -> do
located l1 p_ieWrappedName
p_comma
IEThingAbs NoExt l1 -> do
located l1 p_ieWrappedName
p_comma
IEThingAll NoExt l1 -> do
located l1 p_ieWrappedName
space
txt "(..)"
p_comma
IEThingWith NoExt l1 w xs _ -> sitcc $ do
located l1 p_ieWrappedName
breakpoint
inci $ do
let names :: [R ()]
names = located' p_ieWrappedName <$> xs
parens N . sitcc
$ sep (comma >> breakpoint) sitcc
$ case w of
NoIEWildcard -> names
IEWildcard n ->
let (before, after) = splitAt n names
in before ++ [txt ".."] ++ after
p_comma
IEModuleContents NoExt l1 -> do
located l1 p_hsmodName
p_comma
IEGroup NoExt n str -> do
unless (i == 0) newline
p_hsDocString (Asterisk n) False (noLoc str)
IEDoc NoExt str ->
p_hsDocString Pipe False (noLoc str)
IEDocNamed NoExt str -> p_hsDocName str
XIE NoExt -> notImplemented "XIE"
where
p_comma =
case encLayout of
SingleLine -> unless (i + 1 == totalItems) comma
MultiLine -> comma
attachPositions ::
[Located a] ->
[Located ((Int, Int), a)]
attachPositions xs =
let f i (L l x) = L l ((i, n), x)
n = length xs
in zipWith f [0 ..] xs