summaryrefslogtreecommitdiff
path: root/compiler/GHC/JS
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/JS')
-rw-r--r--compiler/GHC/JS/Ppr.hs11
-rw-r--r--compiler/GHC/JS/Syntax.hs36
2 files changed, 43 insertions, 4 deletions
diff --git a/compiler/GHC/JS/Ppr.hs b/compiler/GHC/JS/Ppr.hs
index e46c8534ef..223d4d3e7a 100644
--- a/compiler/GHC/JS/Ppr.hs
+++ b/compiler/GHC/JS/Ppr.hs
@@ -6,7 +6,6 @@
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE BlockArguments #-}
-{-# LANGUAGE PatternSynonyms #-}
-- | Pretty-printing JavaScript
module GHC.JS.Ppr
@@ -19,6 +18,10 @@ module GHC.JS.Ppr
, RenderJs(..)
, jsToDoc
, pprStringLit
+ , flattenBlocks
+ , braceNest
+ , braceNest'
+ , braceNest''
)
where
@@ -79,6 +82,12 @@ braceNest x = char '{' <+> nest 2 x $$ char '}'
braceNest' :: Doc -> Doc
braceNest' x = nest 2 (char '{' $+$ x) $$ char '}'
+-- FIXME: Jeff (2022,03): better naming of braceNest'' functions. Stop the
+-- madness!
+-- somewhat more compact (egyptian style) braces
+braceNest'' :: Doc -> Doc
+braceNest'' x = nest 2 (char '{' $$ x) $$ char '}'
+
class JsToDoc a where jsToDocR :: RenderJs -> a -> Doc
instance JsToDoc JStat where jsToDocR r = renderJsS r r
instance JsToDoc JExpr where jsToDocR r = renderJsE r r
diff --git a/compiler/GHC/JS/Syntax.hs b/compiler/GHC/JS/Syntax.hs
index 37104d8d9f..d70e06d801 100644
--- a/compiler/GHC/JS/Syntax.hs
+++ b/compiler/GHC/JS/Syntax.hs
@@ -48,6 +48,8 @@ module GHC.JS.Syntax
, pseudoSaturate
-- * Utility
, SaneDouble(..)
+ -- * Keywords
+ , isJsKeyword
) where
import GHC.Prelude
@@ -56,16 +58,18 @@ import Control.DeepSeq
import Data.Function
import qualified Data.Map as M
+import qualified Data.Set as Set
import Data.Data
import Data.Word
import qualified Data.Semigroup as Semigroup
import GHC.Generics
+import Data.Binary
import GHC.Utils.Outputable (Outputable (..))
import qualified GHC.Utils.Outputable as O
import qualified GHC.Data.ShortText as ST
-import GHC.Data.ShortText (ShortText)
+import GHC.Data.ShortText (ShortText())
import GHC.Utils.Monad.State.Strict
-- FIXME: Jeff (2022,03): This state monad is strict, but uses a lazy list as
@@ -319,9 +323,35 @@ instance Show SaneDouble where
--------------------------------------------------------------------------------
-- Identifiers
--------------------------------------------------------------------------------
--- We use ShortText for identifier in JS backend
+-- We use ShortText for identifiers in JS backend
-- | Identifiers
newtype Ident = TxtI { itxt:: ShortText}
- deriving (Show, Typeable, Ord, Eq, Generic, NFData)
+ deriving stock (Show, Typeable, Ord, Eq, Generic)
+ deriving newtype (Binary, NFData) -- FIXME: Jeff (2022,03): ShortText uses Data.Binary
+ -- rather than GHC.Utils.Binary. What is the
+ -- difference? See related FIXME in StgToJS.Object
+
+--------------------------------------------------------------------------------
+-- JS Keywords
+--------------------------------------------------------------------------------
+-- | The set of Javascript keywords
+jsKeywords :: Set.Set Ident
+jsKeywords = Set.fromList $ TxtI <$>
+ [ "break", "case", "catch", "continue", "debugger"
+ , "default", "delete", "do", "else", "finally", "for"
+ , "function", "if", "in", "instanceof", "new", "return"
+ , "switch", "this", "throw", "try", "typeof", "var", "void"
+ , "while", "with"
+ , "class", "enum", "export", "extends", "import", "super"
+ , "const"
+ , "implements", "interface", "let", "package", "private"
+ , "protected"
+ , "public", "static", "yield"
+ , "null", "true", "false"
+ ]
+
+-- | Check if provided Ident is a JS keyword
+isJsKeyword :: Ident -> Bool
+isJsKeyword = flip Set.member jsKeywords