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