diff options
Diffstat (limited to 'compiler/GHC/JS')
-rw-r--r-- | compiler/GHC/JS/Ppr.hs | 11 | ||||
-rw-r--r-- | compiler/GHC/JS/Syntax.hs | 36 |
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 |