haskell-tools-ast-0.4.1.2: Language/Haskell/Tools/AST/Representation/Names.hs
{-# LANGUAGE TypeFamilies
, MultiParamTypeClasses
, FlexibleInstances
#-}
-- | Simple AST elements of Haskell
module Language.Haskell.Tools.AST.Representation.Names where
import Language.Haskell.Tools.AST.Ann (Ann(..), AnnListG(..))
data UOperator dom stage
= UBacktickOp { _operatorName :: Ann UQualifiedName dom stage
} -- ^ A normal name used as an operator with backticks: @ a `mod` b @
| UNormalOp { _operatorName :: Ann UQualifiedName dom stage
} -- ^ A normal operator used as an operator.
data UName dom stage
= UParenName { _simpleName :: Ann UQualifiedName dom stage
} -- ^ Parenthesized name: @ foldl (+) 0 @
| UNormalName { _simpleName :: Ann UQualifiedName dom stage
} -- ^ A normal, non-operator name.
| UImplicitName { _simpleName :: Ann UQualifiedName dom stage
} -- ^ Implicit name: @ ?var @
-- | Possible qualified names. Contains also implicit names.
-- Linear implicit parameter: @%x@. Non-linear implicit parameter: @?x@.
data UQualifiedName dom stage
= UQualifiedName { _qualifiers :: AnnListG UNamePart dom stage
, _unqualifiedName :: Ann UNamePart dom stage
}
nameFromList :: AnnListG UNamePart dom stage -> UQualifiedName dom stage
nameFromList (AnnListG a xs) | not (null xs)
= UQualifiedName (AnnListG a (init xs)) (last xs)
nameFromList _ = error "nameFromList: empty list"
-- | Parts of a qualified name.
data UNamePart dom stage
= UNamePart { _simpleNameStr :: String }
-- | Program elements formatted as string literals (import packages, pragma texts)
data UStringNode dom stage
= UStringNode { _stringNodeStr :: String }