exp_generic.pony

use json = "../json"

class val ExpGeneric is NodeData
  """
    An expression with type arguments.
  """

  let lhs: NodeWith[Expression]
  let type_args: NodeWith[TypeArgs]

  new val create(lhs': NodeWith[Expression], type_args': NodeWith[TypeArgs]) =>
    lhs = lhs'
    type_args = type_args'

  fun name(): String => "ExpGeneric"

  fun val clone(updates: ChildUpdateMap): NodeData =>
    ExpGeneric(
      _map_with[Expression](lhs, updates),
      _map_with[TypeArgs](type_args, updates))

  fun add_json_props(node: Node box, props: Array[(String, json.Item)]) =>
    props.push(("lhs", node.child_ref(lhs)))
    props.push(("type_args", node.child_ref(type_args)))

primitive ParseExpGeneric
  fun apply(obj: json.Object val, children: NodeSeq): (ExpGeneric | String) =>
    let lhs =
      match ParseNode._get_child_with[Expression](
        obj,
        children,
        "lhs",
        "ExpGeneric.lhs must be an Expression")
      | let node: NodeWith[Expression] =>
        node
      | let err: String =>
        return err
      else
        return "ExpGeneric.lhs must be an Expression"
      end
    let type_args =
      match ParseNode._get_child_with[TypeArgs](
        obj,
        children,
        "type_args",
        "ExpGeneric.type_args must be a TypeArgs")
      | let node: NodeWith[TypeArgs] =>
        node
      | let err: String =>
        return err
      else
        return "ExpGeneric.type_args must be a TypeArgs"
      end
    ExpGeneric(lhs, type_args)