{-# LANGUAGE DerivingStrategies          #-}
{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  GHC.JS.Ident
-- Copyright   :  (c) The University of Glasgow 2001
-- License     :  BSD-style (see the file LICENSE)
--
-- Maintainer  :  Jeffrey Young  <jeffrey.young@iohk.io>
--                Luite Stegeman <luite.stegeman@iohk.io>
--                Sylvain Henry  <sylvain.henry@iohk.io>
--                Josh Meredith  <josh.meredith@iohk.io>
-- Stability   :  experimental
--
--
-- * Domain and Purpose
--
--     GHC.JS.Ident defines identifiers for the JS backend. We keep this module
--     separate to prevent coupling between GHC and the backend and between
--     unrelated modules is the JS backend.
--
-- * Consumers
--
--     The entire JavaScript Backend consumes this module including modules in
--     GHC.JS.\* and modules in GHC.StgToJS.\*
--
-- * Additional Notes
--
--     This module should be kept as small as possible. Anything added to it
--     will be coupled to the JS backend EDSL and the JS Backend including the
--     linker and rts. You have been warned.
--
-----------------------------------------------------------------------------

module GHC.JS.Ident
  ( Ident(..)
  , name
  ) where

import GHC.Prelude

import GHC.Data.FastString
import GHC.Types.Unique
import GHC.Utils.Outputable

--------------------------------------------------------------------------------
--                            Identifiers
--------------------------------------------------------------------------------

-- | A newtype wrapper around 'FastString' for JS identifiers.
newtype Ident = TxtI { Ident -> FastString
identFS :: FastString }
 deriving stock   (Int -> Ident -> ShowS
[Ident] -> ShowS
Ident -> String
(Int -> Ident -> ShowS)
-> (Ident -> String) -> ([Ident] -> ShowS) -> Show Ident
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Ident -> ShowS
showsPrec :: Int -> Ident -> ShowS
$cshow :: Ident -> String
show :: Ident -> String
$cshowList :: [Ident] -> ShowS
showList :: [Ident] -> ShowS
Show, Ident -> Ident -> Bool
(Ident -> Ident -> Bool) -> (Ident -> Ident -> Bool) -> Eq Ident
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Ident -> Ident -> Bool
== :: Ident -> Ident -> Bool
$c/= :: Ident -> Ident -> Bool
/= :: Ident -> Ident -> Bool
Eq)
 deriving newtype (Ident -> Unique
(Ident -> Unique) -> Uniquable Ident
forall a. (a -> Unique) -> Uniquable a
$cgetUnique :: Ident -> Unique
getUnique :: Ident -> Unique
Uniquable, Ident -> SDoc
(Ident -> SDoc) -> Outputable Ident
forall a. (a -> SDoc) -> Outputable a
$cppr :: Ident -> SDoc
ppr :: Ident -> SDoc
Outputable)

-- | To give a thing a name is to have power over it. This smart constructor
-- serves two purposes: first, it isolates the JS backend from the rest of GHC.
-- The backend should not explicitly use types provided by GHC but instead
-- should wrap them such as we do here. Second it creates a symbol in the JS
-- backend, but it does not yet give that symbols meaning. Giving the symbol
-- meaning only occurs once it is used with a combinator from @GHC.JS.Make@.
name :: FastString -> Ident
name :: FastString -> Ident
name = FastString -> Ident
TxtI