{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveAnyClass #-} module Frontend.Syntax.Var where import qualified Data.Text as T import Data.Text (Text) import Development.Shake.Classes import Frontend.Parser.Posn import GHC.Generics (Generic) data ParsedVar = UnqualVar { varId :: Text , varBegin :: Posn , varEnd :: Posn } | QualVar { varId :: Text , varPrefix :: Text , varBegin :: Posn , varEnd :: Posn } | ModId { varId :: Text , varBegin :: Posn , varEnd :: Posn } | BuiltinId { varId :: Text , varBuiltin :: BuiltinIdClass , varBegin :: Posn , varEnd :: Posn } deriving (Eq, Show, Generic, Binary, Hashable, NFData) data BuiltinIdClass = BuiltinTuple !Int | BuiltinNil | BuiltinArrow deriving (Eq, Show, Generic, Binary, Hashable, NFData) toModId :: ParsedVar -> ParsedVar toModId x@ModId{} = x toModId (UnqualVar x y z) = ModId x y z toModId (QualVar id pref b e) = ModId (pref <> T.singleton '.' <> id) b e toModId BuiltinId{} = error "Built-in variable can not be a module identifier!" splitModuleIdentifier :: Text -> [Text] splitModuleIdentifier t | T.null fst = [] | otherwise = fst:splitModuleIdentifier (T.drop 1 snd) where (fst, snd) = T.span (/= '.') t