language-ecmascript-0.17: JavaScript parser and pretty-printer library

Safe HaskellNone



ECMAScript 3 syntax. Spec refers to the ECMA-262 specification, 3rd edition.



data JavaScript a Source


Script a [Statement a]

A script in <script> ... </script> tags.

unJavaScript :: JavaScript a -> [Statement a] Source

extracts statements from a JavaScript type

data Statement a Source

Statements, spec 12.


BlockStmt a [Statement a]

{stmts}, spec 12.1

EmptyStmt a

;, spec 12.3

ExprStmt a (Expression a)

expr;, spec 12.4

IfStmt a (Expression a) (Statement a) (Statement a)

if (e) stmt, spec 12.5

IfSingleStmt a (Expression a) (Statement a)

if (e) stmt1 else stmt2, spec 12.5

SwitchStmt a (Expression a) [CaseClause a]

switch (e) clauses, spec 12.11

WhileStmt a (Expression a) (Statement a)

while (e) do stmt, spec 12.6

DoWhileStmt a (Statement a) (Expression a)

do stmt while (e);, spec 12.6

BreakStmt a (Maybe (Id a))

break lab;, spec 12.8

ContinueStmt a (Maybe (Id a))

continue lab;, spec 12.7

LabelledStmt a (Id a) (Statement a)

lab: stmt, spec 12.12

ForInStmt a (ForInInit a) (Expression a) (Statement a)

for (x in o) stmt, spec 12.6

ForStmt a (ForInit a) (Maybe (Expression a)) (Maybe (Expression a)) (Statement a)

ForStmt a init test increment body, for (init; test, increment) body, spec 12.6

TryStmt a (Statement a) (Maybe (CatchClause a)) (Maybe (Statement a))

try stmt catch(x) stmt finally stmt, spec 12.14

ThrowStmt a (Expression a)

throw expr;, spec 12.13

ReturnStmt a (Maybe (Expression a))

return expr;, spec 12.9

WithStmt a (Expression a) (Statement a)

with (o) stmt, spec 12.10

VarDeclStmt a [VarDecl a]

var x, y=42;, spec 12.2

FunctionStmt a (Id a) [Id a] [Statement a]

function f(x, y, z) {...}, spec 13

isIterationStmt :: Statement a -> Bool Source

Returns True if the statement is an IterationStatement according to spec 12.6.

data CaseClause a Source

Case clauses, spec 12.11


CaseClause a (Expression a) [Statement a]
case e: stmts;
CaseDefault a [Statement a]
default: stmts;

data ForInit a Source

for initializer, spec 12.6




VarInit [VarDecl a]
var x, y=42
ExprInit (Expression a)

data ForInInit a Source initializer, spec 12.6


ForInVar (Id a)
var x
ForInLVal (LValue a)

foo.baz, foo[bar], z

data VarDecl a Source

A variable declaration, spec 12.2


VarDecl a (Id a) (Maybe (Expression a))
var x = e;

data Expression a Source

Expressions, see spec 11


StringLit a String

"foo", spec 11.1.3, 7.8

RegexpLit a String Bool Bool

RegexpLit a regexp global? case_insensitive? -- regular expression, see spec 11.1.3, 7.8

NumLit a Double

41.99999, spec 11.1.3, 7.8

IntLit a Int

42, spec 11.1.3, 7.8

BoolLit a Bool

true, spec 11.1.3, 7.8

NullLit a

null, spec 11.1.3, 7.8

ArrayLit a [Expression a]

[1,2,3], spec 11.1.4

ObjectLit a [(Prop a, Expression a)]

{foo:"bar", baz: 42}, spec 11.1.5

ThisRef a

this, spec 11.1.1

VarRef a (Id a)

foo, spec 11.1.2

DotRef a (Expression a) (Id a), spec 11.2.1

BracketRef a (Expression a) (Expression a)

foo[bar, spec 11.2.1

NewExpr a (Expression a) [Expression a]

new foo(bar), spec 11.2.2

PrefixExpr a PrefixOp (Expression a)

@e, spec 11.4 (excluding 11.4.4, 111.4.5)

UnaryAssignExpr a UnaryAssignOp (LValue a)

++x, x-- etc., spec 11.3, 11.4.4, 11.4.5

InfixExpr a InfixOp (Expression a) (Expression a)

e1@e2, spec 11.5, 11.6, 11.7, 11.8, 11.9, 11.10, 11.11

CondExpr a (Expression a) (Expression a) (Expression a)

e1 ? e2 : e3, spec 11.12

AssignExpr a AssignOp (LValue a) (Expression a)

e1 @=e2, spec 11.13

ListExpr a [Expression a]

e1, e2, spec 11.14

CallExpr a (Expression a) [Expression a]

f(x,y,z), spec 11.2.3 funcexprs are optionally named

FuncExpr a (Maybe (Id a)) [Id a] [Statement a]

function f (x,y,z) {...}, spec 11.2.5, 13

data Id a Source


Id a String 


Functor Id 
Foldable Id 
Traversable Id 
HasAnnotation Id 
Eq a => Eq (Id a) 
Data a => Data (Id a) 
Ord a => Ord (Id a) 
Show a => Show (Id a) 
Default a => IsString (Id a) 
(Enumerable a, Arbitrary a) => Arbitrary (Id a) 
Enumerable a0 => Enumerable (Id a) 
Pretty (Id a) 
Fixable (Id a) 
Typeable (* -> *) Id 

data Prop a Source

Property names in an object initializer: see spec 11.1.5


PropId a (Id a)

property name is an identifier, foo

PropString a String

property name is a string, "foo"

PropNum a Integer

property name is an integer, 42


Functor Prop 
Foldable Prop 
Traversable Prop 
HasAnnotation Prop 
Eq a => Eq (Prop a) 
Data a => Data (Prop a) 
Ord a => Ord (Prop a) 
Show a => Show (Prop a) 
Default a => IsString (Prop a) 
(Enumerable a, Arbitrary a) => Arbitrary (Prop a) 
Enumerable a0 => Enumerable (Prop a) 
Pretty (Prop a) 
Data a => Fixable (Prop a) 
Typeable (* -> *) Prop 

data LValue a Source

Left-hand side expressions: see spec 11.2


LVar a String

variable reference, foo

LDot a (Expression a) String
LBracket a (Expression a) (Expression a)

data SourcePos :: *

The abstract data type SourcePos represents source positions. It contains the name of the source (i.e. file name), a line number and a column number. SourcePos is an instance of the Show, Eq and Ord class.

isValid :: forall a. (Data a, Typeable a) => JavaScript a -> Bool Source

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 JavaScript AST corresponds to a syntactically correct ECMAScript program.

isValidIdentifier :: Id a -> Bool Source

Checks if an identifier name is valid according to the spec

isValidIdentifierName :: String -> Bool Source

Checks if the String represents a valid identifier name

isReservedWord :: String -> Bool Source

Checks if a string is in the list of reserved ECMAScript words

isValidIdStart :: Char -> Bool Source

Checks if a character is valid at the start of an identifier

isValidIdPart :: Char -> Bool Source

Checks if a character is valid in an identifier part

data EnclosingStatement Source


EnclosingIter [Label]

The enclosing statement is an iteration statement

EnclosingSwitch [Label]

The enclosing statement is a switch statement

EnclosingOther [Label]

The enclosing statement is some other statement. Note, EnclosingOther is never pushed if the current labelSet is empty, so the list of labels in this constructor should always be non-empty

pushLabel :: Monad m => Id b -> StateT ([Label], [EnclosingStatement]) m a -> StateT ([Label], [EnclosingStatement]) m a Source

pushEnclosing :: Monad m => ([Label] -> EnclosingStatement) -> StateT ([Label], [EnclosingStatement]) m a -> StateT ([Label], [EnclosingStatement]) m a Source

class HasLabelSet a where Source


getLabelSet :: a -> [Label] Source

setLabelSet :: [Label] -> a -> a Source