src/parser/flow_ast.ml (1,635 lines of code) (raw):
(*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
[%%gen
(*
* An Ocaml implementation of the SpiderMonkey Parser API
* https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API
*)
module rec Syntax : sig
type ('M, 'internal) t = {
leading: 'M Comment.t list;
trailing: 'M Comment.t list;
internal: 'internal;
}
[@@deriving show]
end =
Syntax
and Identifier : sig
type ('M, 'T) t = 'T * 'M t'
and 'M t' = {
name: string;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end =
Identifier
and PrivateName : sig
type 'M t = 'M * 'M t'
and 'M t' = {
name: string;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end =
PrivateName
and Literal : sig
module RegExp : sig
type t = {
pattern: string;
flags: string;
}
[@@deriving show]
end
(* Literals also carry along their raw value *)
type 'M t = {
value: value;
raw: string;
comments: ('M, unit) Syntax.t option;
}
and value =
| String of string
| Boolean of bool
| Null
| Number of float
| BigInt of float
| RegExp of RegExp.t
[@@deriving show]
end =
Literal
and StringLiteral : sig
type 'M t = {
value: string;
raw: string;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end =
StringLiteral
and NumberLiteral : sig
type 'M t = {
value: float;
raw: string;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end =
NumberLiteral
and BigIntLiteral : sig
type 'M t = {
approx_value: float;
(* Warning! Might lose precision! *)
bigint: string;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end =
BigIntLiteral
and BooleanLiteral : sig
type 'M t = {
value: bool;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end =
BooleanLiteral
and Variance : sig
type 'M t = 'M * 'M t'
and kind =
| Plus
| Minus
and 'M t' = {
kind: kind;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end =
Variance
and ComputedKey : sig
type ('M, 'T) t = 'M * ('M, 'T) ComputedKey.t'
and ('M, 'T) t' = {
expression: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end =
ComputedKey
and Type : sig
module Function : sig
module Param : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
name: ('M, 'T) Identifier.t option;
annot: ('M, 'T) Type.t;
optional: bool;
}
[@@deriving show]
end
module RestParam : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
argument: ('M, 'T) Param.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module ThisParam : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
annot: ('M, 'T) Type.annotation;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Params : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
this_: ('M, 'T) ThisParam.t option;
params: ('M, 'T) Param.t list;
rest: ('M, 'T) RestParam.t option;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) t = {
tparams: ('M, 'T) Type.TypeParams.t option;
params: ('M, 'T) Params.t;
return: ('M, 'T) Type.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Generic : sig
module Identifier : sig
type ('M, 'T) t =
| Unqualified of ('M, 'T) Identifier.t
| Qualified of ('M, 'T) qualified
and ('M, 'T) qualified = 'M * ('M, 'T) qualified'
and ('M, 'T) qualified' = {
qualification: ('M, 'T) t;
id: ('M, 'T) Identifier.t;
}
[@@deriving show]
end
type ('M, 'T) t = {
id: ('M, 'T) Identifier.t;
targs: ('M, 'T) Type.TypeArgs.t option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module IndexedAccess : sig
type ('M, 'T) t = {
_object: ('M, 'T) Type.t;
index: ('M, 'T) Type.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module OptionalIndexedAccess : sig
type ('M, 'T) t = {
indexed_access: ('M, 'T) IndexedAccess.t;
optional: bool;
}
[@@deriving show]
end
module Object : sig
module Property : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
key: ('M, 'T) Expression.Object.Property.key;
value: ('M, 'T) value;
optional: bool;
static: bool;
proto: bool;
_method: bool;
variance: 'M Variance.t option;
comments: ('M, unit) Syntax.t option;
}
and ('M, 'T) value =
| Init of ('M, 'T) Type.t
| Get of ('M * ('M, 'T) Function.t)
| Set of ('M * ('M, 'T) Function.t)
[@@deriving show]
end
module SpreadProperty : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
argument: ('M, 'T) Type.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Indexer : sig
type ('M, 'T) t' = {
id: ('M, 'M) Identifier.t option;
key: ('M, 'T) Type.t;
value: ('M, 'T) Type.t;
static: bool;
variance: 'M Variance.t option;
comments: ('M, unit) Syntax.t option;
}
and ('M, 'T) t = 'M * ('M, 'T) t' [@@deriving show]
end
module CallProperty : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
value: 'M * ('M, 'T) Function.t;
static: bool;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module InternalSlot : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
id: ('M, 'M) Identifier.t;
value: ('M, 'T) Type.t;
optional: bool;
static: bool;
_method: bool;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) t = {
exact: bool;
(* Inexact indicates the presence of ... in the object. It is more
* easily understood if exact is read as "explicitly exact" and "inexact"
* is read as "explicitly inexact".
*
* This confusion will go away when we get rid of the exact flag in favor
* of inexact as part of the work to make object types exact by default.
* *)
inexact: bool;
properties: ('M, 'T) property list;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
and ('M, 'T) property =
| Property of ('M, 'T) Property.t
| SpreadProperty of ('M, 'T) SpreadProperty.t
| Indexer of ('M, 'T) Indexer.t
| CallProperty of ('M, 'T) CallProperty.t
| InternalSlot of ('M, 'T) InternalSlot.t
[@@deriving show]
end
module Interface : sig
type ('M, 'T) t = {
body: 'M * ('M, 'T) Object.t;
extends: ('M * ('M, 'T) Generic.t) list;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Nullable : sig
type ('M, 'T) t = {
argument: ('M, 'T) Type.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Typeof : sig
module Target : sig
type ('M, 'T) t =
| Unqualified of ('M, 'T) Identifier.t
| Qualified of ('M, 'T) qualified
and ('M, 'T) qualified' = {
qualification: ('M, 'T) t;
id: ('M, 'T) Identifier.t;
}
and ('M, 'T) qualified = 'T * ('M, 'T) qualified' [@@deriving show]
end
type ('M, 'T) t = {
argument: ('M, 'T) Target.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Tuple : sig
type ('M, 'T) t = {
types: ('M, 'T) Type.t list;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Array : sig
type ('M, 'T) t = {
argument: ('M, 'T) Type.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Union : sig
type ('M, 'T) t = {
types: ('M, 'T) Type.t * ('M, 'T) Type.t * ('M, 'T) Type.t list;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Intersection : sig
type ('M, 'T) t = {
types: ('M, 'T) Type.t * ('M, 'T) Type.t * ('M, 'T) Type.t list;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) t = 'T * ('M, 'T) t'
(* Yes, we could add a little complexity here to show that Any and Void
* should never be declared nullable, but that check can happen later *)
and ('M, 'T) t' =
| Any of ('M, unit) Syntax.t option
| Mixed of ('M, unit) Syntax.t option
| Empty of ('M, unit) Syntax.t option
| Void of ('M, unit) Syntax.t option
| Null of ('M, unit) Syntax.t option
| Number of ('M, unit) Syntax.t option
| BigInt of ('M, unit) Syntax.t option
| String of ('M, unit) Syntax.t option
| Boolean of ('M, unit) Syntax.t option
| Symbol of ('M, unit) Syntax.t option
| Exists of ('M, unit) Syntax.t option
| Nullable of ('M, 'T) Nullable.t
| Function of ('M, 'T) Function.t
| Object of ('M, 'T) Object.t
| Interface of ('M, 'T) Interface.t
| Array of ('M, 'T) Array.t
| Generic of ('M, 'T) Generic.t
| IndexedAccess of ('M, 'T) IndexedAccess.t
| OptionalIndexedAccess of ('M, 'T) OptionalIndexedAccess.t
| Union of ('M, 'T) Union.t
| Intersection of ('M, 'T) Intersection.t
| Typeof of ('M, 'T) Typeof.t
| Tuple of ('M, 'T) Tuple.t
| StringLiteral of 'M StringLiteral.t
| NumberLiteral of 'M NumberLiteral.t
| BigIntLiteral of 'M BigIntLiteral.t
| BooleanLiteral of 'M BooleanLiteral.t
(* Type.annotation is a concrete syntax node with a location that starts at
* the colon and ends after the type. For example, "var a: number", the
* identifier a would have a property annot which contains a
* Type.annotation with a location from column 6-14 *)
and ('M, 'T) annotation = 'M * ('M, 'T) t
and ('M, 'T) annotation_or_hint =
| Missing of 'T
| Available of ('M, 'T) Type.annotation
[@@deriving show]
module TypeParam : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
name: ('M, 'M) Identifier.t;
bound: ('M, 'T) Type.annotation_or_hint;
variance: 'M Variance.t option;
default: ('M, 'T) Type.t option;
}
[@@deriving show]
end
module TypeParams : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
params: ('M, 'T) TypeParam.t list;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
module TypeArgs : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
arguments: ('M, 'T) Type.t list;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
module Predicate : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
kind: ('M, 'T) kind;
comments: ('M, unit) Syntax.t option;
}
and ('M, 'T) kind =
| Declared of ('M, 'T) Expression.t
| Inferred
[@@deriving show]
end
end =
Type
and Statement : sig
module Block : sig
type ('M, 'T) t = {
body: ('M, 'T) Statement.t list;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
module If : sig
module Alternate : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
body: ('M, 'T) Statement.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) t = {
test: ('M, 'T) Expression.t;
consequent: ('M, 'T) Statement.t;
alternate: ('M, 'T) Alternate.t option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Labeled : sig
type ('M, 'T) t = {
label: ('M, 'M) Identifier.t;
body: ('M, 'T) Statement.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Break : sig
type 'M t = {
label: ('M, 'M) Identifier.t option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Continue : sig
type 'M t = {
label: ('M, 'M) Identifier.t option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Debugger : sig
type 'M t = { comments: ('M, unit) Syntax.t option } [@@deriving show]
end
module With : sig
type ('M, 'T) t = {
_object: ('M, 'T) Expression.t;
body: ('M, 'T) Statement.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module TypeAlias : sig
type ('M, 'T) t = {
id: ('M, 'T) Identifier.t;
tparams: ('M, 'T) Type.TypeParams.t option;
right: ('M, 'T) Type.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module OpaqueType : sig
type ('M, 'T) t = {
id: ('M, 'T) Identifier.t;
tparams: ('M, 'T) Type.TypeParams.t option;
impltype: ('M, 'T) Type.t option;
supertype: ('M, 'T) Type.t option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Switch : sig
module Case : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
test: ('M, 'T) Expression.t option;
consequent: ('M, 'T) Statement.t list;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) t = {
discriminant: ('M, 'T) Expression.t;
cases: ('M, 'T) Case.t list;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Return : sig
type ('M, 'T) t = {
argument: ('M, 'T) Expression.t option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Throw : sig
type ('M, 'T) t = {
argument: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Try : sig
module CatchClause : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
param: ('M, 'T) Pattern.t option;
body: 'M * ('M, 'T) Block.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) t = {
block: 'M * ('M, 'T) Block.t;
handler: ('M, 'T) CatchClause.t option;
finalizer: ('M * ('M, 'T) Block.t) option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module VariableDeclaration : sig
module Declarator : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
id: ('M, 'T) Pattern.t;
init: ('M, 'T) Expression.t option;
}
[@@deriving show]
end
type ('M, 'T) t = {
declarations: ('M, 'T) Declarator.t list;
kind: kind;
comments: ('M, unit) Syntax.t option;
}
and kind =
| Var
| Let
| Const
[@@deriving show]
end
module While : sig
type ('M, 'T) t = {
test: ('M, 'T) Expression.t;
body: ('M, 'T) Statement.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module DoWhile : sig
type ('M, 'T) t = {
body: ('M, 'T) Statement.t;
test: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module For : sig
type ('M, 'T) t = {
init: ('M, 'T) init option;
test: ('M, 'T) Expression.t option;
update: ('M, 'T) Expression.t option;
body: ('M, 'T) Statement.t;
comments: ('M, unit) Syntax.t option;
}
and ('M, 'T) init =
| InitDeclaration of ('M * ('M, 'T) VariableDeclaration.t)
| InitExpression of ('M, 'T) Expression.t
[@@deriving show]
end
module ForIn : sig
type ('M, 'T) t = {
left: ('M, 'T) left;
right: ('M, 'T) Expression.t;
body: ('M, 'T) Statement.t;
each: bool;
comments: ('M, unit) Syntax.t option;
}
and ('M, 'T) left =
| LeftDeclaration of ('M * ('M, 'T) VariableDeclaration.t)
| LeftPattern of ('M, 'T) Pattern.t
[@@deriving show]
end
module ForOf : sig
type ('M, 'T) t = {
left: ('M, 'T) left;
right: ('M, 'T) Expression.t;
body: ('M, 'T) Statement.t;
await: bool;
comments: ('M, unit) Syntax.t option;
}
and ('M, 'T) left =
| LeftDeclaration of ('M * ('M, 'T) VariableDeclaration.t)
| LeftPattern of ('M, 'T) Pattern.t
[@@deriving show]
end
module EnumDeclaration : sig
module DefaultedMember : sig
type 'M t = 'M * 'M t'
and 'M t' = { id: ('M, 'M) Identifier.t } [@@deriving show]
end
module InitializedMember : sig
type ('I, 'M) t = 'M * ('I, 'M) t'
and ('I, 'M) t' = {
id: ('M, 'M) Identifier.t;
init: 'M * 'I;
}
[@@deriving show]
end
module BooleanBody : sig
type 'M t = {
members: ('M BooleanLiteral.t, 'M) InitializedMember.t list;
explicit_type: bool;
has_unknown_members: bool;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
module NumberBody : sig
type 'M t = {
members: ('M NumberLiteral.t, 'M) InitializedMember.t list;
explicit_type: bool;
has_unknown_members: bool;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
module StringBody : sig
type 'M t = {
members: ('M StringLiteral.t, 'M) members;
explicit_type: bool;
has_unknown_members: bool;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
and ('I, 'M) members =
| Defaulted of 'M DefaultedMember.t list
| Initialized of ('I, 'M) InitializedMember.t list
[@@deriving show]
end
module SymbolBody : sig
type 'M t = {
members: 'M DefaultedMember.t list;
has_unknown_members: bool;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) t = {
id: ('M, 'T) Identifier.t;
body: 'M body;
comments: ('M, unit) Syntax.t option;
}
and 'M body = 'M * 'M body'
and 'M body' =
| BooleanBody of 'M BooleanBody.t
| NumberBody of 'M NumberBody.t
| StringBody of 'M StringBody.t
| SymbolBody of 'M SymbolBody.t
[@@deriving show]
end
module Interface : sig
type ('M, 'T) t = {
id: ('M, 'T) Identifier.t;
tparams: ('M, 'T) Type.TypeParams.t option;
extends: ('M * ('M, 'T) Type.Generic.t) list;
body: 'M * ('M, 'T) Type.Object.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module DeclareClass : sig
type ('M, 'T) t = {
id: ('M, 'T) Identifier.t;
tparams: ('M, 'T) Type.TypeParams.t option;
body: 'M * ('M, 'T) Type.Object.t;
extends: ('M * ('M, 'T) Type.Generic.t) option;
mixins: ('M * ('M, 'T) Type.Generic.t) list;
implements: ('M, 'T) Class.Implements.t option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module DeclareVariable : sig
type ('M, 'T) t = {
id: ('M, 'T) Identifier.t;
annot: ('M, 'T) Type.annotation;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module DeclareFunction : sig
type ('M, 'T) t = {
id: ('M, 'T) Identifier.t;
annot: ('M, 'T) Type.annotation;
predicate: ('M, 'T) Type.Predicate.t option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module DeclareModule : sig
type ('M, 'T) id =
| Identifier of ('M, 'T) Identifier.t
| Literal of ('T * 'M StringLiteral.t)
and 'M module_kind =
| CommonJS of 'M
| ES of 'M
and ('M, 'T) t = {
id: ('M, 'T) id;
body: 'M * ('M, 'T) Block.t;
kind: 'M module_kind;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module DeclareModuleExports : sig
type ('M, 'T) t = {
annot: ('M, 'T) Type.annotation;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module ExportNamedDeclaration : sig
module ExportSpecifier : sig
type 'M t = 'M * 'M t'
and 'M t' = {
local: ('M, 'M) Identifier.t;
exported: ('M, 'M) Identifier.t option;
}
[@@deriving show]
end
module ExportBatchSpecifier : sig
type 'M t = 'M * ('M, 'M) Identifier.t option [@@deriving show]
end
type ('M, 'T) t = {
declaration: ('M, 'T) Statement.t option;
specifiers: 'M specifier option;
source: ('M * 'M StringLiteral.t) option;
export_kind: Statement.export_kind;
comments: ('M, unit) Syntax.t option;
}
and 'M specifier =
| ExportSpecifiers of 'M ExportSpecifier.t list
| ExportBatchSpecifier of 'M ExportBatchSpecifier.t
[@@deriving show]
end
module ExportDefaultDeclaration : sig
type ('M, 'T) t = {
default: 'M;
declaration: ('M, 'T) declaration;
comments: ('M, unit) Syntax.t option;
}
and ('M, 'T) declaration =
| Declaration of ('M, 'T) Statement.t
| Expression of ('M, 'T) Expression.t
[@@deriving show]
end
module DeclareExportDeclaration : sig
type ('M, 'T) declaration =
(* declare export var *)
| Variable of ('M * ('M, 'T) DeclareVariable.t)
(* declare export function *)
| Function of ('M * ('M, 'T) DeclareFunction.t)
(* declare export class *)
| Class of ('M * ('M, 'T) DeclareClass.t)
(* declare export default [type]
* this corresponds to things like
* export default 1+1; *)
| DefaultType of ('M, 'T) Type.t
(* declare export type *)
| NamedType of ('M * ('M, 'T) TypeAlias.t)
(* declare export opaque type *)
| NamedOpaqueType of ('M * ('M, 'T) OpaqueType.t)
(* declare export interface *)
| Interface of ('M * ('M, 'T) Interface.t)
and ('M, 'T) t = {
default: 'M option;
declaration: ('M, 'T) declaration option;
specifiers: 'M ExportNamedDeclaration.specifier option;
source: ('M * 'M StringLiteral.t) option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module ImportDeclaration : sig
type import_kind =
| ImportType
| ImportTypeof
| ImportValue
and ('M, 'T) specifier =
| ImportNamedSpecifiers of ('M, 'T) named_specifier list
| ImportNamespaceSpecifier of ('M * ('M, 'T) Identifier.t)
and ('M, 'T) named_specifier = {
kind: import_kind option;
local: ('M, 'T) Identifier.t option;
remote: ('M, 'T) Identifier.t;
}
and ('M, 'T) t = {
import_kind: import_kind;
source: 'M * 'M StringLiteral.t;
default: ('M, 'T) Identifier.t option;
specifiers: ('M, 'T) specifier option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Expression : sig
type ('M, 'T) t = {
expression: ('M, 'T) Expression.t;
directive: string option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Empty : sig
type 'M t = { comments: ('M, unit) Syntax.t option } [@@deriving show]
end
type export_kind =
| ExportType
| ExportValue
and ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' =
| Block of ('M, 'T) Block.t
| Break of 'M Break.t
| ClassDeclaration of ('M, 'T) Class.t
| Continue of 'M Continue.t
| Debugger of 'M Debugger.t
| DeclareClass of ('M, 'T) DeclareClass.t
| DeclareExportDeclaration of ('M, 'T) DeclareExportDeclaration.t
| DeclareFunction of ('M, 'T) DeclareFunction.t
| DeclareInterface of ('M, 'T) Interface.t
| DeclareModule of ('M, 'T) DeclareModule.t
| DeclareModuleExports of ('M, 'T) DeclareModuleExports.t
| DeclareTypeAlias of ('M, 'T) TypeAlias.t
| DeclareOpaqueType of ('M, 'T) OpaqueType.t
| DeclareVariable of ('M, 'T) DeclareVariable.t
| DoWhile of ('M, 'T) DoWhile.t
| Empty of 'M Empty.t
| EnumDeclaration of ('M, 'T) EnumDeclaration.t
| ExportDefaultDeclaration of ('M, 'T) ExportDefaultDeclaration.t
| ExportNamedDeclaration of ('M, 'T) ExportNamedDeclaration.t
| Expression of ('M, 'T) Expression.t
| For of ('M, 'T) For.t
| ForIn of ('M, 'T) ForIn.t
| ForOf of ('M, 'T) ForOf.t
| FunctionDeclaration of ('M, 'T) Function.t
| If of ('M, 'T) If.t
| ImportDeclaration of ('M, 'T) ImportDeclaration.t
| InterfaceDeclaration of ('M, 'T) Interface.t
| Labeled of ('M, 'T) Labeled.t
| Return of ('M, 'T) Return.t
| Switch of ('M, 'T) Switch.t
| Throw of ('M, 'T) Throw.t
| Try of ('M, 'T) Try.t
| TypeAlias of ('M, 'T) TypeAlias.t
| OpaqueType of ('M, 'T) OpaqueType.t
| VariableDeclaration of ('M, 'T) VariableDeclaration.t
| While of ('M, 'T) While.t
| With of ('M, 'T) With.t
[@@deriving show]
end =
Statement
and Expression : sig
module CallTypeArg : sig
module Implicit : sig
type ('M, 'T) t = 'T * 'M t'
and 'M t' = { comments: ('M, unit) Syntax.t option } [@@deriving show]
end
type ('M, 'T) t =
| Explicit of ('M, 'T) Type.t
| Implicit of ('M, 'T) Implicit.t
[@@deriving show]
end
module CallTypeArgs : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
arguments: ('M, 'T) CallTypeArg.t list;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
module SpreadElement : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
argument: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Array : sig
type ('M, 'T) element =
| Expression of ('M, 'T) Expression.t
| Spread of ('M, 'T) SpreadElement.t
| Hole of 'M
[@@deriving show]
type ('M, 'T) t = {
elements: ('M, 'T) element list;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
module TemplateLiteral : sig
module Element : sig
type value = {
raw: string;
cooked: string;
}
and 'M t = 'M * t'
and t' = {
value: value;
tail: bool;
}
[@@deriving show]
end
type ('M, 'T) t = {
quasis: 'M Element.t list;
expressions: ('M, 'T) Expression.t list;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module TaggedTemplate : sig
type ('M, 'T) t = {
tag: ('M, 'T) Expression.t;
quasi: 'M * ('M, 'T) TemplateLiteral.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Object : sig
module Property : sig
type ('M, 'T) key =
| Literal of ('T * 'M Literal.t)
| Identifier of ('M, 'T) Identifier.t
| PrivateName of 'M PrivateName.t
| Computed of ('M, 'T) ComputedKey.t
and ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' =
| Init of {
key: ('M, 'T) key;
value: ('M, 'T) Expression.t;
shorthand: bool;
}
| Method of {
key: ('M, 'T) key;
value: 'M * ('M, 'T) Function.t;
}
| Get of {
key: ('M, 'T) key;
value: 'M * ('M, 'T) Function.t;
comments: ('M, unit) Syntax.t option;
}
| Set of {
key: ('M, 'T) key;
value: 'M * ('M, 'T) Function.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module SpreadProperty : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
argument: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) property =
| Property of ('M, 'T) Property.t
| SpreadProperty of ('M, 'T) SpreadProperty.t
and ('M, 'T) t = {
properties: ('M, 'T) property list;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
module Sequence : sig
type ('M, 'T) t = {
expressions: ('M, 'T) Expression.t list;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Unary : sig
type operator =
| Minus
| Plus
| Not
| BitNot
| Typeof
| Void
| Delete
| Await
and ('M, 'T) t = {
operator: operator;
argument: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Binary : sig
type operator =
| Equal
| NotEqual
| StrictEqual
| StrictNotEqual
| LessThan
| LessThanEqual
| GreaterThan
| GreaterThanEqual
| LShift
| RShift
| RShift3
| Plus
| Minus
| Mult
| Exp
| Div
| Mod
| BitOr
| Xor
| BitAnd
| In
| Instanceof
and ('M, 'T) t = {
operator: operator;
left: ('M, 'T) Expression.t;
right: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Assignment : sig
type operator =
| PlusAssign
| MinusAssign
| MultAssign
| ExpAssign
| DivAssign
| ModAssign
| LShiftAssign
| RShiftAssign
| RShift3Assign
| BitOrAssign
| BitXorAssign
| BitAndAssign
| NullishAssign
| AndAssign
| OrAssign
and ('M, 'T) t = {
operator: operator option;
left: ('M, 'T) Pattern.t;
right: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Update : sig
type operator =
| Increment
| Decrement
and ('M, 'T) t = {
operator: operator;
argument: ('M, 'T) Expression.t;
prefix: bool;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Logical : sig
type operator =
| Or
| And
| NullishCoalesce
and ('M, 'T) t = {
operator: operator;
left: ('M, 'T) Expression.t;
right: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Conditional : sig
type ('M, 'T) t = {
test: ('M, 'T) Expression.t;
consequent: ('M, 'T) Expression.t;
alternate: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) expression_or_spread =
| Expression of ('M, 'T) Expression.t
| Spread of ('M, 'T) SpreadElement.t
[@@deriving show]
module ArgList : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
arguments: ('M, 'T) expression_or_spread list;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
module New : sig
type ('M, 'T) t = {
callee: ('M, 'T) Expression.t;
targs: ('M, 'T) Expression.CallTypeArgs.t option;
arguments: ('M, 'T) ArgList.t option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Call : sig
type ('M, 'T) t = {
callee: ('M, 'T) Expression.t;
targs: ('M, 'T) Expression.CallTypeArgs.t option;
arguments: ('M, 'T) ArgList.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module OptionalCall : sig
type ('M, 'T) t = {
call: ('M, 'T) Call.t;
optional: bool;
}
[@@deriving show]
end
module Member : sig
type ('M, 'T) property =
| PropertyIdentifier of ('M, 'T) Identifier.t
| PropertyPrivateName of 'M PrivateName.t
| PropertyExpression of ('M, 'T) Expression.t
and ('M, 'T) t = {
_object: ('M, 'T) Expression.t;
property: ('M, 'T) property;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module OptionalMember : sig
type ('M, 'T) t = {
member: ('M, 'T) Member.t;
optional: bool;
}
[@@deriving show]
end
module Yield : sig
type ('M, 'T) t = {
argument: ('M, 'T) Expression.t option;
comments: ('M, unit) Syntax.t option;
delegate: bool;
}
[@@deriving show]
end
module Comprehension : sig
module Block : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
left: ('M, 'T) Pattern.t;
right: ('M, 'T) Expression.t;
each: bool;
}
[@@deriving show]
end
type ('M, 'T) t = {
blocks: ('M, 'T) Block.t list;
filter: ('M, 'T) Expression.t option;
}
[@@deriving show]
end
module Generator : sig
type ('M, 'T) t = {
blocks: ('M, 'T) Comprehension.Block.t list;
filter: ('M, 'T) Expression.t option;
}
[@@deriving show]
end
module TypeCast : sig
type ('M, 'T) t = {
expression: ('M, 'T) Expression.t;
annot: ('M, 'T) Type.annotation;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module MetaProperty : sig
type 'M t = {
meta: ('M, 'M) Identifier.t;
property: ('M, 'M) Identifier.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module This : sig
type 'M t = { comments: ('M, unit) Syntax.t option } [@@deriving show]
end
module Super : sig
type 'M t = { comments: ('M, unit) Syntax.t option } [@@deriving show]
end
module Import : sig
type ('M, 'T) t = {
argument: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) t = 'T * ('M, 'T) t'
and ('M, 'T) t' =
| Array of ('M, 'T) Array.t
| ArrowFunction of ('M, 'T) Function.t
| Assignment of ('M, 'T) Assignment.t
| Binary of ('M, 'T) Binary.t
| Call of ('M, 'T) Call.t
| Class of ('M, 'T) Class.t
| Comprehension of ('M, 'T) Comprehension.t
| Conditional of ('M, 'T) Conditional.t
| Function of ('M, 'T) Function.t
| Generator of ('M, 'T) Generator.t
| Identifier of ('M, 'T) Identifier.t
| Import of ('M, 'T) Import.t
| JSXElement of ('M, 'T) JSX.element
| JSXFragment of ('M, 'T) JSX.fragment
| Literal of 'M Literal.t
| Logical of ('M, 'T) Logical.t
| Member of ('M, 'T) Member.t
| MetaProperty of 'M MetaProperty.t
| New of ('M, 'T) New.t
| Object of ('M, 'T) Object.t
| OptionalCall of ('M, 'T) OptionalCall.t
| OptionalMember of ('M, 'T) OptionalMember.t
| Sequence of ('M, 'T) Sequence.t
| Super of 'M Super.t
| TaggedTemplate of ('M, 'T) TaggedTemplate.t
| TemplateLiteral of ('M, 'T) TemplateLiteral.t
| This of 'M This.t
| TypeCast of ('M, 'T) TypeCast.t
| Unary of ('M, 'T) Unary.t
| Update of ('M, 'T) Update.t
| Yield of ('M, 'T) Yield.t
[@@deriving show]
end =
Expression
and JSX : sig
module Identifier : sig
type ('M, 'T) t = 'T * 'M t'
and 'M t' = {
name: string;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module NamespacedName : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
namespace: ('M, 'T) Identifier.t;
name: ('M, 'T) Identifier.t;
}
[@@deriving show]
end
module ExpressionContainer : sig
type ('M, 'T) t = {
expression: ('M, 'T) expression;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
and ('M, 'T) expression =
| Expression of ('M, 'T) Expression.t
| EmptyExpression
[@@deriving show]
end
module Text : sig
type t = {
value: string;
raw: string;
}
[@@deriving show]
end
module Attribute : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) name =
| Identifier of ('M, 'T) Identifier.t
| NamespacedName of ('M, 'T) NamespacedName.t
and ('M, 'T) value =
| Literal of 'T * 'M Literal.t
| ExpressionContainer of 'T * ('M, 'T) ExpressionContainer.t
and ('M, 'T) t' = {
name: ('M, 'T) name;
value: ('M, 'T) value option;
}
[@@deriving show]
end
module SpreadAttribute : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
argument: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module MemberExpression : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) _object =
| Identifier of ('M, 'T) Identifier.t
| MemberExpression of ('M, 'T) t
and ('M, 'T) t' = {
_object: ('M, 'T) _object;
property: ('M, 'T) Identifier.t;
}
[@@deriving show]
end
type ('M, 'T) name =
| Identifier of ('M, 'T) Identifier.t
| NamespacedName of ('M, 'T) NamespacedName.t
| MemberExpression of ('M, 'T) MemberExpression.t
[@@deriving show]
module Opening : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) attribute =
| Attribute of ('M, 'T) Attribute.t
| SpreadAttribute of ('M, 'T) SpreadAttribute.t
and ('M, 'T) t' = {
name: ('M, 'T) name;
self_closing: bool;
attributes: ('M, 'T) attribute list;
}
[@@deriving show]
end
module Closing : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = { name: ('M, 'T) name } [@@deriving show]
end
module SpreadChild : sig
type ('M, 'T) t = {
expression: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) child = 'M * ('M, 'T) child'
and ('M, 'T) child' =
| Element of ('M, 'T) element
| Fragment of ('M, 'T) fragment
| ExpressionContainer of ('M, 'T) ExpressionContainer.t
| SpreadChild of ('M, 'T) SpreadChild.t
| Text of Text.t
and ('M, 'T) element = {
opening_element: ('M, 'T) Opening.t;
closing_element: ('M, 'T) Closing.t option;
children: 'M * ('M, 'T) child list;
comments: ('M, unit) Syntax.t option;
}
and ('M, 'T) fragment = {
frag_opening_element: 'M;
frag_closing_element: 'M;
frag_children: 'M * ('M, 'T) child list;
frag_comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end =
JSX
and Pattern : sig
module RestElement : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
argument: ('M, 'T) Pattern.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Object : sig
module Property : sig
type ('M, 'T) key =
| Literal of ('M * 'M Literal.t)
| Identifier of ('M, 'T) Identifier.t
| Computed of ('M, 'T) ComputedKey.t
and ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
key: ('M, 'T) key;
pattern: ('M, 'T) Pattern.t;
default: ('M, 'T) Expression.t option;
shorthand: bool;
}
[@@deriving show]
end
type ('M, 'T) property =
| Property of ('M, 'T) Property.t
| RestElement of ('M, 'T) RestElement.t
and ('M, 'T) t = {
properties: ('M, 'T) property list;
annot: ('M, 'T) Type.annotation_or_hint;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
module Array : sig
module Element : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
argument: ('M, 'T) Pattern.t;
default: ('M, 'T) Expression.t option;
}
[@@deriving show]
end
type ('M, 'T) element =
| Element of ('M, 'T) Element.t
| RestElement of ('M, 'T) RestElement.t
| Hole of 'M
and ('M, 'T) t = {
elements: ('M, 'T) element list;
annot: ('M, 'T) Type.annotation_or_hint;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
module Identifier : sig
type ('M, 'T) t = {
name: ('M, 'T) Identifier.t;
annot: ('M, 'T) Type.annotation_or_hint;
optional: bool;
}
[@@deriving show]
end
type ('M, 'T) t = 'T * ('M, 'T) t'
and ('M, 'T) t' =
| Object of ('M, 'T) Object.t
| Array of ('M, 'T) Array.t
| Identifier of ('M, 'T) Identifier.t
| Expression of ('M, 'T) Expression.t
[@@deriving show]
end =
Pattern
and Comment : sig
type 'M t = 'M * t'
and kind =
| Block
| Line
and t' = {
kind: kind;
text: string;
on_newline: bool;
}
[@@deriving show]
end =
Comment
and Class : sig
module Method : sig
type ('M, 'T) t = 'T * ('M, 'T) t'
and kind =
| Constructor
| Method
| Get
| Set
and ('M, 'T) t' = {
kind: kind;
key: ('M, 'T) Expression.Object.Property.key;
value: 'M * ('M, 'T) Function.t;
static: bool;
decorators: ('M, 'T) Class.Decorator.t list;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Property : sig
type ('M, 'T) t = 'T * ('M, 'T) t'
and ('M, 'T) t' = {
key: ('M, 'T) Expression.Object.Property.key;
value: ('M, 'T) value;
annot: ('M, 'T) Type.annotation_or_hint;
static: bool;
variance: 'M Variance.t option;
comments: ('M, unit) Syntax.t option;
}
and ('M, 'T) value =
| Declared
| Uninitialized
| Initialized of ('M, 'T) Expression.t
[@@deriving show]
end
module PrivateField : sig
type ('M, 'T) t = 'T * ('M, 'T) t'
and ('M, 'T) t' = {
key: 'M PrivateName.t;
value: ('M, 'T) Class.Property.value;
annot: ('M, 'T) Type.annotation_or_hint;
static: bool;
variance: 'M Variance.t option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Extends : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
expr: ('M, 'T) Expression.t;
targs: ('M, 'T) Type.TypeArgs.t option;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Implements : sig
module Interface : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
id: ('M, 'T) Identifier.t;
targs: ('M, 'T) Type.TypeArgs.t option;
}
[@@deriving show]
end
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
interfaces: ('M, 'T) Interface.t list;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Body : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
body: ('M, 'T) element list;
comments: ('M, unit) Syntax.t option;
}
and ('M, 'T) element =
| Method of ('M, 'T) Method.t
| Property of ('M, 'T) Property.t
| PrivateField of ('M, 'T) PrivateField.t
[@@deriving show]
end
module Decorator : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
expression: ('M, 'T) Expression.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) t = {
id: ('M, 'T) Identifier.t option;
body: ('M, 'T) Class.Body.t;
tparams: ('M, 'T) Type.TypeParams.t option;
extends: ('M, 'T) Extends.t option;
implements: ('M, 'T) Implements.t option;
class_decorators: ('M, 'T) Decorator.t list;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end =
Class
and Function : sig
module RestParam : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
argument: ('M, 'T) Pattern.t;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Param : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
argument: ('M, 'T) Pattern.t;
default: ('M, 'T) Expression.t option;
}
[@@deriving show]
end
module ThisParam : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
annot: ('M, 'T) Type.annotation;
comments: ('M, unit) Syntax.t option;
}
[@@deriving show]
end
module Params : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
this_: ('M, 'T) ThisParam.t option;
params: ('M, 'T) Param.t list;
rest: ('M, 'T) RestParam.t option;
comments: ('M, 'M Comment.t list) Syntax.t option;
}
[@@deriving show]
end
type ('M, 'T) t = {
id: ('M, 'T) Identifier.t option;
params: ('M, 'T) Params.t;
body: ('M, 'T) body;
async: bool;
generator: bool;
predicate: ('M, 'T) Type.Predicate.t option;
return: ('M, 'T) Type.annotation_or_hint;
tparams: ('M, 'T) Type.TypeParams.t option;
comments: ('M, unit) Syntax.t option;
(* Location of the signature portion of a function, e.g.
* function foo(): void {}
* ^^^^^^^^^^^^^^^^^^^^
*)
sig_loc: 'M;
}
and ('M, 'T) body =
| BodyBlock of ('M * ('M, 'T) Statement.Block.t)
| BodyExpression of ('M, 'T) Expression.t
[@@deriving show]
end =
Function
and Program : sig
type ('M, 'T) t = 'M * ('M, 'T) t'
and ('M, 'T) t' = {
statements: ('M, 'T) Statement.t list;
comments: ('M, unit) Syntax.t option;
all_comments: 'M Comment.t list;
}
[@@deriving show]
end =
Program]