-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | JavaScript parser and pretty-printer library
--   
--   Tools for working with ECMAScript 3 (popularly known as JavaScript).
--   Includes a parser, pretty-printer, tools for working with source tree
--   annotations and an arbitrary instance. See CHANGELOG for a summary of
--   changes. The package follows the Haskell Package Versioning Policy
--   since version 0.17.0.1.
@package language-ecmascript
@version 0.19.1.0


-- | This isn't a lexer in the sense that it provides a JavaScript
--   token-stream. This module provides character-parsers for various
--   JavaScript tokens.
module Language.ECMAScript3.Lexer
lexeme :: Stream s Identity Char => Parser s a -> Parser s a
identifier :: Stream s Identity Char => Parser s String
reserved :: Stream s Identity Char => String -> Parser s ()
operator :: Stream s Identity Char => Parser s String
reservedOp :: Stream s Identity Char => String -> Parser s ()
charLiteral :: Stream s Identity Char => Parser s Char
stringLiteral :: Stream s Identity Char => Parser s String
symbol :: Stream s Identity Char => String -> Parser s String
whiteSpace :: Stream s Identity Char => Parser s ()
parens :: Stream s Identity Char => Parser s a -> Parser s a
braces :: Stream s Identity Char => Parser s a -> Parser s a
brackets :: Stream s Identity Char => Parser s a -> Parser s a
squares :: Stream s Identity Char => Parser s a -> Parser s a
semi :: Stream s Identity Char => Parser s String
comma :: Stream s Identity Char => Parser s String
colon :: Stream s Identity Char => Parser s String
dot :: Stream s Identity Char => Parser s String
identifierStart :: Stream s Identity Char => Parser s Char
hexIntLit :: Stream s Identity Char => Parser s String
decIntLit :: Stream s Identity Char => Parser s String
decDigits :: Stream s Identity Char => Parser s String
decDigitsOpt :: Stream s Identity Char => Parser s String
exponentPart :: Stream s Identity Char => Parser s String

-- | returns (s, True) if the number is an integer, an (s, False) otherwise
decLit :: Stream s Identity Char => Parser s (String, Bool)


-- | ECMAScript 3 syntax. <i>Spec</i> refers to the ECMA-262 specification,
--   3rd edition.
module Language.ECMAScript3.Syntax
data JavaScript a

-- | A script in &lt;script&gt; ... &lt;/script&gt; tags.
Script :: a -> [Statement a] -> JavaScript a

-- | extracts statements from a JavaScript type
unJavaScript :: JavaScript a -> [Statement a]

-- | Statements, spec 12.
data Statement a

-- | <tt>{stmts}</tt>, spec 12.1
BlockStmt :: a -> [Statement a] -> Statement a

-- | <tt>;</tt>, spec 12.3
EmptyStmt :: a -> Statement a

-- | <tt>expr;</tt>, spec 12.4
ExprStmt :: a -> Expression a -> Statement a

-- | <tt>if (e) stmt</tt>, spec 12.5
IfStmt :: a -> Expression a -> Statement a -> Statement a -> Statement a

-- | <tt>if (e) stmt1 else stmt2</tt>, spec 12.5
IfSingleStmt :: a -> Expression a -> Statement a -> Statement a

-- | <tt>switch (e) clauses</tt>, spec 12.11
SwitchStmt :: a -> Expression a -> [CaseClause a] -> Statement a

-- | <tt>while (e) do stmt</tt>, spec 12.6
WhileStmt :: a -> Expression a -> Statement a -> Statement a

-- | <tt>do stmt while (e);</tt>, spec 12.6
DoWhileStmt :: a -> Statement a -> Expression a -> Statement a

-- | <tt>break lab;</tt>, spec 12.8
BreakStmt :: a -> Maybe (Id a) -> Statement a

-- | <tt>continue lab;</tt>, spec 12.7
ContinueStmt :: a -> Maybe (Id a) -> Statement a

-- | <tt>lab: stmt</tt>, spec 12.12
LabelledStmt :: a -> Id a -> Statement a -> Statement a

-- | <tt>for (x in o) stmt</tt>, spec 12.6
ForInStmt :: a -> ForInInit a -> Expression a -> Statement a -> Statement a

-- | <tt>ForStmt a init test increment body</tt>, <tt>for (init; test,
--   increment) body</tt>, spec 12.6
ForStmt :: a -> ForInit a -> Maybe (Expression a) -> Maybe (Expression a) -> Statement a -> Statement a

-- | <tt>try stmt catch(x) stmt finally stmt</tt>, spec 12.14
TryStmt :: a -> Statement a -> Maybe (CatchClause a) -> Maybe (Statement a) -> Statement a

-- | <tt>throw expr;</tt>, spec 12.13
ThrowStmt :: a -> Expression a -> Statement a

-- | <tt>return expr;</tt>, spec 12.9
ReturnStmt :: a -> Maybe (Expression a) -> Statement a

-- | <tt>with (o) stmt</tt>, spec 12.10
WithStmt :: a -> Expression a -> Statement a -> Statement a

-- | <tt>var x, y=42;</tt>, spec 12.2
VarDeclStmt :: a -> [VarDecl a] -> Statement a

-- | <tt>function f(x, y, z) {...}</tt>, spec 13
FunctionStmt :: a -> Id a -> [Id a] -> [Statement a] -> Statement a

-- | Returns <a>True</a> if the statement is an <i>IterationStatement</i>
--   according to spec 12.6.
isIterationStmt :: Statement a -> Bool

-- | Case clauses, spec 12.11
data CaseClause a

-- | <pre>
--   case e: stmts;
--   </pre>
CaseClause :: a -> Expression a -> [Statement a] -> CaseClause a

-- | <pre>
--   default: stmts;
--   </pre>
CaseDefault :: a -> [Statement a] -> CaseClause a

-- | Catch clause, spec 12.14
data CatchClause a

-- | <pre>
--   catch (x) {...}
--   </pre>
CatchClause :: a -> Id a -> Statement a -> CatchClause a

-- | for initializer, spec 12.6
data ForInit a

-- | empty
NoInit :: ForInit a

-- | <pre>
--   var x, y=42
--   </pre>
VarInit :: [VarDecl a] -> ForInit a

-- | <pre>
--   expr
--   </pre>
ExprInit :: Expression a -> ForInit a

-- | for..in initializer, spec 12.6
data ForInInit a

-- | <pre>
--   var x
--   </pre>
ForInVar :: Id a -> ForInInit a

-- | <tt>foo.baz</tt>, <tt>foo[bar]</tt>, <tt>z</tt>
ForInLVal :: LValue a -> ForInInit a

-- | A variable declaration, spec 12.2
data VarDecl a

-- | <pre>
--   var x = e;
--   </pre>
VarDecl :: a -> Id a -> Maybe (Expression a) -> VarDecl a

-- | Expressions, see spec 11
data Expression a

-- | <tt>"foo"</tt>, spec 11.1.3, 7.8
StringLit :: a -> String -> Expression a

-- | <tt>RegexpLit a regexp global? case_insensitive?</tt> -- regular
--   expression, see spec 11.1.3, 7.8
RegexpLit :: a -> String -> Bool -> Bool -> Expression a

-- | <tt>41.99999</tt>, spec 11.1.3, 7.8
NumLit :: a -> Double -> Expression a

-- | <tt>42</tt>, spec 11.1.3, 7.8
IntLit :: a -> Int -> Expression a

-- | <tt>true</tt>, spec 11.1.3, 7.8
BoolLit :: a -> Bool -> Expression a

-- | <tt>null</tt>, spec 11.1.3, 7.8
NullLit :: a -> Expression a

-- | <tt>[1,2,3]</tt>, spec 11.1.4
ArrayLit :: a -> [Expression a] -> Expression a

-- | <tt>{foo:"bar", baz: 42}</tt>, spec 11.1.5
ObjectLit :: a -> [(Prop a, Expression a)] -> Expression a

-- | <tt>this</tt>, spec 11.1.1
ThisRef :: a -> Expression a

-- | <tt>foo</tt>, spec 11.1.2
VarRef :: a -> Id a -> Expression a

-- | <tt>foo.bar</tt>, spec 11.2.1
DotRef :: a -> Expression a -> Id a -> Expression a

-- | <tt>foo[bar</tt>, spec 11.2.1
BracketRef :: a -> Expression a -> Expression a -> Expression a

-- | <tt>new foo(bar)</tt>, spec 11.2.2
NewExpr :: a -> Expression a -> [Expression a] -> Expression a

-- | <tt>@e</tt>, spec 11.4 (excluding 11.4.4, 111.4.5)
PrefixExpr :: a -> PrefixOp -> Expression a -> Expression a

-- | <tt>++x</tt>, <tt>x--</tt> etc., spec 11.3, 11.4.4, 11.4.5
UnaryAssignExpr :: a -> UnaryAssignOp -> LValue a -> Expression a

-- | <tt>e1@e2</tt>, spec 11.5, 11.6, 11.7, 11.8, 11.9, 11.10, 11.11
InfixExpr :: a -> InfixOp -> Expression a -> Expression a -> Expression a

-- | <tt>e1 ? e2 : e3</tt>, spec 11.12
CondExpr :: a -> Expression a -> Expression a -> Expression a -> Expression a

-- | <tt>e1 @=e2</tt>, spec 11.13
AssignExpr :: a -> AssignOp -> LValue a -> Expression a -> Expression a

-- | <tt>e1, e2</tt>, spec 11.14
ListExpr :: a -> [Expression a] -> Expression a

-- | <tt>f(x,y,z)</tt>, spec 11.2.3 funcexprs are optionally named
CallExpr :: a -> Expression a -> [Expression a] -> Expression a

-- | <tt>function f (x,y,z) {...}</tt>, spec 11.2.5, 13
FuncExpr :: a -> Maybe (Id a) -> [Id a] -> [Statement a] -> Expression a

-- | Infix operators: see spec 11.5-11.11
data InfixOp

-- | <pre>
--   &lt;
--   </pre>
OpLT :: InfixOp

-- | <pre>
--   &lt;=
--   </pre>
OpLEq :: InfixOp

-- | <pre>
--   &gt;
--   </pre>
OpGT :: InfixOp

-- | <pre>
--   &gt;=
--   </pre>
OpGEq :: InfixOp

-- | <pre>
--   in
--   </pre>
OpIn :: InfixOp

-- | <pre>
--   instanceof
--   </pre>
OpInstanceof :: InfixOp

-- | <pre>
--   ==
--   </pre>
OpEq :: InfixOp

-- | <pre>
--   !=
--   </pre>
OpNEq :: InfixOp

-- | <pre>
--   ===
--   </pre>
OpStrictEq :: InfixOp

-- | <pre>
--   !===
--   </pre>
OpStrictNEq :: InfixOp

-- | <pre>
--   &amp;&amp;
--   </pre>
OpLAnd :: InfixOp

-- | <pre>
--   ||
--   </pre>
OpLOr :: InfixOp

-- | <pre>
--   *
--   </pre>
OpMul :: InfixOp

-- | <pre>
--   /
--   </pre>
OpDiv :: InfixOp

-- | <pre>
--   %
--   </pre>
OpMod :: InfixOp

-- | <pre>
--   -
--   </pre>
OpSub :: InfixOp

-- | <pre>
--   &lt;&lt;
--   </pre>
OpLShift :: InfixOp

-- | <pre>
--   &gt;&gt;
--   </pre>
OpSpRShift :: InfixOp

-- | <pre>
--   &gt;&gt;&gt;
--   </pre>
OpZfRShift :: InfixOp

-- | <pre>
--   &amp;
--   </pre>
OpBAnd :: InfixOp

-- | <pre>
--   ^
--   </pre>
OpBXor :: InfixOp

-- | <pre>
--   |
--   </pre>
OpBOr :: InfixOp

-- | <pre>
--   +
--   </pre>
OpAdd :: InfixOp

-- | Assignment operators: see spec 11.13
data AssignOp

-- | simple assignment, <tt>=</tt>
OpAssign :: AssignOp

-- | <pre>
--   +=
--   </pre>
OpAssignAdd :: AssignOp

-- | <pre>
--   -=
--   </pre>
OpAssignSub :: AssignOp

-- | <pre>
--   *=
--   </pre>
OpAssignMul :: AssignOp

-- | <pre>
--   /=
--   </pre>
OpAssignDiv :: AssignOp

-- | <pre>
--   %=
--   </pre>
OpAssignMod :: AssignOp

-- | <pre>
--   &lt;&lt;=
--   </pre>
OpAssignLShift :: AssignOp

-- | <pre>
--   &gt;&gt;=
--   </pre>
OpAssignSpRShift :: AssignOp

-- | <pre>
--   &gt;&gt;&gt;=
--   </pre>
OpAssignZfRShift :: AssignOp

-- | <pre>
--   &amp;=
--   </pre>
OpAssignBAnd :: AssignOp

-- | <pre>
--   ^=
--   </pre>
OpAssignBXor :: AssignOp

-- | <pre>
--   |=
--   </pre>
OpAssignBOr :: AssignOp
data Id a
Id :: a -> String -> Id a
unId :: Id a -> String

-- | Prefix operators: see spec 11.4 (excluding 11.4.4, 11.4.5)
data PrefixOp

-- | <pre>
--   !
--   </pre>
PrefixLNot :: PrefixOp

-- | <pre>
--   ~
--   </pre>
PrefixBNot :: PrefixOp

-- | <pre>
--   +
--   </pre>
PrefixPlus :: PrefixOp

-- | <pre>
--   -
--   </pre>
PrefixMinus :: PrefixOp

-- | <pre>
--   typeof
--   </pre>
PrefixTypeof :: PrefixOp

-- | <pre>
--   void
--   </pre>
PrefixVoid :: PrefixOp

-- | <pre>
--   delete
--   </pre>
PrefixDelete :: PrefixOp

-- | Property names in an object initializer: see spec 11.1.5
data Prop a

-- | property name is an identifier, <tt>foo</tt>
PropId :: a -> Id a -> Prop a

-- | property name is a string, <tt>"foo"</tt>
PropString :: a -> String -> Prop a

-- | property name is an integer, <tt>42</tt>
PropNum :: a -> Integer -> Prop a

-- | Unary assignment operators: see spec 11.3, 11.4.4, 11.4.5
data UnaryAssignOp

-- | <pre>
--   ++x
--   </pre>
PrefixInc :: UnaryAssignOp

-- | <pre>
--   --x
--   </pre>
PrefixDec :: UnaryAssignOp

-- | <pre>
--   x++
--   </pre>
PostfixInc :: UnaryAssignOp

-- | <pre>
--   x--
--   </pre>
PostfixDec :: UnaryAssignOp

-- | Left-hand side expressions: see spec 11.2
data LValue a

-- | variable reference, <tt>foo</tt>
LVar :: a -> String -> LValue a

-- | <pre>
--   foo.bar
--   </pre>
LDot :: a -> Expression a -> String -> LValue a

-- | <pre>
--   foo[bar]
--   </pre>
LBracket :: a -> Expression a -> Expression a -> LValue a
data SourcePos

-- | The ECMAScript standard defines certain syntactic restrictions on
--   programs (or, more precisely, statements) that aren't easily enforced
--   in the AST datatype. These restrictions have to do with labeled
--   statements and break/continue statement, as well as identifier names.
--   Thus, it is possible to manually generate AST's that correspond to
--   syntactically incorrect programs. Use this predicate to check if an
--   <a>JavaScript</a> AST corresponds to a syntactically correct
--   ECMAScript program.
isValid :: (Data a, Typeable a) => JavaScript a -> Bool

-- | Checks if an identifier name is valid according to the spec
isValidIdentifier :: Id a -> Bool

-- | Checks if the <a>String</a> represents a valid identifier name
isValidIdentifierName :: String -> Bool

-- | Checks if a string is in the list of reserved ECMAScript words
isReservedWord :: String -> Bool

-- | Checks if a character is valid at the start of an identifier
isValidIdStart :: Char -> Bool

-- | Checks if a character is valid in an identifier part
isValidIdPart :: Char -> Bool
data EnclosingStatement

-- | The enclosing statement is an iteration statement
EnclosingIter :: [Label] -> EnclosingStatement

-- | The enclosing statement is a switch statement
EnclosingSwitch :: [Label] -> EnclosingStatement

-- | The enclosing statement is some other statement. Note,
--   <a>EnclosingOther</a> is never pushed if the current <tt>labelSet</tt>
--   is empty, so the list of labels in this constructor should always be
--   non-empty
EnclosingOther :: [Label] -> EnclosingStatement
pushLabel :: forall (m :: Type -> Type) b a. Monad m => Id b -> StateT ([Label], [EnclosingStatement]) m a -> StateT ([Label], [EnclosingStatement]) m a
pushEnclosing :: forall (m :: Type -> Type) a. Monad m => ([Label] -> EnclosingStatement) -> StateT ([Label], [EnclosingStatement]) m a -> StateT ([Label], [EnclosingStatement]) m a
class HasLabelSet a
getLabelSet :: HasLabelSet a => a -> [Label]
setLabelSet :: HasLabelSet a => [Label] -> a -> a
isIter :: EnclosingStatement -> Bool
isIterSwitch :: EnclosingStatement -> Bool
instance GHC.Internal.Data.Data.Data Language.ECMAScript3.Syntax.AssignOp
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Language.ECMAScript3.Syntax.CaseClause a)
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Language.ECMAScript3.Syntax.CatchClause a)
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Language.ECMAScript3.Syntax.Expression a)
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Language.ECMAScript3.Syntax.ForInInit a)
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Language.ECMAScript3.Syntax.ForInit a)
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Language.ECMAScript3.Syntax.Id a)
instance GHC.Internal.Data.Data.Data Language.ECMAScript3.Syntax.InfixOp
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Language.ECMAScript3.Syntax.JavaScript a)
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Language.ECMAScript3.Syntax.LValue a)
instance GHC.Internal.Data.Data.Data Language.ECMAScript3.Syntax.PrefixOp
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Language.ECMAScript3.Syntax.Prop a)
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Language.ECMAScript3.Syntax.Statement a)
instance GHC.Internal.Data.Data.Data Language.ECMAScript3.Syntax.UnaryAssignOp
instance GHC.Internal.Data.Data.Data a => GHC.Internal.Data.Data.Data (Language.ECMAScript3.Syntax.VarDecl a)
instance Data.Default.Internal.Default a => Data.Default.Internal.Default (Language.ECMAScript3.Syntax.JavaScript a)
instance Data.Default.Internal.Default Text.Parsec.Pos.SourcePos
instance GHC.Internal.Enum.Enum Language.ECMAScript3.Syntax.InfixOp
instance GHC.Classes.Eq Language.ECMAScript3.Syntax.AssignOp
instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.ECMAScript3.Syntax.CaseClause a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.ECMAScript3.Syntax.CatchClause a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.ECMAScript3.Syntax.Expression a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.ECMAScript3.Syntax.ForInInit a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.ECMAScript3.Syntax.ForInit a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.ECMAScript3.Syntax.Id a)
instance GHC.Classes.Eq Language.ECMAScript3.Syntax.InfixOp
instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.ECMAScript3.Syntax.JavaScript a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.ECMAScript3.Syntax.LValue a)
instance GHC.Classes.Eq Language.ECMAScript3.Syntax.PrefixOp
instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.ECMAScript3.Syntax.Prop a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.ECMAScript3.Syntax.Statement a)
instance GHC.Classes.Eq Language.ECMAScript3.Syntax.UnaryAssignOp
instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.ECMAScript3.Syntax.VarDecl a)
instance GHC.Internal.Data.Foldable.Foldable Language.ECMAScript3.Syntax.CaseClause
instance GHC.Internal.Data.Foldable.Foldable Language.ECMAScript3.Syntax.CatchClause
instance GHC.Internal.Data.Foldable.Foldable Language.ECMAScript3.Syntax.Expression
instance GHC.Internal.Data.Foldable.Foldable Language.ECMAScript3.Syntax.ForInInit
instance GHC.Internal.Data.Foldable.Foldable Language.ECMAScript3.Syntax.ForInit
instance GHC.Internal.Data.Foldable.Foldable Language.ECMAScript3.Syntax.Id
instance GHC.Internal.Data.Foldable.Foldable Language.ECMAScript3.Syntax.JavaScript
instance GHC.Internal.Data.Foldable.Foldable Language.ECMAScript3.Syntax.LValue
instance GHC.Internal.Data.Foldable.Foldable Language.ECMAScript3.Syntax.Prop
instance GHC.Internal.Data.Foldable.Foldable Language.ECMAScript3.Syntax.Statement
instance GHC.Internal.Data.Foldable.Foldable Language.ECMAScript3.Syntax.VarDecl
instance GHC.Internal.Base.Functor Language.ECMAScript3.Syntax.CaseClause
instance GHC.Internal.Base.Functor Language.ECMAScript3.Syntax.CatchClause
instance GHC.Internal.Base.Functor Language.ECMAScript3.Syntax.Expression
instance GHC.Internal.Base.Functor Language.ECMAScript3.Syntax.ForInInit
instance GHC.Internal.Base.Functor Language.ECMAScript3.Syntax.ForInit
instance GHC.Internal.Base.Functor Language.ECMAScript3.Syntax.Id
instance GHC.Internal.Base.Functor Language.ECMAScript3.Syntax.JavaScript
instance GHC.Internal.Base.Functor Language.ECMAScript3.Syntax.LValue
instance GHC.Internal.Base.Functor Language.ECMAScript3.Syntax.Prop
instance GHC.Internal.Base.Functor Language.ECMAScript3.Syntax.Statement
instance GHC.Internal.Base.Functor Language.ECMAScript3.Syntax.VarDecl
instance Language.ECMAScript3.Syntax.HasLabelSet Language.ECMAScript3.Syntax.EnclosingStatement
instance GHC.Classes.Ord Language.ECMAScript3.Syntax.AssignOp
instance GHC.Classes.Ord a => GHC.Classes.Ord (Language.ECMAScript3.Syntax.CaseClause a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Language.ECMAScript3.Syntax.CatchClause a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Language.ECMAScript3.Syntax.Expression a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Language.ECMAScript3.Syntax.ForInInit a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Language.ECMAScript3.Syntax.ForInit a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Language.ECMAScript3.Syntax.Id a)
instance GHC.Classes.Ord Language.ECMAScript3.Syntax.InfixOp
instance GHC.Classes.Ord a => GHC.Classes.Ord (Language.ECMAScript3.Syntax.JavaScript a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Language.ECMAScript3.Syntax.LValue a)
instance GHC.Classes.Ord Language.ECMAScript3.Syntax.PrefixOp
instance GHC.Classes.Ord a => GHC.Classes.Ord (Language.ECMAScript3.Syntax.Prop a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Language.ECMAScript3.Syntax.Statement a)
instance GHC.Classes.Ord Language.ECMAScript3.Syntax.UnaryAssignOp
instance GHC.Classes.Ord a => GHC.Classes.Ord (Language.ECMAScript3.Syntax.VarDecl a)
instance GHC.Internal.Show.Show Language.ECMAScript3.Syntax.AssignOp
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Language.ECMAScript3.Syntax.CaseClause a)
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Language.ECMAScript3.Syntax.CatchClause a)
instance GHC.Internal.Show.Show Language.ECMAScript3.Syntax.EnclosingStatement
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Language.ECMAScript3.Syntax.Expression a)
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Language.ECMAScript3.Syntax.ForInInit a)
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Language.ECMAScript3.Syntax.ForInit a)
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Language.ECMAScript3.Syntax.Id a)
instance GHC.Internal.Show.Show Language.ECMAScript3.Syntax.InfixOp
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Language.ECMAScript3.Syntax.JavaScript a)
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Language.ECMAScript3.Syntax.LValue a)
instance GHC.Internal.Show.Show Language.ECMAScript3.Syntax.PrefixOp
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Language.ECMAScript3.Syntax.Prop a)
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Language.ECMAScript3.Syntax.Statement a)
instance GHC.Internal.Show.Show Language.ECMAScript3.Syntax.UnaryAssignOp
instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Language.ECMAScript3.Syntax.VarDecl a)
instance GHC.Internal.Data.Traversable.Traversable Language.ECMAScript3.Syntax.CaseClause
instance GHC.Internal.Data.Traversable.Traversable Language.ECMAScript3.Syntax.CatchClause
instance GHC.Internal.Data.Traversable.Traversable Language.ECMAScript3.Syntax.Expression
instance GHC.Internal.Data.Traversable.Traversable Language.ECMAScript3.Syntax.ForInInit
instance GHC.Internal.Data.Traversable.Traversable Language.ECMAScript3.Syntax.ForInit
instance GHC.Internal.Data.Traversable.Traversable Language.ECMAScript3.Syntax.Id
instance GHC.Internal.Data.Traversable.Traversable Language.ECMAScript3.Syntax.JavaScript
instance GHC.Internal.Data.Traversable.Traversable Language.ECMAScript3.Syntax.LValue
instance GHC.Internal.Data.Traversable.Traversable Language.ECMAScript3.Syntax.Prop
instance GHC.Internal.Data.Traversable.Traversable Language.ECMAScript3.Syntax.Statement
instance GHC.Internal.Data.Traversable.Traversable Language.ECMAScript3.Syntax.VarDecl


-- | Pretty-printing JavaScript.
module Language.ECMAScript3.PrettyPrint

-- | A class of pretty-printable ECMAScript AST nodes. Will pretty-print
--   correct JavaScript given that the <a>isValid</a> predicate holds for
--   the AST.
class Pretty a

-- | Pretty-print an ECMAScript AST node. Use <tt>render</tt> or
--   <a>show</a> to convert <a>Doc</a> to <a>String</a>.
prettyPrint :: Pretty a => a -> Doc

-- | DEPRECATED: Use <a>prettyPrint</a> instead! Renders a JavaScript
--   program as a document, the show instance of <a>Doc</a> will
--   pretty-print it automatically

-- | <i>Deprecated: These interfaces are outdated and would be
--   removed/hidden in version 1.0. Use the Pretty class instead.</i>
javaScript :: JavaScript a -> Doc

-- | DEPRECATED: Use <a>prettyPrint</a> instead! Renders a list of
--   statements as a <a>String</a>

-- | <i>Deprecated: These interfaces are outdated and would be
--   removed/hidden in version 1.0. Use the Pretty class instead.</i>
renderStatements :: [Statement a] -> String

-- | DEPRECATED: Use <a>prettyPrint</a> instead! Renders a list of
--   statements as a <a>String</a>

-- | <i>Deprecated: These interfaces are outdated and would be
--   removed/hidden in version 1.0. Use the Pretty class instead.</i>
renderExpression :: Expression a -> String

-- | <i>Deprecated: These interfaces are outdated and would be
--   removed/hidden in version 1.0. Use the Pretty class instead.</i>
class PP a
pp :: PP a => a -> Doc

-- | A predicate to tell if the expression --when pretty-printed-- will
--   begin with "function" or '{' and be thus unsafe to use in an
--   expression statement without wrapping it in <tt>()</tt>.
unsafeInExprStmt :: Expression a -> Bool
instance Language.ECMAScript3.PrettyPrint.Pretty a => Language.ECMAScript3.PrettyPrint.PP a
instance Language.ECMAScript3.PrettyPrint.Pretty Language.ECMAScript3.Syntax.AssignOp
instance Language.ECMAScript3.PrettyPrint.Pretty (Language.ECMAScript3.Syntax.CaseClause a)
instance Language.ECMAScript3.PrettyPrint.Pretty (Language.ECMAScript3.Syntax.CatchClause a)
instance Language.ECMAScript3.PrettyPrint.Pretty (Language.ECMAScript3.Syntax.Expression a)
instance Language.ECMAScript3.PrettyPrint.Pretty (Language.ECMAScript3.Syntax.ForInInit a)
instance Language.ECMAScript3.PrettyPrint.Pretty (Language.ECMAScript3.Syntax.ForInit a)
instance Language.ECMAScript3.PrettyPrint.Pretty (Language.ECMAScript3.Syntax.Id a)
instance Language.ECMAScript3.PrettyPrint.Pretty Language.ECMAScript3.Syntax.InfixOp
instance Language.ECMAScript3.PrettyPrint.Pretty (Language.ECMAScript3.Syntax.JavaScript a)
instance Language.ECMAScript3.PrettyPrint.Pretty (Language.ECMAScript3.Syntax.LValue a)
instance Language.ECMAScript3.PrettyPrint.Pretty [Language.ECMAScript3.Syntax.Statement a]
instance Language.ECMAScript3.PrettyPrint.Pretty Language.ECMAScript3.Syntax.PrefixOp
instance Language.ECMAScript3.PrettyPrint.Pretty (Language.ECMAScript3.Syntax.Prop a)
instance Language.ECMAScript3.PrettyPrint.Pretty (Language.ECMAScript3.Syntax.Statement a)
instance Language.ECMAScript3.PrettyPrint.Pretty (Language.ECMAScript3.Syntax.VarDecl a)


-- | Simple textual diffing of JavaScript programs for inspecting test
--   failures
module Language.ECMAScript3.SourceDiff
jsDiff :: JavaScript a -> JavaScript a -> String


-- | A lexical environment analysis of ECMAScript programs

-- | <i>Deprecated: Use <a>LexicalEnvironment</a> from package
--   'language-ecmascript-analysis'</i>
module Language.ECMAScript3.Analysis.Environment
env :: Map String SourcePos -> [Statement SourcePos] -> (EnvTree, Map String SourcePos)
localVars :: [Statement SourcePos] -> [(String, SourcePos)]

-- | The statically-determinate lexical structure of a JavaScript program.
data EnvTree
EnvTree :: Map String SourcePos -> [EnvTree] -> EnvTree


-- | A few helpers to work with the AST annotations
module Language.ECMAScript3.Syntax.Annotations

-- | Removes annotations from a tree
removeAnnotations :: Traversable t => t a -> t ()

-- | Changes all the labels in the tree to another one, given by a
--   function.
reannotate :: Traversable t => (a -> b) -> t a -> t b

-- | add an extra field to the AST labels (the label would look like <tt>
--   (a, b) </tt>)
addExtraAnnotationField :: Traversable t => b -> t a -> t (a, b)

-- | remove an extra field
removeExtraAnnotationField :: Traversable t => t (a, b) -> t a

-- | Assigns unique numeric (Int) ids to each node in the AST. Returns a
--   pair: the tree annotated with UID's and the last ID that was assigned.
assignUniqueIds :: Traversable t => Int -> t a -> (t (a, Int), Int)

-- | Things that have annotations -- for example, nodes in a syntax tree
class HasAnnotation (a :: Type -> Type)

-- | Returns the annotation of the root of the tree
getAnnotation :: HasAnnotation a => a b -> b

-- | Sets the annotation of the root of the tree
setAnnotation :: HasAnnotation a => b -> a b -> a b

-- | Modify the annotation of the root node of the syntax tree
withAnnotation :: HasAnnotation a => (b -> b) -> a b -> a b
instance Language.ECMAScript3.Syntax.Annotations.HasAnnotation Language.ECMAScript3.Syntax.CaseClause
instance Language.ECMAScript3.Syntax.Annotations.HasAnnotation Language.ECMAScript3.Syntax.CatchClause
instance Language.ECMAScript3.Syntax.Annotations.HasAnnotation Language.ECMAScript3.Syntax.Expression
instance Language.ECMAScript3.Syntax.Annotations.HasAnnotation Language.ECMAScript3.Syntax.Id
instance Language.ECMAScript3.Syntax.Annotations.HasAnnotation Language.ECMAScript3.Syntax.LValue
instance Language.ECMAScript3.Syntax.Annotations.HasAnnotation Language.ECMAScript3.Syntax.Prop
instance Language.ECMAScript3.Syntax.Annotations.HasAnnotation Language.ECMAScript3.Syntax.Statement
instance Language.ECMAScript3.Syntax.Annotations.HasAnnotation Language.ECMAScript3.Syntax.VarDecl


-- | Parser for ECMAScript 3.
module Language.ECMAScript3.Parser

-- | Parse from a stream given a parser, same as <a>parse</a> in Parsec. We
--   can use this to parse expressions or statements alone, not just whole
--   programs.
parse :: Stream s Identity Char => Parser s a -> SourceName -> s -> Either ParseError a

-- | The parser type, parametrised by the stream type <tt>s</tt> and the
--   return value <tt>a</tt>
type Parser s a = ParsecT s ParserState Identity a

-- | A parser that parses ECMAScript expressions
expression :: Stream s Identity Char => Parser s (Expression SourcePos)

-- | The parser that parses a single ECMAScript statement
statement :: Stream s Identity Char => Parser s (Statement SourcePos)

-- | A parser that parses an ECMAScript program.
program :: Stream s Identity Char => Parser s (JavaScript SourcePos)

-- | A convenience function that takes a <a>String</a> and tries to parse
--   it as an ECMAScript program:
--   
--   <pre>
--   parseFromString = parse program ""
--   </pre>
parseFromString :: String -> Either ParseError (JavaScript SourcePos)

-- | A convenience function that takes a filename and tries to parse the
--   file contents an ECMAScript program, it fails with an error message if
--   it can't.
parseFromFile :: (MonadIO m, MonadError String m) => String -> m (JavaScript SourcePos)

-- | Parse a JavaScript program from a string

-- | <i>Deprecated: Use <a>parseFromString</a> instead</i>
parseScriptFromString :: String -> String -> Either ParseError (JavaScript SourcePos)

-- | Read a JavaScript program from file an parse it into a list of
--   statements

-- | <i>Deprecated: Use <a>parseFromFile</a> instead</i>
parseJavaScriptFromFile :: MonadIO m => String -> m [Statement SourcePos]

-- | <i>Deprecated: Use <a>program</a> instead</i>
parseScript :: Stream s Identity Char => Parser s (JavaScript SourcePos)

-- | <i>Deprecated: Use <a>expression</a> instead</i>
parseExpression :: Stream s Identity Char => ExpressionParser s

-- | Parse a JavaScript source string into a list of statements

-- | <i>Deprecated: Use <a>parseFromString</a> instead</i>
parseString :: String -> [Statement SourcePos]

-- | <i>Deprecated: These type aliases will be hidden in the next
--   version</i>
type ParsedStatement = Statement SourcePos

-- | <i>Deprecated: These type aliases will be hidden in the next
--   version</i>
type ParsedExpression = Expression SourcePos

-- | <i>Deprecated: These parsers will be hidden in the next version</i>
parseSimpleExpr' :: Stream s Identity Char => ExpressionParser s

-- | <i>Deprecated: These parsers will be hidden in the next version</i>
parseBlockStmt :: Stream s Identity Char => StatementParser s

-- | <i>Deprecated: Use <a>statement</a> instead</i>
parseStatement :: Stream s Identity Char => StatementParser s

-- | <i>Deprecated: These type aliases will be hidden in the next
--   version</i>
type StatementParser s = Parser s ParsedStatement

-- | <i>Deprecated: These type aliases will be hidden in the next
--   version</i>
type ExpressionParser s = Parser s ParsedExpression

-- | <i>Deprecated: Use <a>expression</a> instead</i>
assignExpr :: Stream s Identity Char => ExpressionParser s

-- | <i>Deprecated: These parsers will be hidden in the next version</i>
parseObjectLit :: Stream s Identity Char => ExpressionParser s


-- | Re-exports commonly used modules.
module Language.ECMAScript3

-- | DEPRECATED: Use <a>prettyPrint</a> instead! Renders a list of
--   statements as a <a>String</a>

-- | <i>Deprecated: These interfaces are outdated and would be
--   removed/hidden in version 1.0. Use the Pretty class instead.</i>
renderStatements :: [Statement a] -> String

-- | DEPRECATED: Use <a>prettyPrint</a> instead! Renders a list of
--   statements as a <a>String</a>

-- | <i>Deprecated: These interfaces are outdated and would be
--   removed/hidden in version 1.0. Use the Pretty class instead.</i>
renderExpression :: Expression a -> String


-- | Label-set analysis which annotates all the statements in the script
--   with their label sets according to ECMAScript specification, section
--   12.12. The result of this analysis are useful for building
--   control-flow graphs.

-- | <i>Deprecated: Use <a>LabelSet</a> from package
--   'language-ecmascript-analysis'</i>
module Language.ECMAScript3.Analysis.LabelSets

-- | Annotates statements with their label sets; example use:
--   
--   <pre>
--   &gt;&gt;&gt; let jsa = reannotate (\a -&gt; (a, Set.empty))
--   
--   &gt;&gt;&gt; in  annotateLabelSets jsa snd (\labs (a, ls) -&gt; (a, labs `Set.union` ls))
--   </pre>
annotateLabelSets :: Data a => (a -> Set Label) -> (Set Label -> a -> a) -> JavaScript a -> JavaScript a

-- | Labels are either strings (identifiers) or <i>empty</i> (see 12.12 of
--   the spec)
data Label
Label :: String -> Label
EmptyLabel :: Label
instance GHC.Internal.Data.Data.Data Language.ECMAScript3.Analysis.LabelSets.Label
instance GHC.Classes.Eq Language.ECMAScript3.Analysis.LabelSets.Label
instance GHC.Classes.Ord Language.ECMAScript3.Analysis.LabelSets.Label
instance GHC.Internal.Show.Show Language.ECMAScript3.Analysis.LabelSets.Label


-- | Utility combinator functions for simplifying writing programmatic
--   generation of ECMAScript code. Recommended to use together with the
--   -XOverloadedStrings GHC extension.
module Language.ECMAScript3.Syntax.CodeGen
script :: Default a => [Statement a] -> JavaScript a
ident :: Default a => String -> Id a
propId :: Default a => Id a -> Prop a
propS :: Default a => String -> Prop a
propN :: Default a => Integer -> Prop a
lvar :: Default a => String -> LValue a
ldot :: Default a => Expression a -> String -> LValue a
lbrack :: Default a => Expression a -> Expression a -> LValue a
string :: Default a => String -> Expression a
regexp :: Default a => String -> Bool -> Bool -> Expression a
number :: Default a => Double -> Expression a
bool :: Default a => Bool -> Expression a
int :: Default a => Int -> Expression a
null_ :: Default a => Expression a
array :: Default a => [Expression a] -> Expression a
object :: Default a => [(Prop a, Expression a)] -> Expression a
this :: Default a => Expression a
var :: Default a => Id a -> Expression a
dot :: Default a => Expression a -> Id a -> Expression a
brack :: Default a => Expression a -> Expression a -> Expression a
new :: Default a => Expression a -> [Expression a] -> Expression a
prefix :: Default a => PrefixOp -> Expression a -> Expression a
lnot :: Default a => Expression a -> Expression a
bnot :: Default a => Expression a -> Expression a
plus :: Default a => Expression a -> Expression a
minus :: Default a => Expression a -> Expression a
typeof :: Default a => Expression a -> Expression a
void :: Default a => Expression a -> Expression a
delete :: Default a => Expression a -> Expression a
uassign :: Default a => UnaryAssignOp -> LValue a -> Expression a
preinc :: Default a => LValue a -> Expression a
predec :: Default a => LValue a -> Expression a
postinc :: Default a => LValue a -> Expression a
postdec :: Default a => LValue a -> Expression a
infixe :: Default a => InfixOp -> Expression a -> Expression a -> Expression a
lt :: Default a => Expression a -> Expression a -> Expression a
le :: Default a => Expression a -> Expression a -> Expression a
gt :: Default a => Expression a -> Expression a -> Expression a
ge :: Default a => Expression a -> Expression a -> Expression a
in_ :: Default a => Expression a -> Expression a -> Expression a
instanceof :: Default a => Expression a -> Expression a -> Expression a
eq :: Default a => Expression a -> Expression a -> Expression a
neq :: Default a => Expression a -> Expression a -> Expression a
steq :: Default a => Expression a -> Expression a -> Expression a
stneq :: Default a => Expression a -> Expression a -> Expression a
land :: Default a => Expression a -> Expression a -> Expression a
lor :: Default a => Expression a -> Expression a -> Expression a
mul :: Default a => Expression a -> Expression a -> Expression a
div :: Default a => Expression a -> Expression a -> Expression a
mod :: Default a => Expression a -> Expression a -> Expression a
sub :: Default a => Expression a -> Expression a -> Expression a
lshift :: Default a => Expression a -> Expression a -> Expression a
srshift :: Default a => Expression a -> Expression a -> Expression a
zrshift :: Default a => Expression a -> Expression a -> Expression a
band :: Default a => Expression a -> Expression a -> Expression a
bor :: Default a => Expression a -> Expression a -> Expression a
xor :: Default a => Expression a -> Expression a -> Expression a
add :: Default a => Expression a -> Expression a -> Expression a
cond :: Default a => Expression a -> Expression a -> Expression a -> Expression a
assignop :: Default a => AssignOp -> LValue a -> Expression a -> Expression a
assign :: Default a => LValue a -> Expression a -> Expression a
assignadd :: Default a => LValue a -> Expression a -> Expression a
assignsub :: Default a => LValue a -> Expression a -> Expression a
assignmul :: Default a => LValue a -> Expression a -> Expression a
assigndiv :: Default a => LValue a -> Expression a -> Expression a
assignmod :: Default a => LValue a -> Expression a -> Expression a
assignlshift :: Default a => LValue a -> Expression a -> Expression a
assignsrshift :: Default a => LValue a -> Expression a -> Expression a
assignzrshift :: Default a => LValue a -> Expression a -> Expression a
assignband :: Default a => LValue a -> Expression a -> Expression a
assignxor :: Default a => LValue a -> Expression a -> Expression a
assignbor :: Default a => LValue a -> Expression a -> Expression a
list :: Default a => [Expression a] -> Expression a
call :: Default a => Expression a -> [Expression a] -> Expression a
func :: Default a => Id a -> [Id a] -> [Statement a] -> Expression a
lambda :: Default a => [Id a] -> [Statement a] -> Expression a
casee :: Default a => Expression a -> [Statement a] -> CaseClause a
defaultc :: Default a => [Statement a] -> CaseClause a
catch :: Default a => Id a -> Statement a -> CatchClause a
vardecl :: Default a => Id a -> VarDecl a
varinit :: Default a => Id a -> Expression a -> VarDecl a
block :: Default a => [Statement a] -> Statement a
empty :: Default a => Statement a
expr :: Default a => Expression a -> Statement a
ifte :: Default a => Expression a -> Statement a -> Statement a -> Statement a
ift :: Default a => Expression a -> Statement a -> Statement a
switch :: Default a => Expression a -> [CaseClause a] -> Statement a
while :: Default a => Expression a -> Statement a -> Statement a
dowhile :: Default a => Statement a -> Expression a -> Statement a
break :: Default a => Maybe (Id a) -> Statement a
continue :: Default a => Maybe (Id a) -> Statement a
label :: Default a => Id a -> Statement a -> Statement a
forin :: Default a => ForInInit a -> Expression a -> Statement a -> Statement a
for :: Default a => ForInit a -> Maybe (Expression a) -> Maybe (Expression a) -> Statement a -> Statement a
try :: Default a => Statement a -> Statement a
trycatch :: Default a => Statement a -> CatchClause a -> Maybe (Statement a) -> Statement a
tryfinally :: Default a => Statement a -> Statement a -> Statement a
trycatchfinally :: Default a => Statement a -> CatchClause a -> Statement a -> Statement a
throw :: Default a => Expression a -> Statement a
returns :: Default a => Expression a -> Statement a
ret :: Default a => Statement a
with :: Default a => Expression a -> Statement a -> Statement a
vardecls :: Default a => [VarDecl a] -> Statement a
function :: Default a => Id a -> [Id a] -> [Statement a] -> Statement a

-- | Convert an identifier to a String literal
id2string :: Id a -> Expression a

-- | Helper function to convert LValues to expressions
lv2e :: LValue a -> Expression a

-- | Convert an expression to an l-value. May fail with an error
e2lv :: Expression a -> LValue a
forInInit2lv :: ForInInit a -> LValue a
instance Data.Default.Internal.Default a => GHC.Internal.Data.String.IsString (Language.ECMAScript3.Syntax.Expression a)
instance Data.Default.Internal.Default a => GHC.Internal.Data.String.IsString (Language.ECMAScript3.Syntax.Id a)
instance Data.Default.Internal.Default a => GHC.Internal.Data.String.IsString (Language.ECMAScript3.Syntax.LValue a)
instance Data.Default.Internal.Default a => GHC.Internal.Data.String.IsString (Language.ECMAScript3.Syntax.Prop a)


-- | Experimental and very simple quasi-quotation of ECMAScript in Haskell.
--   Doesn't support anti-quotation as of now.
module Language.ECMAScript3.Syntax.QuasiQuote
js :: QuasiQuoter
jsexpr :: QuasiQuoter
jsstmt :: QuasiQuoter
