{-# LANGUAGE NoImplicitPrelude #-}

module Language.Haskell.Brittany.Internal.Util.AST where

import           Language.Haskell.Brittany.Internal.Prelude

import qualified Data.Text                     as Text
import           GHC                            ( moduleName
                                                , moduleNameString
                                                , GenLocated(L)
                                                )
import qualified GHC
import           GHC.Types.Name                 ( getOccString )
import           GHC.Types.Name.Occurrence      ( occNameString
                                                )
import           GHC.Types.Name.Reader          ( RdrName
                                                  ( Exact
                                                  , Orig
                                                  , Qual
                                                  , Unqual
                                                  )
                                                )



rdrNameToText :: RdrName -> Text
-- rdrNameToText = Text.pack . show . flip runSDoc unsafeGlobalDynFlags . ppr
rdrNameToText (Unqual occname) = Text.pack $ occNameString occname
rdrNameToText (Qual mname occname) =
  Text.pack $ moduleNameString mname ++ "." ++ occNameString occname
rdrNameToText (Orig modul occname) =
  Text.pack $ moduleNameString (moduleName modul) ++ occNameString occname
rdrNameToText (Exact name) = Text.pack $ getOccString name

getDeclBindingNames :: GHC.LHsDecl GhcPs -> [String]
getDeclBindingNames (L _ decl) = case decl of
  GHC.SigD _ (GHC.TypeSig _ ns _) ->
    ns <&> \(L _ n) -> Text.unpack (rdrNameToText n)
  GHC.ValD _ (GHC.FunBind _ (L _ n) _ _) -> [Text.unpack $ rdrNameToText n]
  _ -> []