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