/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
   Use of this source code is governed by a BSD-style license that can be
  found in the LICENSE file. */

/* Test Exception productions

Run with --test to generate an AST and verify that all comments accurately
reflect the state of the Nodes.

BUILD Type(Name)
This comment signals that a node of type <Type> is created with the
name <Name>.

ERROR Error String
This comment signals that a error of <Error String> is generated.  The error
is not assigned to a node, but are expected in order.

PROP Key=Value
This comment signals that a property has been set on the Node such that
<Key> = <Value>.

TREE
Type(Name)
  Type(Name)
  Type(Name)
    Type(Name)
    ...
This comment signals that a tree of nodes matching the BUILD comment
symatics should exist.  This is an exact match.
*/


/* TREE
 *Exception(MyExc)
 */
exception MyExc { };

/* TREE
 *Exception(MyExcInherit)
 *  Inherit(Foo)
 */
exception MyExcInherit : Foo {};

/* ERROR Unexpected keyword "exception" after keyword "partial". */
partial exception MyExcPartial { };

/* TREE
 *Exception(MyExcBig)
 *  ExceptionField(MyString)
 *    Type()
 *      StringType(DOMString)
 *  Error(Unexpected "=" after identifier "ErrorSetLong".)
 *  ExceptionField(MyLong)
 *    Type()
 *      PrimitiveType(long)
 */
exception MyExcBig {
  DOMString MyString;
  unsigned long long ErrorSetLong = 123;
  long MyLong;
};


/* ERROR Unexpected "{" after keyword "exception". */
exception {
  DOMString? setString = null;
};


/* ERROR Unexpected identifier "NoColon" after identifier "ForParent". */
exception ForParent NoColon {
  DOMString? setString = null;
};

/* TREE
 *Exception(MyExcConst)
 *  Const(setString)
 *    StringType(DOMString)
 *    Value(NULL)
 */
exception MyExcConst {
  const DOMString? setString = null;
};




