{-| Module : IRTS.JavaScript.Name Description : The JavaScript name mangler. License : BSD3 Maintainer : The Idris Community. -} {-# LANGUAGE OverloadedStrings, PatternGuards #-} module IRTS.JavaScript.Name ( jsName , jsNameGenerated , Partial(..) , jsNamePartial , jsTailCallOptimName , HiddenClass(..) , jsNameHiddenClass , dataPartName ) where import Data.Char import Data.Text (Text) import qualified Data.Text as T import Idris.Core.TT jsEscape :: String -> String jsEscape = concatMap jschar where jschar x | isAlpha x || isDigit x = [x] | x == '.' = "__" | otherwise = "_" ++ show (fromEnum x) ++ "_" jsName :: Name -> Text jsName (MN i u) = T.concat ["$_", T.pack (show i), "_", T.pack $ jsEscape $ T.unpack u] jsName n = T.pack $ jsEscape $ showCG n jsNameGenerated :: Int -> Text jsNameGenerated v = T.pack $ "$cg$" ++ show v data Partial = Partial Name Int Int deriving (Eq, Ord) jsNamePartial :: Partial -> Text jsNamePartial (Partial n i j) = T.concat ["$partial_", T.pack $ show i, "_", T.pack $ show j, "$" , jsName n] jsTailCallOptimName :: Text -> Text jsTailCallOptimName x = T.concat ["$tco$", x] data HiddenClass = HiddenClass Name Int Int deriving (Eq, Ord) jsNameHiddenClass :: HiddenClass -> Text jsNameHiddenClass (HiddenClass n id arity) = T.concat ["$HC_", T.pack $ show arity, "_", T.pack $ show id,"$", jsName n] dataPartName :: Int -> Text dataPartName i = T.pack $ "$" ++ show i