syntax/ast-checked.ss
(module ast-checked mzscheme
  (require (planet "contract-utils.ss" ("cobbe" "contract-utils.plt" 1 0))
           (lib "contract.ss")
           "ast-core.ss"
           "ast-utils.ss"
           "token.ss")

  (provide/contract
    [Term? predicate/c]
    [Term-location (Term? . -> . (optional/c region?))])

  (provide/contract
    (struct (Declaration Term) ([location (optional/c region?)]))
    (struct (Expression Term) ([location (optional/c region?)]))
    (struct (Statement Term) ([location (optional/c region?)]))
    (struct (Identifier Term) ([location (optional/c region?)]
                               [name symbol?]))
    (struct (CaseClause Term) ([location (optional/c region?)]
                               [question (optional/c Expression/X?)]
                               [answer SubStatementList/X?]))
    (struct (CatchClause Term) ([location (optional/c region?)]
                                [id Identifier?]
                                [body Statement/X?]))
    (struct (VariableInitializer Term) ([location (optional/c region?)]
                                        [id Identifier?]
                                        [init (optional/c Expression/X?)])))

  (provide/contract
    (struct (FunctionDeclaration Declaration) ([location (optional/c region?)]
                                               [name Identifier?]
                                               [args (listof Identifier?)]
                                               [body (listof SourceElement?)]))
    (struct (VariableDeclaration Declaration) ([location (optional/c region?)]
                                               [bindings (nelistof/c VariableInitializer?)]))
    (struct (LetDeclaration Declaration) ([location (optional/c region?)]
                                          [bindings (union (nelistof/c VariableInitializer?)
                                                           (nelistof/c FunctionDeclaration?))])))

  (provide/contract
    (struct (StringLiteral Expression) ([location (optional/c region?)]
                                        [value string?]))
    (struct (RegexpLiteral Expression) ([location (optional/c region?)]
                                        [pattern string?]
                                        [global? boolean?]
                                        [case-insensitive? boolean?]))
    (struct (NumericLiteral Expression) ([location (optional/c region?)]
                                         [value number?]))
    (struct (BooleanLiteral Expression) ([location (optional/c region?)]
                                         [value boolean?]))
    (struct (NullLiteral Expression) ([location (optional/c region?)]))
    (struct (ArrayLiteral Expression) ([location (optional/c region?)]
                                       [elements (listof (optional/c Expression/X?))]))
    (struct (ObjectLiteral Expression) ([location (optional/c region?)]
                                        [properties (listof (cons/c Property? Expression/X?))]))
    (struct (ThisReference Expression) ([location (optional/c region?)]))
    (struct (VarReference Expression) ([location (optional/c region?)]
                                       [id Identifier?]))
    (struct (BracketReference Expression) ([location (optional/c region?)]
                                           [container Expression/X?]
                                           [key Expression/X?]))
    (struct (DotReference Expression) ([location (optional/c region?)]
                                       [container Expression/X?]
                                       [id Identifier?]))
    (struct (NewExpression Expression) ([location (optional/c region?)]
                                        [constructor Expression/X?]
                                        [arguments ExpressionList/X?]))
    (struct (PostfixExpression Expression) ([location (optional/c region?)]
                                            [expression Expression/X?]
                                            [operator PostfixOperator/c]))
    (struct (PrefixExpression Expression) ([location (optional/c region?)]
                                           [operator PrefixOperator/c]
                                           [expression Expression/X?]))
    (struct (InfixExpression Expression) ([location (optional/c region?)]
                                          [left Expression/X?]
                                          [operator InfixOperator/c]
                                          [right Expression/X?]))
    (struct (ConditionalExpression Expression) ([location (optional/c region?)]
                                                [test Expression/X?]
                                                [consequent Expression/X?]
                                                [alternate Expression/X?]))
    (struct (AssignmentExpression Expression) ([location (optional/c region?)]
                                               [lhs Expression/X?]
                                               [operator AssignmentOperator/c]
                                               [rhs Expression/X?]))
    (struct (FunctionExpression Expression) ([location (optional/c region?)]
                                             [name (optional/c Identifier?)]
                                             [args (listof Identifier?)]
                                             [body (listof SourceElement?)]))
    (struct (LetExpression Expression) ([location (optional/c region?)]
                                        [bindings (listof VariableInitializer?)]
                                        [body Expression/X?]))
    (struct (CallExpression Expression) ([location (optional/c region?)]
                                         [method Expression/X?]
                                         [args ExpressionList/X?]))
    (struct (ParenExpression Expression) ([location (optional/c region?)]
                                          [expression Expression/X?]))
    (struct (ListExpression Expression) ([location (optional/c region?)]
                                         [expressions ExpressionList/X?])))

  (provide/contract
    (struct (BlockStatement Statement) ([location (optional/c region?)]
                                        [statements SubStatementList/X?]))
    (struct (EmptyStatement Statement) ([location (optional/c region?)]))
    (struct (ExpressionStatement Statement) ([location (optional/c region?)]
                                             [expression Expression/X?]))
    (struct (IfStatement Statement) ([location (optional/c region?)]
                                     [test Expression/X?]
                                     [consequent SubStatement/X?]
                                     [alternate (optional/c SubStatement/X?)]))
    (struct (DoWhileStatement Statement) ([location (optional/c region?)]
                                          [body SubStatement/X?]
                                          [test Expression/X?]))
    (struct (WhileStatement Statement) ([location (optional/c region?)]
                                        [test Expression/X?]
                                        [body SubStatement/X?]))
    (struct (ForStatement Statement) ([location (optional/c region?)]
                                      [init (union (optional/c Expression/X?) VariableDeclaration?)]
                                      [test (optional/c Expression/X?)]
                                      [incr (optional/c Expression/X?)]
                                      [body SubStatement/X?]))
    (struct (ForInStatement Statement) ([location (optional/c region?)]
                                        [lhs (union Expression/X? VariableDeclaration?)]
                                        [container Expression/X?]
                                        [body SubStatement/X?]))
    (struct (ContinueStatement Statement) ([location (optional/c region?)]
                                           [label (optional/c Identifier?)]))
    (struct (BreakStatement Statement) ([location (optional/c region?)]
                                        [label (optional/c Identifier?)]))
    (struct (ReturnStatement Statement) ([location (optional/c region?)]
                                         [value (optional/c Expression/X?)]))
    (struct (LetStatement Statement) ([location (optional/c region?)]
                                      [bindings (listof VariableInitializer?)]
                                      [body SubStatement/X?]))
    (struct (WithStatement Statement) ([location (optional/c region?)]
                                       [context Expression/X?]
                                       [body SubStatement/X?]))
    (struct (SwitchStatement Statement) ([location (optional/c region?)]
                                         [expression Expression/X?]
                                         [cases (listof CaseClause?)]))
    (struct (LabelledStatement Statement) ([location (optional/c region?)]
                                           [label Identifier?]
                                           [statement SubStatement/X?]))
    (struct (ThrowStatement Statement) ([location (optional/c region?)]
                                        [value Expression/X?]))
    (struct (TryStatement Statement) ([location (optional/c region?)]
                                      [body Statement/X?]
                                      [catch (listof CatchClause?)]
                                      [finally (optional/c Statement/X?)])))

  (provide (all-from "ast-utils.ss")))