{
  "UnaryOperator": {
    "type": "enum",
    "name": "UnaryOperator",
    "types": [
      "-",
      "+",
      "!",
      "~",
      "typeof",
      "void",
      "delete"
    ]
  },
  "UpdateOperator": {
    "type": "enum",
    "name": "UpdateOperator",
    "types": [
      "++",
      "--"
    ]
  },
  "BinaryOperator": {
    "type": "enum",
    "name": "BinaryOperator",
    "types": [
      "==",
      "!=",
      "===",
      "!==",
      "<",
      "<=",
      ">",
      ">=",
      "<<",
      ">>",
      ">>>",
      "+",
      "-",
      "*",
      "/",
      "%",
      "^",
      "&",
      "in",
      "instanceof",
      "**"
    ]
  },
  "AssignmentOperator": {
    "type": "enum",
    "name": "AssignmentOperator",
    "types": [
      "=",
      "+=",
      "-=",
      "*=",
      "/=",
      "%=",
      "<<=",
      ">>=",
      ">>>=",
      "=",
      "^=",
      "&=",
      "**="
    ]
  },
  "LogicalOperator": {
    "type": "enum",
    "name": "LogicalOperator",
    "types": [
      "&&"
    ]
  },
  "Node": {
    "type": "interface",
    "name": "Node",
    "parents": [],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "SourceLocation": {
    "type": "interface",
    "name": "SourceLocation",
    "parents": [],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "source",
        "types": [
          "string"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "start",
        "types": [
          "Position"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "end",
        "types": [
          "Position"
        ]
      }
    ]
  },
  "Position": {
    "type": "interface",
    "name": "Position",
    "parents": [],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "line",
        "types": [
          "number"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "column",
        "types": [
          "number"
        ]
      }
    ]
  },
  "Program": {
    "type": "interface",
    "name": "Program",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "extensionFrom": "Program",
        "isList": true,
        "isOptional": false,
        "name": "body",
        "types": [
          "Statement",
          "ModuleDeclaration"
        ]
      },
      {
        "extensionFrom": "Program",
        "isList": false,
        "isOptional": false,
        "name": "sourceType",
        "types": [
          "\"script\"",
          "\"module\""
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "Function": {
    "type": "interface",
    "name": "Function",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "id",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": true,
        "isOptional": false,
        "name": "params",
        "types": [
          "Pattern"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "FunctionBody"
        ]
      },
      {
        "extensionFrom": "Function",
        "isList": false,
        "isOptional": false,
        "name": "generator",
        "types": [
          "boolean"
        ]
      },
      {
        "extensionFrom": "Function",
        "isList": false,
        "isOptional": false,
        "name": "async",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "Statement": {
    "type": "interface",
    "name": "Statement",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "Directive": {
    "type": "interface",
    "name": "Directive",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "expression",
        "types": [
          "Literal"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "directive",
        "types": [
          "string"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "SwitchCase": {
    "type": "interface",
    "name": "SwitchCase",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "test",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": true,
        "isOptional": false,
        "name": "consequent",
        "types": [
          "Statement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "CatchClause": {
    "type": "interface",
    "name": "CatchClause",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "param",
        "types": [
          "Pattern"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "BlockStatement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "VariableDeclarator": {
    "type": "interface",
    "name": "VariableDeclarator",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "id",
        "types": [
          "Pattern"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "init",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "Expression": {
    "type": "interface",
    "name": "Expression",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "Property": {
    "type": "interface",
    "name": "Property",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "extensionFrom": "Property",
        "isList": false,
        "isOptional": false,
        "name": "key",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "value",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "kind",
        "types": [
          "\"init\"",
          "\"get\"",
          "\"set\""
        ]
      },
      {
        "extensionFrom": "Property",
        "isList": false,
        "isOptional": false,
        "name": "method",
        "types": [
          "boolean"
        ]
      },
      {
        "extensionFrom": "Property",
        "isList": false,
        "isOptional": false,
        "name": "shorthand",
        "types": [
          "boolean"
        ]
      },
      {
        "extensionFrom": "Property",
        "isList": false,
        "isOptional": false,
        "name": "computed",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "Pattern": {
    "type": "interface",
    "name": "Pattern",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "Super": {
    "type": "interface",
    "name": "Super",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "SpreadElement": {
    "type": "interface",
    "name": "SpreadElement",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "argument",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "TemplateElement": {
    "type": "interface",
    "name": "TemplateElement",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "tail",
        "types": [
          "boolean"
        ]
      },
      {
        "name": "value",
        "isComplex": true,
        "value": [
          {
            "isList": false,
            "isOptional": false,
            "name": "cooked",
            "types": [
              "string"
            ]
          },
          {
            "isList": false,
            "isOptional": false,
            "name": "raw",
            "types": [
              "string"
            ]
          }
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "Class": {
    "type": "interface",
    "name": "Class",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "id",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "superClass",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "ClassBody"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ClassBody": {
    "type": "interface",
    "name": "ClassBody",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": true,
        "isOptional": false,
        "name": "body",
        "types": [
          "MethodDefinition"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "MethodDefinition": {
    "type": "interface",
    "name": "MethodDefinition",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "key",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "value",
        "types": [
          "FunctionExpression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "kind",
        "types": [
          "\"constructor\"",
          "\"method\"",
          "\"get\"",
          "\"set\""
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "computed",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "static",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ModuleDeclaration": {
    "type": "interface",
    "name": "ModuleDeclaration",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ModuleSpecifier": {
    "type": "interface",
    "name": "ModuleSpecifier",
    "parents": [
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "local",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "Identifier": {
    "type": "interface",
    "name": "Identifier",
    "parents": [
      "Expression",
      "Pattern",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "name",
        "types": [
          "string"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "Literal": {
    "type": "interface",
    "name": "Literal",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "value",
        "types": [
          "string",
          "boolean",
          "number",
          "RegExp"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ExpressionStatement": {
    "type": "interface",
    "name": "ExpressionStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "expression",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "BlockStatement": {
    "type": "interface",
    "name": "BlockStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": true,
        "isOptional": false,
        "name": "body",
        "types": [
          "Statement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "EmptyStatement": {
    "type": "interface",
    "name": "EmptyStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "DebuggerStatement": {
    "type": "interface",
    "name": "DebuggerStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "WithStatement": {
    "type": "interface",
    "name": "WithStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "object",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "Statement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ReturnStatement": {
    "type": "interface",
    "name": "ReturnStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "argument",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "LabeledStatement": {
    "type": "interface",
    "name": "LabeledStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "label",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "Statement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "BreakStatement": {
    "type": "interface",
    "name": "BreakStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "label",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ContinueStatement": {
    "type": "interface",
    "name": "ContinueStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "label",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "IfStatement": {
    "type": "interface",
    "name": "IfStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "test",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "consequent",
        "types": [
          "Statement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "alternate",
        "types": [
          "Statement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "SwitchStatement": {
    "type": "interface",
    "name": "SwitchStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "discriminant",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": true,
        "isOptional": false,
        "name": "cases",
        "types": [
          "SwitchCase"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ThrowStatement": {
    "type": "interface",
    "name": "ThrowStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "argument",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "TryStatement": {
    "type": "interface",
    "name": "TryStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "block",
        "types": [
          "BlockStatement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "handler",
        "types": [
          "CatchClause"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "finalizer",
        "types": [
          "BlockStatement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "WhileStatement": {
    "type": "interface",
    "name": "WhileStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "test",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "Statement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "DoWhileStatement": {
    "type": "interface",
    "name": "DoWhileStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "Statement"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "test",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ForStatement": {
    "type": "interface",
    "name": "ForStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "init",
        "types": [
          "VariableDeclaration",
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "test",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "update",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "Statement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ForInStatement": {
    "type": "interface",
    "name": "ForInStatement",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "left",
        "types": [
          "VariableDeclaration",
          "Pattern"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "right",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "Statement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "Declaration": {
    "type": "interface",
    "name": "Declaration",
    "parents": [
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ThisExpression": {
    "type": "interface",
    "name": "ThisExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ArrayExpression": {
    "type": "interface",
    "name": "ArrayExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "extensionFrom": "ArrayExpression",
        "isList": true,
        "isOptional": true,
        "name": "elements",
        "types": [
          "Expression",
          "SpreadElement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ObjectExpression": {
    "type": "interface",
    "name": "ObjectExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "extensionFrom": "ObjectExpression",
        "isList": true,
        "isOptional": false,
        "name": "properties",
        "types": [
          "Property",
          "SpreadElement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "FunctionExpression": {
    "type": "interface",
    "name": "FunctionExpression",
    "parents": [
      "Function",
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "id",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": true,
        "isOptional": false,
        "name": "params",
        "types": [
          "Pattern"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "FunctionBody"
        ]
      },
      {
        "extensionFrom": "Function",
        "isList": false,
        "isOptional": false,
        "name": "generator",
        "types": [
          "boolean"
        ]
      },
      {
        "extensionFrom": "Function",
        "isList": false,
        "isOptional": false,
        "name": "async",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "UnaryExpression": {
    "type": "interface",
    "name": "UnaryExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "operator",
        "types": [
          "UnaryOperator"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "prefix",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "argument",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "UpdateExpression": {
    "type": "interface",
    "name": "UpdateExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "operator",
        "types": [
          "UpdateOperator"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "argument",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "prefix",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "BinaryExpression": {
    "type": "interface",
    "name": "BinaryExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "operator",
        "types": [
          "BinaryOperator"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "left",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "right",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "AssignmentExpression": {
    "type": "interface",
    "name": "AssignmentExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "operator",
        "types": [
          "AssignmentOperator"
        ]
      },
      {
        "extensionFrom": "AssignmentExpression",
        "isList": false,
        "isOptional": false,
        "name": "left",
        "types": [
          "Pattern"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "right",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "LogicalExpression": {
    "type": "interface",
    "name": "LogicalExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "operator",
        "types": [
          "LogicalOperator"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "left",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "right",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "MemberExpression": {
    "type": "interface",
    "name": "MemberExpression",
    "parents": [
      "Expression",
      "Pattern",
      "Node"
    ],
    "properties": [
      {
        "extensionFrom": "MemberExpression",
        "isList": false,
        "isOptional": false,
        "name": "object",
        "types": [
          "Expression",
          "Super"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "property",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "computed",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ConditionalExpression": {
    "type": "interface",
    "name": "ConditionalExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "test",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "alternate",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "consequent",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "CallExpression": {
    "type": "interface",
    "name": "CallExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "extensionFrom": "CallExpression",
        "isList": false,
        "isOptional": false,
        "name": "callee",
        "types": [
          "Expression",
          "Super"
        ]
      },
      {
        "extensionFrom": "CallExpression",
        "isList": true,
        "isOptional": false,
        "name": "arguments",
        "types": [
          "Expression",
          "SpreadElement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "NewExpression": {
    "type": "interface",
    "name": "NewExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "callee",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": true,
        "isOptional": false,
        "name": "arguments",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "SequenceExpression": {
    "type": "interface",
    "name": "SequenceExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": true,
        "isOptional": false,
        "name": "expressions",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ArrowFunctionExpression": {
    "type": "interface",
    "name": "ArrowFunctionExpression",
    "parents": [
      "Function",
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "FunctionBody",
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "expression",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "id",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": true,
        "isOptional": false,
        "name": "params",
        "types": [
          "Pattern"
        ]
      },
      {
        "extensionFrom": "Function",
        "isList": false,
        "isOptional": false,
        "name": "generator",
        "types": [
          "boolean"
        ]
      },
      {
        "extensionFrom": "Function",
        "isList": false,
        "isOptional": false,
        "name": "async",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "YieldExpression": {
    "type": "interface",
    "name": "YieldExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "argument",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "delegate",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "TemplateLiteral": {
    "type": "interface",
    "name": "TemplateLiteral",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": true,
        "isOptional": false,
        "name": "quasis",
        "types": [
          "TemplateElement"
        ]
      },
      {
        "isList": true,
        "isOptional": false,
        "name": "expressions",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "TaggedTemplateExpression": {
    "type": "interface",
    "name": "TaggedTemplateExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "tag",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "quasi",
        "types": [
          "TemplateLiteral"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "AssignmentProperty": {
    "type": "interface",
    "name": "AssignmentProperty",
    "parents": [
      "Property",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "value",
        "types": [
          "Pattern",
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "kind",
        "types": [
          "\"init\"",
          "\"get\"",
          "\"set\""
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "method",
        "types": [
          "false"
        ]
      },
      {
        "extensionFrom": "Property",
        "isList": false,
        "isOptional": false,
        "name": "key",
        "types": [
          "Expression"
        ]
      },
      {
        "extensionFrom": "Property",
        "isList": false,
        "isOptional": false,
        "name": "shorthand",
        "types": [
          "boolean"
        ]
      },
      {
        "extensionFrom": "Property",
        "isList": false,
        "isOptional": false,
        "name": "computed",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ObjectPattern": {
    "type": "interface",
    "name": "ObjectPattern",
    "parents": [
      "Pattern",
      "Node"
    ],
    "properties": [
      {
        "extensionFrom": "ObjectPattern",
        "isList": true,
        "isOptional": false,
        "name": "properties",
        "types": [
          "AssignmentProperty",
          "RestElement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ArrayPattern": {
    "type": "interface",
    "name": "ArrayPattern",
    "parents": [
      "Pattern",
      "Node"
    ],
    "properties": [
      {
        "isList": true,
        "isOptional": true,
        "name": "elements",
        "types": [
          "Pattern"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "RestElement": {
    "type": "interface",
    "name": "RestElement",
    "parents": [
      "Pattern",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "argument",
        "types": [
          "Pattern"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "AssignmentPattern": {
    "type": "interface",
    "name": "AssignmentPattern",
    "parents": [
      "Pattern",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "left",
        "types": [
          "Pattern"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "right",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ClassExpression": {
    "type": "interface",
    "name": "ClassExpression",
    "parents": [
      "Class",
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "id",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "superClass",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "ClassBody"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "MetaProperty": {
    "type": "interface",
    "name": "MetaProperty",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "meta",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "property",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ImportDeclaration": {
    "type": "interface",
    "name": "ImportDeclaration",
    "parents": [
      "ModuleDeclaration",
      "Node"
    ],
    "properties": [
      {
        "isList": true,
        "isOptional": false,
        "name": "specifiers",
        "types": [
          "ImportSpecifier",
          "ImportDefaultSpecifier",
          "ImportNamespaceSpecifier"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "source",
        "types": [
          "Literal"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ImportSpecifier": {
    "type": "interface",
    "name": "ImportSpecifier",
    "parents": [
      "ModuleSpecifier",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "imported",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "local",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ImportDefaultSpecifier": {
    "type": "interface",
    "name": "ImportDefaultSpecifier",
    "parents": [
      "ModuleSpecifier",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "local",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ImportNamespaceSpecifier": {
    "type": "interface",
    "name": "ImportNamespaceSpecifier",
    "parents": [
      "ModuleSpecifier",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "local",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ExportNamedDeclaration": {
    "type": "interface",
    "name": "ExportNamedDeclaration",
    "parents": [
      "ModuleDeclaration",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": true,
        "name": "declaration",
        "types": [
          "Declaration"
        ]
      },
      {
        "isList": true,
        "isOptional": false,
        "name": "specifiers",
        "types": [
          "ExportSpecifier"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "source",
        "types": [
          "Literal"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ExportSpecifier": {
    "type": "interface",
    "name": "ExportSpecifier",
    "parents": [
      "ModuleSpecifier",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "exported",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "local",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ExportDefaultDeclaration": {
    "type": "interface",
    "name": "ExportDefaultDeclaration",
    "parents": [
      "ModuleDeclaration",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "declaration",
        "types": [
          "Declaration",
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ExportAllDeclaration": {
    "type": "interface",
    "name": "ExportAllDeclaration",
    "parents": [
      "ModuleDeclaration",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "source",
        "types": [
          "Literal"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "AwaitExpression": {
    "type": "interface",
    "name": "AwaitExpression",
    "parents": [
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "argument",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "RegExpLiteral": {
    "type": "interface",
    "name": "RegExpLiteral",
    "parents": [
      "Literal",
      "Expression",
      "Node"
    ],
    "properties": [
      {
        "name": "regex",
        "isComplex": true,
        "value": [
          {
            "isList": false,
            "isOptional": false,
            "name": "pattern",
            "types": [
              "string"
            ]
          },
          {
            "isList": false,
            "isOptional": false,
            "name": "flags",
            "types": [
              "string"
            ]
          }
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "value",
        "types": [
          "string",
          "boolean",
          "number",
          "RegExp"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "FunctionBody": {
    "type": "interface",
    "name": "FunctionBody",
    "parents": [
      "BlockStatement",
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": true,
        "isOptional": false,
        "name": "body",
        "types": [
          "Directive",
          "Statement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "FunctionDeclaration": {
    "type": "interface",
    "name": "FunctionDeclaration",
    "parents": [
      "Function",
      "Declaration",
      "Node",
      "Statement"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "id",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": true,
        "isOptional": false,
        "name": "params",
        "types": [
          "Pattern"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "FunctionBody"
        ]
      },
      {
        "extensionFrom": "Function",
        "isList": false,
        "isOptional": false,
        "name": "generator",
        "types": [
          "boolean"
        ]
      },
      {
        "extensionFrom": "Function",
        "isList": false,
        "isOptional": false,
        "name": "async",
        "types": [
          "boolean"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "VariableDeclaration": {
    "type": "interface",
    "name": "VariableDeclaration",
    "parents": [
      "Declaration",
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": true,
        "isOptional": false,
        "name": "declarations",
        "types": [
          "VariableDeclarator"
        ]
      },
      {
        "extensionFrom": "VariableDeclaration",
        "isList": false,
        "isOptional": false,
        "name": "kind",
        "types": [
          "\"var\"",
          "\"let\"",
          "\"const\""
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ForOfStatement": {
    "type": "interface",
    "name": "ForOfStatement",
    "parents": [
      "ForInStatement",
      "Statement",
      "Node"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "left",
        "types": [
          "VariableDeclaration",
          "Pattern"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "right",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "Statement"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  },
  "ClassDeclaration": {
    "type": "interface",
    "name": "ClassDeclaration",
    "parents": [
      "Class",
      "Declaration",
      "Node",
      "Statement"
    ],
    "properties": [
      {
        "isList": false,
        "isOptional": false,
        "name": "id",
        "types": [
          "Identifier"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "superClass",
        "types": [
          "Expression"
        ]
      },
      {
        "isList": false,
        "isOptional": false,
        "name": "body",
        "types": [
          "ClassBody"
        ]
      },
      {
        "isList": false,
        "isOptional": true,
        "name": "loc",
        "types": [
          "SourceLocation"
        ]
      }
    ]
  }
}