/* 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 Callback 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
 *Callback(VoidFunc)
 *  Type()
 *    PrimitiveType(void)
 *  Arguments()
 */
callback VoidFunc = void();

/* TREE
 *Callback(VoidFuncLongErr)
 *  Type()
 *    PrimitiveType(void)
 *  Arguments()
 *    Error(Unexpected ).)
 */
callback VoidFuncLongErr = void ( long );

/* TREE
 *Callback(VoidFuncLong)
 *  Type()
 *    PrimitiveType(void)
 *  Arguments()
 *    Argument(L1)
 *      Type()
 *        PrimitiveType(long)
 */
callback VoidFuncLong = void ( long L1 );

/* TREE
 *Callback(VoidFuncLongArray)
 *  Type()
 *    PrimitiveType(void)
 *  Arguments()
 *    Argument(L1)
 *      Type()
 *        PrimitiveType(long)
 *        Array()
 */
callback VoidFuncLongArray = void ( long[] L1 );

/* TREE
 *Callback(VoidFuncLongArray5)
 *  Type()
 *    PrimitiveType(void)
 *  Arguments()
 *    Argument(L1)
 *      Type()
 *        PrimitiveType(long)
 *        Array(5)
 */
callback VoidFuncLongArray5 = void ( long[5] L1 );


/* TREE
 *Callback(VoidFuncLongArray54)
 *  Type()
 *    PrimitiveType(void)
 *  Arguments()
 *    Argument(L1)
 *      Type()
 *        PrimitiveType(long)
 *        Array(5)
 *    Argument(L2)
 *      Type()
 *        PrimitiveType(long long)
 *        Array(4)
 */
callback VoidFuncLongArray54 = void ( long[5] L1, long long [4] L2 );


/* TREE
 *Callback(VoidFuncLongIdent)
 *  Type()
 *    PrimitiveType(void)
 *  Arguments()
 *    Argument(L1)
 *      Type()
 *        PrimitiveType(long)
 *        Array(5)
 *    Argument(L2)
 *      Type()
 *        Typeref(VoidFuncLongArray)
 */
callback VoidFuncLongIdent = void ( long[5] L1, VoidFuncLongArray L2 );
