module Language.Haskell.Tools.Rewrite.Create.Names where
import Data.String (IsString(..), String)
import Language.Haskell.Tools.AST
import Language.Haskell.Tools.PrettyPrint.Prepare
import Language.Haskell.Tools.Rewrite.Create.Utils (emptyList, mkAnn, mkAnnList)
import Language.Haskell.Tools.Rewrite.ElementTypes
import qualified Name as GHC
mkName :: String -> Name
mkName = mkNormalName . mkSimpleName
mkQualOp :: [String] -> String -> Operator
mkQualOp quals = mkAnn child . UNormalOp . mkQualifiedName quals
mkBacktickOp :: [String] -> String -> Operator
mkBacktickOp quals = mkAnn ("`" <> child <> "`") . UBacktickOp . mkQualifiedName quals
mkQualOp' :: [String] -> GHC.Name -> Operator
mkQualOp' quals n | GHC.isSymOcc (GHC.getOccName n) = mkAnn child $ UNormalOp $ mkQualifiedName' quals n
| otherwise = mkAnn ("`" <> child <> "`") $ UBacktickOp $ mkQualifiedName' quals n
mkUnqualOp' :: GHC.Name -> Operator
mkUnqualOp' n | GHC.isSymOcc (GHC.getOccName n) = mkAnn child $ UNormalOp $ mkSimpleName' n
| otherwise = mkAnn ("`" <> child <> "`") $ UBacktickOp $ mkSimpleName' n
mkUnqualOp :: String -> Operator
mkUnqualOp = mkAnn child . UNormalOp . mkSimpleName
mkQualName' :: [String] -> GHC.Name -> Name
mkQualName' quals n | GHC.isSymOcc (GHC.getOccName n) = mkAnn ("(" <> child <> ")") $ UParenName $ mkQualifiedName' quals n
| otherwise = mkAnn child $ UNormalName $ mkQualifiedName' quals n
mkUnqualName' :: GHC.Name -> Name
mkUnqualName' n | GHC.isSymOcc (GHC.getOccName n) = mkAnn ("(" <> child <> ")") $ UParenName $ mkSimpleName' n
| otherwise = mkAnn child $ UNormalName $ mkSimpleName' n
mkNormalName :: QualifiedName -> Name
mkNormalName = mkAnn child . UNormalName
mkParenName :: QualifiedName -> Name
mkParenName = mkAnn ("(" <> child <> ")") . UParenName
mkImplicitName :: QualifiedName -> Name
mkImplicitName = mkAnn ("?" <> child) . UImplicitName
mkQualifiedName' :: [String] -> GHC.Name -> QualifiedName
mkQualifiedName' quals n = mkQualifiedName quals (GHC.occNameString $ GHC.getOccName n)
mkQualifiedName :: [String] -> String -> QualifiedName
mkQualifiedName [] n = mkSimpleName n
mkQualifiedName quals name
= mkAnn (child <> "." <> child)
(UQualifiedName (mkAnnList (separatedBy "." list) $ map mkNamePart quals) (mkNamePart name))
mkNamePart :: String -> NamePart
mkNamePart s = mkAnn (fromString s) (UNamePart s)
mkSimpleName' :: GHC.Name -> QualifiedName
mkSimpleName' = mkSimpleName . GHC.occNameString . GHC.getOccName
mkSimpleName :: String -> QualifiedName
mkSimpleName n = mkAnn (child <> child)
(UQualifiedName emptyList (mkNamePart n))
mkStringNode :: String -> StringNode
mkStringNode s = mkAnn (fromString s) (UStringNode s)