{-# LANGUAGE RecordWildCards #-}

module HIndent.Ast.Name.Prefix
  ( PrefixName
  , mkPrefixName
  ) where

import Data.Maybe
import qualified GHC.Types.Name as GHC
import qualified GHC.Types.Name.Reader as GHC
import qualified GHC.Unit.Module as GHC
import HIndent.Ast.NodeComments
import {-# SOURCE #-} HIndent.Pretty
import HIndent.Pretty.Combinators
import HIndent.Pretty.NodeComments

data PrefixName = PrefixName
  { PrefixName -> String
name :: String
  , PrefixName -> Maybe ModuleName
moduleName :: Maybe GHC.ModuleName
  , PrefixName -> Bool
parentheses :: Bool
  }

instance CommentExtraction PrefixName where
  nodeComments :: PrefixName -> NodeComments
nodeComments PrefixName {} = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []

instance Pretty PrefixName where
  pretty' :: PrefixName -> Printer ()
pretty' PrefixName {Bool
String
Maybe ModuleName
name :: PrefixName -> String
moduleName :: PrefixName -> Maybe ModuleName
parentheses :: PrefixName -> Bool
name :: String
moduleName :: Maybe ModuleName
parentheses :: Bool
..} =
    Printer () -> Printer ()
forall {a}. Printer a -> Printer a
wrap (Printer () -> Printer ()) -> Printer () -> Printer ()
forall a b. (a -> b) -> a -> b
$ [Printer ()] -> Printer ()
hDotSep ([Printer ()] -> Printer ()) -> [Printer ()] -> Printer ()
forall a b. (a -> b) -> a -> b
$ [Maybe (Printer ())] -> [Printer ()]
forall a. [Maybe a] -> [a]
catMaybes [ModuleName -> Printer ()
forall a. Pretty a => a -> Printer ()
pretty (ModuleName -> Printer ())
-> Maybe ModuleName -> Maybe (Printer ())
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ModuleName
moduleName, Printer () -> Maybe (Printer ())
forall a. a -> Maybe a
Just (Printer () -> Maybe (Printer ()))
-> Printer () -> Maybe (Printer ())
forall a b. (a -> b) -> a -> b
$ HasCallStack => String -> Printer ()
String -> Printer ()
string String
name]
    where
      wrap :: Printer a -> Printer a
wrap =
        if Bool
parentheses
          then Printer a -> Printer a
forall {a}. Printer a -> Printer a
parens
          else Printer a -> Printer a
forall a. a -> a
id

mkPrefixName :: GHC.RdrName -> PrefixName
mkPrefixName :: RdrName -> PrefixName
mkPrefixName (GHC.Unqual OccName
name) =
  String -> Maybe ModuleName -> Bool -> PrefixName
PrefixName (OccName -> String
forall a. Outputable a => a -> String
showOutputable OccName
name) Maybe ModuleName
forall a. Maybe a
Nothing (OccName -> Bool
parensNeeded OccName
name)
mkPrefixName (GHC.Qual ModuleName
modName OccName
name) =
  String -> Maybe ModuleName -> Bool -> PrefixName
PrefixName (OccName -> String
forall a. Outputable a => a -> String
showOutputable OccName
name) (ModuleName -> Maybe ModuleName
forall a. a -> Maybe a
Just ModuleName
modName) (OccName -> Bool
parensNeeded OccName
name)
mkPrefixName (GHC.Orig {}) =
  String -> PrefixName
forall a. HasCallStack => String -> a
error String
"This AST node should not appear in the parser output."
mkPrefixName (GHC.Exact Name
name) =
  String -> Maybe ModuleName -> Bool -> PrefixName
PrefixName (Name -> String
forall a. Outputable a => a -> String
showOutputable Name
name) Maybe ModuleName
forall a. Maybe a
Nothing (OccName -> Bool
parensNeeded (OccName -> Bool) -> OccName -> Bool
forall a b. (a -> b) -> a -> b
$ Name -> OccName
forall name. HasOccName name => name -> OccName
GHC.occName Name
name)

parensNeeded :: GHC.OccName -> Bool
parensNeeded :: OccName -> Bool
parensNeeded = OccName -> Bool
GHC.isSymOcc