|
|
- {-# 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
|