From d065d3d530258a9d37b73097484ea4218c422826 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20H=C3=BCbotter?= Date: Fri, 26 Mar 2021 22:24:41 +0100 Subject: [PATCH] [#595] First class types --- common/declarations.ts | 4 +- common/enums.ts | 37 +-- common/terms.ts | 123 +++++++-- common/types.ts | 239 ----------------- common/util.ts | 9 +- dtn/grammar.ts | 204 ++++++++++++--- dtn/index.d.ts | 535 ++++++++++++++++++++++++++++++++------- tony/corpus/patterns.txt | 19 +- tony/grammar.ts | 105 +++----- tony/index.d.ts | 308 +++++++--------------- 10 files changed, 866 insertions(+), 717 deletions(-) delete mode 100644 common/types.ts diff --git a/common/declarations.ts b/common/declarations.ts index 67472569..d20f3438 100644 --- a/common/declarations.ts +++ b/common/declarations.ts @@ -21,8 +21,8 @@ export const declaration_member = ( field('name', alias($.js_identifier, $.identifier_pattern_name)), ), ), - '::', - field('type', $._type), + ':', + field('type', $._term), ) export const js_identifier = () => token(seq(JS_ALPHA, repeat(JS_ALPHANUMERIC))) diff --git a/common/enums.ts b/common/enums.ts index 3ca00d99..229d547a 100644 --- a/common/enums.ts +++ b/common/enums.ts @@ -15,24 +15,25 @@ export enum Prec { Biconditional = 3, TaggedType = 4, Implication = 4, - Or = 5, - And = 6, - Equality = 7, - Order = 8, - Mod = 9, - Sum = 10, - Product = 11, - Exponentiation = 12, - Not = 13, - InfixApplication = 14, - Application = 15, - Term = 16, - Pattern = 16, - Access = 17, - Pipeline = 18, - ParametricTypeInstance = 19, - Argument = 20, - Hole = 21, + Difference = 5, + Or = 6, + And = 7, + Equality = 8, + Order = 9, + Mod = 10, + Sum = 11, + Product = 12, + Exponentiation = 13, + Not = 14, + InfixApplication = 15, + Application = 16, + Term = 17, + Pattern = 17, + Access = 18, + Pipeline = 19, + ParametricTypeInstance = 20, + Argument = 21, + Hole = 22, } export enum Dialect { diff --git a/common/terms.ts b/common/terms.ts index 12c51dff..8c7643e1 100644 --- a/common/terms.ts +++ b/common/terms.ts @@ -1,4 +1,4 @@ -import { IDENTIFIER, OPERATOR } from './constants' +import { IDENTIFIER, OPERATOR, TYPE } from './constants' import { buildBlock, buildGenericType, @@ -9,6 +9,7 @@ import { buildTypeConstraint, buildTypeDeclaration, commaSep1, + sep1, } from './util' import { Prec } from './enums' @@ -17,7 +18,7 @@ export const _term = ($: GrammarSymbols) => Prec.Term, choice( $.block, - $.abstraction, + $.function, $.application, $.infix_application, $._section, @@ -36,9 +37,14 @@ export const _term = ($: GrammarSymbols) => $.list_comprehension, $.parametric_type_instance, $.pure, - $.type_alias, - $.type_hint, $.hole, + $.type_hint, + $.data, + $.function_type, + $.optional_type, + $.map_type, + $.keyof_type, + $.type, $.identifier, $._literal, $.group, @@ -72,8 +78,8 @@ export const class_member = ( ) => seq( field('name', alias($.identifier, $.identifier_pattern_name)), - '::', - field('type', $._type), + ':', + field('type', $._term), ) export const instance = ( @@ -95,7 +101,7 @@ export const argument = ( choice(field('placeholder', '?'), field('value', $._element)), ) -export const abstraction = ( +export const function_ = ( $: GrammarSymbols, ) => prec.left( @@ -255,6 +261,14 @@ export const infix_application = ( field('right', $._term), ), ), + prec.left( + Prec.And, + seq( + field('left', $._term), + field('name', alias('&', $.identifier)), + field('right', $._term), + ), + ), prec.left( Prec.Or, seq( @@ -263,6 +277,22 @@ export const infix_application = ( field('right', $._term), ), ), + prec.left( + Prec.Or, + seq( + field('left', $._term), + field('name', alias('|', $.identifier)), + field('right', $._term), + ), + ), + prec.left( + Prec.Difference, + seq( + field('left', $._term), + field('name', alias('\\', $.identifier)), + field('right', $._term), + ), + ), prec.left( Prec.Implication, seq( @@ -376,6 +406,7 @@ export const return_ = ($: GrammarSymbols) => export const ternary = ($: GrammarSymbols) => prec.right( + 20, seq( field('condition', $._term), '?', @@ -455,36 +486,90 @@ export const parametric_type_instance = ( Prec.ParametricTypeInstance, seq( field('name', $._term), - buildGenericType('typeArgument', $.parametric_type), + buildGenericType('typeArgument', $._term), ), ) export const pure = ($: GrammarSymbols) => prec.right(seq('pure', field('value', $._term))) -export const type_alias = ( - $: GrammarSymbols, -) => - prec.right(seq('type', buildTypeDeclaration($), '=', field('type', $._type))) +export const hole = ($: GrammarSymbols) => + prec( + Prec.Hole, + seq('?', field('name', alias($.identifier, $.identifier_pattern_name))), + ) export const type_hint = ( $: GrammarSymbols, ) => prec.left( Prec.TypeHint, - seq(field('value', $._term), 'as', field('type', $._type)), + seq(field('value', $._term), 'as', field('type', $._term)), ) -export const hole = ($: GrammarSymbols) => - prec( - Prec.Hole, - seq('?', field('name', alias($.identifier, $.identifier_pattern_name))), +export const data = ( + $: GrammarSymbols, +) => + prec.right(seq('data', buildTypeDeclaration($), '=', sep1('|')(field('constructor', $.data_constructor)))) + +export const data_constructor = ( + $: GrammarSymbols, +) => + prec.right(seq( + field( + 'name', + alias($._identifier_without_operators, $.identifier_pattern_name), + ), + optional(field('type', $._term)), + )) + +export const type_variable_declaration = ( + $: GrammarSymbols, +) => + prec.left( + seq( + field('name', alias($.type, $.type_variable_declaration_name)), + optional(buildTypeConstraint($)), + ), ) -export const _identifier_without_operators = () => IDENTIFIER +export const function_type = ( + $: GrammarSymbols, +) => + prec.right( + seq(field('from', $._term), '=>', field('to', $._term)), + ) -export const _operator = () => OPERATOR +export const optional_type = ( + $: GrammarSymbols, +) => prec.left(20, seq(field('type', $._term), '?')) + +export const map_type = ( + $: GrammarSymbols, +) => + seq( + '{', + '[', + optional( + seq( + field('property', alias($.type, $.type_variable_declaration_name)), + 'in', + ), + ), + field('key', $._term), + ']', + ':', + field('value', $._term), + '}', + ) +export const keyof_type = ($: GrammarSymbols) => + prec.right(seq('Keyof', field('type', $._term))) + +export const type = () => TYPE + +export const _identifier_without_operators = () => IDENTIFIER +export const _operator = () => OPERATOR export const identifier = ( $: GrammarSymbols, ) => choice($._operator, $._identifier_without_operators) diff --git a/common/types.ts b/common/types.ts deleted file mode 100644 index b744ab5b..00000000 --- a/common/types.ts +++ /dev/null @@ -1,239 +0,0 @@ -import { Dialect, Prec } from './enums' -import { - buildGenericType, - buildStruct, - buildTuple, - buildTypeConstraint, - commaSep1, -} from './util' -import { TYPE } from './constants' - -export const type_variable_declaration = ( - $: GrammarSymbols, -) => - prec.left( - seq( - field('name', alias($.type, $.type_variable_declaration_name)), - optional(buildTypeConstraint($)), - ), - ) - -export const _type_constructor = - (dialect: Dialect) => - ($: GrammarSymbols) => { - const choices = [ - $.parametric_type, - $.curried_type, - $.intersection_type, - $.union_type, - $.subtraction_type, - $.conditional_type, - $.struct_type, - $.map_type, - $.tuple_type, - $.list_type, - $.optional_type, - $.tagged_type, - $.labeled_type, - $.keyof, - $.type_group, - ] - - if (dialect === Dialect.Tony) - choices.push( - $.typeof, - $.access_type, - $.refinement_type, - $.refinement_type_declaration, - ) - - return choice(...choices) - } - -export const _term_type = ( - $: GrammarSymbols, -) => choice($.identifier, $._literal) - -export const typeof_ = ($: GrammarSymbols) => - seq('typeof', field('value', $._term_type)) - -export const parametric_type_constructor = - (dialect: Dialect) => - ($: GrammarSymbols) => { - const nodes = [ - field('name', $.type), - optional(buildGenericType('argument', $._type)), - ] - - if (dialect === Dialect.Tony) - nodes.push(optional(buildTuple($, $._term_type, false, true, false))) - - return prec.right(seq(...nodes)) - } - -export const curried_type = ( - $: GrammarSymbols, -) => - prec.right( - Prec.CurriedType, - seq(field('from', $._type), '=>', field('to', $._type)), - ) - -export const intersection_type = ( - $: GrammarSymbols, -) => - prec.right( - Prec.IntersectionType, - seq(field('left', $._type), '&', field('right', $._type)), - ) - -export const union_type = ( - $: GrammarSymbols, -) => - prec.right( - Prec.UnionType, - seq(field('left', $._type), '|', field('right', $._type)), - ) - -export const subtraction_type = ( - $: GrammarSymbols, -) => - prec.right( - Prec.SubtractionType, - seq( - field('left', choice($.parametric_type, $.union_type)), - '\\', - field('right', choice($.parametric_type, $.union_type)), - ), - ) - -export const conditional_type = ( - $: GrammarSymbols, -) => - prec.right( - seq( - field('type', $._type), - buildTypeConstraint($), - '?', - field('consequence', $._type), - ':', - field('alternative', $._type), - ), - ) - -export const struct_type = ( - $: GrammarSymbols, -) => buildStruct($, $.member_type) -export const member_type = ( - $: GrammarSymbols, -) => - seq( - field('key', alias($.identifier, $.shorthand_member_identifier)), - ':', - field('value', $._type), - ) - -export const map_type = ( - $: GrammarSymbols, -) => - seq( - '{', - '[', - optional( - seq( - field('property', alias($.type, $.type_variable_declaration_name)), - 'in', - ), - ), - field('key', $._type), - ']', - ':', - field('value', $._type), - '}', - ) - -export const tuple_type = ( - $: GrammarSymbols, -) => buildTuple($, $._type) - -export const list_type = ( - $: GrammarSymbols, -) => seq('[', field('element', $._type), ']') - -export const access_type = ( - $: GrammarSymbols, -) => - prec( - Prec.Access, - seq( - field('type', $._type), - choice( - seq('[', field('value', $._term_type), ']'), - seq( - '->', - field('value', alias($.identifier, $.shorthand_access_identifier)), - ), - ), - ), - ) - -export const optional_type = ( - $: GrammarSymbols, -) => prec(Prec.OptionalType, seq(field('type', $._type), '?')) - -export const tagged_type = ( - $: GrammarSymbols, -) => - prec( - Prec.TaggedType, - seq( - field( - 'name', - alias($._identifier_without_operators, $.identifier_pattern_name), - ), - field('type', $._type), - ), - ) - -export const labeled_type = ( - $: GrammarSymbols, -) => - prec( - Prec.LabeledType, - seq(field('label', $.identifier), ':', field('type', $._type)), - ) - -export const keyof = ($: GrammarSymbols) => - prec.right(seq('keyof', field('type', $._type))) - -export const refinement_type_declaration = ( - $: GrammarSymbols, -) => - prec.left( - seq( - field('name', alias($.identifier, $.identifier_pattern_name)), - '::', - field('type', $._type), - ), - ) - -export const refinement_type = ( - $: GrammarSymbols, -) => - seq( - '[', - field('generator', $._type), - '|', - commaSep1(field('predicate', $._predicate)), - ']', - ) - -export const _predicate = ( - $: GrammarSymbols, -) => choice($.application, $.infix_application) - -export const type_group = ( - $: GrammarSymbols, -) => seq('(', field('type', $._type), ')') - -export const type = () => TYPE diff --git a/common/util.ts b/common/util.ts index 79a144eb..62130c0c 100644 --- a/common/util.ts +++ b/common/util.ts @@ -1,6 +1,6 @@ import { Prec } from './enums' -const sep1 = (sep: string) => (rule: RuleOrLiteral) => +export const sep1 = (sep: string) => (rule: RuleOrLiteral) => seq(rule, repeat(seq(sep, rule))) const sep2 = (sep: string) => (rule: RuleOrLiteral) => @@ -98,8 +98,8 @@ export const buildTypeConstraint = ( seq( '<:', choice( - field('constraint', $._type), - seq('(', sep2(';')(field('constraint', $._type)), ')'), + field('constraint', $._term), + seq('(', sep2(';')(field('constraint', $._term)), ')'), ), ) @@ -109,7 +109,6 @@ export const buildTypeDeclaration = ( seq( field('name', $.type), optional(buildGenericType('parameter', $.type_variable_declaration)), - optional(buildTuple($, $.identifier_pattern, false, true)), ) export const buildIdentifierPattern = ( @@ -120,7 +119,7 @@ export const buildIdentifierPattern = ( Prec.Pattern, seq( field('name', alias($.identifier, $.identifier_pattern_name)), - optional(seq('::', field('type', $._type))), + optional(seq(':', field('type', $._term))), allowDefaults ? optional(seq('=', field('default', $._term))) : seq(), ), ) diff --git a/dtn/grammar.ts b/dtn/grammar.ts index 4d265b16..4598eeae 100644 --- a/dtn/grammar.ts +++ b/dtn/grammar.ts @@ -1,46 +1,88 @@ /// import { + _assignable_pattern, + _literal_pattern, + _pattern, + destructuring_pattern, + identifier_pattern, + list_pattern, + member_pattern, + pattern_group, + root_identifier_pattern, + struct_pattern, + tagged_pattern, + tuple_pattern, + wildcard_pattern, +} from '../common/patterns' +import { + _literal, + boolean, _decimal, _integer, - boolean, number, raw_string, + string, + interpolation, + escape_sequence, regex, - regex_flags, regex_pattern, + regex_flags, } from '../common/literals' import { + _element, _identifier_without_operators, _operator, + _section, + _section_identifier, + _term, + function_, + access, + application, + argument, + assignment, + block, + case_, + class_, + class_member, + else_if, + export_, + group, + hole, identifier, + if_, + infix_application, + instance, + left_section, + list, + list_comprehension, + list_comprehension_condition, + list_comprehension_generator, + member, + parametric_type_instance, + pure, + return_, + right_section, + spread, + struct, + ternary, + tuple, + data, + data_constructor, + function_type, + optional_type, + map_type, + keyof_type, + type, + type_variable_declaration, + type_hint, + when, } from '../common/terms' import { _import_body_constructor, import_, import_type, } from '../common/imports' -import { - _type_constructor, - conditional_type, - curried_type, - intersection_type, - keyof, - labeled_type, - list_type, - map_type, - member_type, - optional_type, - parametric_type_constructor, - struct_type, - subtraction_type, - tagged_type, - tuple_type, - type, - type_group, - type_variable_declaration, - union_type, -} from '../common/types' import { declaration, declaration_member, @@ -62,6 +104,42 @@ export = grammar({ ], extras: ($) => [$.comment, /\s+/], word: ($) => $._identifier_without_operators, + conflicts: ($) => [ + [$._term, $.identifier_pattern], + [$._term, $.identifier_pattern, $.root_identifier_pattern], + [$.identifier_pattern, $.root_identifier_pattern], + // [ + // $.identifier_pattern, + // $.root_identifier_pattern, + // $.refinement_type_declaration, + // ], + [$._term, $.root_identifier_pattern], + // [$._term, $.identifier_pattern, $._type], + [$._term, $.identifier_pattern, $.struct], + [$.string, $.raw_string], + [$.struct, $.struct_pattern], + // [$.struct, $.struct_pattern, $.struct_type], + [$.tuple, $.tuple_pattern], + // [$.tuple, $.tuple_pattern, $.tuple_type], + [$.list, $.list_pattern], + // [$.abstraction, $.tuple_type], + [$.member, $.member_pattern, $._element], + [$.member, $.member_pattern, $._element, $.map_type], + [$.member, $.map_type], + [$.parametric_type_instance, $.infix_application], + [$.parametric_type_instance, $.infix_application, $.application], + [$.application, $.infix_application], + [$.application, $.infix_application, $.ternary], + [$.application, $.infix_application, $.ternary, $.optional_type], + [$.application, $.assignment, $.ternary], + // [$.application, $.assignment, $.ternary, $.optional_type], + [$.tagged_pattern, $.identifier], + // [$.tagged_pattern, $.tagged_type], + // [$.type_variable_declaration, $.parametric_type], + [$._element, $.group], + [$.data_constructor, $.identifier], + [$.data_constructor, $.identifier, $.tagged_pattern], + ], precedences: () => [], @@ -83,35 +161,77 @@ export = grammar({ _import_body: _import_body_constructor(dialect), import_type, + _term, + block, + export: export_, + assignment, + class: class_, + class_member, + instance, + argument, + function: function_, + application, + infix_application, + _section, + left_section, + right_section, + _section_identifier, + list_comprehension, + list_comprehension_generator, + list_comprehension_condition, + access, + return: return_, + ternary, + if: if_, + else_if, + case: case_, + when, + struct, + member, + tuple, + list, + _element, + spread, + parametric_type_instance, + pure, + hole, + type_hint, + data, + data_constructor, + type_variable_declaration, + function_type, + optional_type, + map_type, + keyof_type, + type, _identifier_without_operators, _operator, identifier, + group, - type_variable_declaration, - _type: _type_constructor(dialect), - parametric_type: parametric_type_constructor(dialect), - curried_type, - intersection_type, - union_type, - subtraction_type, - conditional_type, - struct_type, - member_type, - map_type, - tuple_type, - list_type, - optional_type, - tagged_type, - labeled_type, - keyof, - type_group, - type, + _pattern, + _assignable_pattern, + destructuring_pattern, + struct_pattern, + tuple_pattern, + list_pattern, + member_pattern, + identifier_pattern, + root_identifier_pattern, + wildcard_pattern, + tagged_pattern, + _literal_pattern, + pattern_group, + _literal, boolean, _decimal, _integer, number, raw_string, + string, + interpolation, + escape_sequence, regex, regex_pattern, regex_flags, diff --git a/dtn/index.d.ts b/dtn/index.d.ts index 24de2479..d26fb89f 100644 --- a/dtn/index.d.ts +++ b/dtn/index.d.ts @@ -172,65 +172,121 @@ export interface ErrorNode extends NamedNodeBase { export const enum SyntaxType { ERROR = "ERROR", - ConditionalType = "conditional_type", - CurriedType = "curried_type", + Access = "access", + Application = "application", + Argument = "argument", + Assignment = "assignment", + Block = "block", + Boolean = "boolean", + Case = "case", + Class = "class", + ClassMember = "class_member", + Data = "data", + DataConstructor = "data_constructor", Declaration = "declaration", DeclarationMember = "declaration_member", + DestructuringPattern = "destructuring_pattern", + ElseIf = "else_if", + Export = "export", + Function = "function", + FunctionType = "function_type", + Group = "group", + Hole = "hole", Identifier = "identifier", + IdentifierPattern = "identifier_pattern", IdentifierPatternName = "identifier_pattern_name", + If = "if", Import = "import", ImportType = "import_type", - IntersectionType = "intersection_type", - Keyof = "keyof", - LabeledType = "labeled_type", - ListType = "list_type", + InfixApplication = "infix_application", + Instance = "instance", + Interpolation = "interpolation", + KeyofType = "keyof_type", + LeftSection = "left_section", + List = "list", + ListComprehension = "list_comprehension", + ListComprehensionCondition = "list_comprehension_condition", + ListComprehensionGenerator = "list_comprehension_generator", + ListPattern = "list_pattern", MapType = "map_type", - MemberType = "member_type", + Member = "member", + MemberPattern = "member_pattern", + Number = "number", OptionalType = "optional_type", - ParametricType = "parametric_type", + ParametricTypeInstance = "parametric_type_instance", + PatternGroup = "pattern_group", Program = "program", + Pure = "pure", RawString = "raw_string", + Regex = "regex", + Return = "return", + RightSection = "right_section", + ShorthandAccessIdentifier = "shorthand_access_identifier", + ShorthandMember = "shorthand_member", ShorthandMemberIdentifier = "shorthand_member_identifier", - StructType = "struct_type", - SubtractionType = "subtraction_type", - TaggedType = "tagged_type", - TupleType = "tuple_type", - TypeGroup = "type_group", - UnionType = "union_type", + ShorthandMemberPattern = "shorthand_member_pattern", + Spread = "spread", + String = "string", + Struct = "struct", + StructPattern = "struct_pattern", + TaggedPattern = "tagged_pattern", + Ternary = "ternary", + Tuple = "tuple", + TuplePattern = "tuple_pattern", + TypeHint = "type_hint", + TypeVariableDeclaration = "type_variable_declaration", + When = "when", Comment = "comment", + EscapeSequence = "escape_sequence", RegexFlags = "regex_flags", RegexPattern = "regex_pattern", Type = "type", TypeVariableDeclarationName = "type_variable_declaration_name", + WildcardPattern = "wildcard_pattern", } export type UnnamedType = - | "&" | "(" | "()" | ")" | "," + | "->" + | "..." | "/" | ":" - | "::" | ";" | "<" | "<:" + | "=" | "=>" | ">" | "?" + | "@" + | "Keyof" | "[" - | "\\" | "]" + | "`" | "as" + | SyntaxType.Case // both named and unnamed + | SyntaxType.Class // both named and unnamed + | SyntaxType.Data // both named and unnamed | "declare" + | "else" + | "else if" + | SyntaxType.Export // both named and unnamed | "false" | "from" + | SyntaxType.If // both named and unnamed | SyntaxType.Import // both named and unnamed | "in" - | SyntaxType.Keyof // both named and unnamed + | SyntaxType.Instance // both named and unnamed + | "of" + | SyntaxType.Pure // both named and unnamed | "r/" + | SyntaxType.Return // both named and unnamed + | "then" | "true" + | SyntaxType.When // both named and unnamed | "{" | "|" | "}" @@ -239,80 +295,188 @@ export type UnnamedType = export type TypeString = SyntaxType | UnnamedType; export type SyntaxNode = - | ConditionalTypeNode - | CurriedTypeNode + | AccessNode + | ApplicationNode + | ArgumentNode + | AssignmentNode + | BlockNode + | BooleanNode + | CaseNode + | ClassNode + | ClassMemberNode + | DataNode + | DataConstructorNode | DeclarationNode | DeclarationMemberNode + | DestructuringPatternNode + | ElseIfNode + | ExportNode + | FunctionNode + | FunctionTypeNode + | GroupNode + | HoleNode | IdentifierNode + | IdentifierPatternNode | IdentifierPatternNameNode + | IfNode | ImportNode | ImportTypeNode - | IntersectionTypeNode - | KeyofNode - | LabeledTypeNode - | ListTypeNode + | InfixApplicationNode + | InstanceNode + | InterpolationNode + | KeyofTypeNode + | LeftSectionNode + | ListNode + | ListComprehensionNode + | ListComprehensionConditionNode + | ListComprehensionGeneratorNode + | ListPatternNode | MapTypeNode - | MemberTypeNode + | MemberNode + | MemberPatternNode + | NumberNode | OptionalTypeNode - | ParametricTypeNode + | ParametricTypeInstanceNode + | PatternGroupNode | ProgramNode + | PureNode | RawStringNode + | RegexNode + | ReturnNode + | RightSectionNode + | ShorthandAccessIdentifierNode + | ShorthandMemberNode | ShorthandMemberIdentifierNode - | StructTypeNode - | SubtractionTypeNode - | TaggedTypeNode - | TupleTypeNode - | TypeGroupNode - | UnionTypeNode - | UnnamedNode<"&"> + | ShorthandMemberPatternNode + | SpreadNode + | StringNode + | StructNode + | StructPatternNode + | TaggedPatternNode + | TernaryNode + | TupleNode + | TuplePatternNode + | TypeHintNode + | TypeVariableDeclarationNode + | WhenNode | UnnamedNode<"("> | UnnamedNode<"()"> | UnnamedNode<")"> | UnnamedNode<","> + | UnnamedNode<"->"> + | UnnamedNode<"..."> | UnnamedNode<"/"> | UnnamedNode<":"> - | UnnamedNode<"::"> | UnnamedNode<";"> | UnnamedNode<"<"> | UnnamedNode<"<:"> + | UnnamedNode<"="> | UnnamedNode<"=>"> | UnnamedNode<">"> | UnnamedNode<"?"> + | UnnamedNode<"@"> + | UnnamedNode<"Keyof"> | UnnamedNode<"["> - | UnnamedNode<"\\"> | UnnamedNode<"]"> + | UnnamedNode<"`"> | UnnamedNode<"as"> + | UnnamedNode + | UnnamedNode | CommentNode + | UnnamedNode | UnnamedNode<"declare"> + | UnnamedNode<"else"> + | UnnamedNode<"else if"> + | EscapeSequenceNode + | UnnamedNode | UnnamedNode<"false"> | UnnamedNode<"from"> + | UnnamedNode | UnnamedNode | UnnamedNode<"in"> - | UnnamedNode + | UnnamedNode + | UnnamedNode<"of"> + | UnnamedNode | UnnamedNode<"r/"> | RegexFlagsNode | RegexPatternNode + | UnnamedNode + | UnnamedNode<"then"> | UnnamedNode<"true"> | TypeNode | TypeVariableDeclarationNameNode + | UnnamedNode + | WildcardPatternNode | UnnamedNode<"{"> | UnnamedNode<"|"> | UnnamedNode<"}"> | ErrorNode ; -export interface ConditionalTypeNode extends NamedNodeBase { - type: SyntaxType.ConditionalType; - alternativeNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; - consequenceNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; - constraintNodes: (ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode)[]; - typeNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; +export interface AccessNode extends NamedNodeBase { + type: SyntaxType.Access; + nameNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | ShorthandAccessIdentifierNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } -export interface CurriedTypeNode extends NamedNodeBase { - type: SyntaxType.CurriedType; - fromNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; - toNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; +export interface ApplicationNode extends NamedNodeBase { + type: SyntaxType.Application; + elementNodes: (AccessNode | ApplicationNode | ArgumentNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; + nameNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface ArgumentNode extends NamedNodeBase { + type: SyntaxType.Argument; + placeholderNode?: UnnamedNode<"?">; + valueNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | SpreadNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface AssignmentNode extends NamedNodeBase { + type: SyntaxType.Assignment; + patternNode: DestructuringPatternNode | IdentifierPatternNode | PatternGroupNode | TaggedPatternNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface BlockNode extends NamedNodeBase { + type: SyntaxType.Block; + termNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; +} + +export interface BooleanNode extends NamedNodeBase { + type: SyntaxType.Boolean; +} + +export interface CaseNode extends NamedNodeBase { + type: SyntaxType.Case; + elseNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + whenNodes: WhenNode[]; +} + +export interface ClassNode extends NamedNodeBase { + type: SyntaxType.Class; + constraintNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; + memberNodes: ClassMemberNode[]; + nameNode: TypeNode; +} + +export interface ClassMemberNode extends NamedNodeBase { + type: SyntaxType.ClassMember; + nameNode: IdentifierPatternNameNode; + typeNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface DataNode extends NamedNodeBase { + type: SyntaxType.Data; + constructorNodes: DataConstructorNode[]; + nameNode: TypeNode; + parameterNodes: TypeVariableDeclarationNode[]; +} + +export interface DataConstructorNode extends NamedNodeBase { + type: SyntaxType.DataConstructor; + nameNode: IdentifierPatternNameNode; + typeNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface DeclarationNode extends NamedNodeBase { @@ -325,17 +489,73 @@ export interface DeclarationMemberNode extends NamedNodeBase { type: SyntaxType.DeclarationMember; asNode: IdentifierPatternNameNode; nameNode?: IdentifierPatternNameNode; - typeNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; + typeNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface DestructuringPatternNode extends NamedNodeBase { + type: SyntaxType.DestructuringPattern; + aliasNode?: IdentifierPatternNameNode; + patternNode: ListPatternNode | StructPatternNode | TuplePatternNode; +} + +export interface ElseIfNode extends NamedNodeBase { + type: SyntaxType.ElseIf; + bodyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + conditionNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface ExportNode extends NamedNodeBase { + type: SyntaxType.Export; + declarationNode: AssignmentNode; +} + +export interface FunctionNode extends NamedNodeBase { + type: SyntaxType.Function; + bodyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + elementNodes: (BooleanNode | DestructuringPatternNode | IdentifierPatternNode | NumberNode | PatternGroupNode | RawStringNode | RegexNode | TaggedPatternNode | WildcardPatternNode)[]; + restNode?: IdentifierPatternNode; + typeParameterNodes: TypeVariableDeclarationNode[]; +} + +export interface FunctionTypeNode extends NamedNodeBase { + type: SyntaxType.FunctionType; + fromNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + toNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface GroupNode extends NamedNodeBase { + type: SyntaxType.Group; + termNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface HoleNode extends NamedNodeBase { + type: SyntaxType.Hole; + nameNode: IdentifierPatternNameNode; } export interface IdentifierNode extends NamedNodeBase { type: SyntaxType.Identifier; } +export interface IdentifierPatternNode extends NamedNodeBase { + type: SyntaxType.IdentifierPattern; + defaultNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + nameNode: IdentifierPatternNameNode; + typeNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + export interface IdentifierPatternNameNode extends NamedNodeBase { type: SyntaxType.IdentifierPatternName; } +export interface IfNode extends NamedNodeBase { + type: SyntaxType.If; + bodyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + conditionNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + elseNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + elseIfNodes: ElseIfNode[]; +} + export interface ImportNode extends NamedNodeBase { type: SyntaxType.Import; importNodes: ImportTypeNode[]; @@ -348,50 +568,103 @@ export interface ImportTypeNode extends NamedNodeBase { nameNode?: TypeNode; } -export interface IntersectionTypeNode extends NamedNodeBase { - type: SyntaxType.IntersectionType; - leftNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; - rightNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; +export interface InfixApplicationNode extends NamedNodeBase { + type: SyntaxType.InfixApplication; + leftNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + nameNode: IdentifierNode; + rightNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface InstanceNode extends NamedNodeBase { + type: SyntaxType.Instance; + assignmentNodes: AssignmentNode[]; + classNode: TypeNode; + nameNode: TypeNode; + parameterNodes: TypeVariableDeclarationNode[]; +} + +export interface InterpolationNode extends NamedNodeBase { + type: SyntaxType.Interpolation; + termNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } -export interface KeyofNode extends NamedNodeBase { - type: SyntaxType.Keyof; - typeNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; +export interface KeyofTypeNode extends NamedNodeBase { + type: SyntaxType.KeyofType; + typeNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } -export interface LabeledTypeNode extends NamedNodeBase { - type: SyntaxType.LabeledType; - labelNode: IdentifierNode; - typeNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; +export interface LeftSectionNode extends NamedNodeBase { + type: SyntaxType.LeftSection; + nameNode: IdentifierNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } -export interface ListTypeNode extends NamedNodeBase { - type: SyntaxType.ListType; - elementNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; +export interface ListNode extends NamedNodeBase { + type: SyntaxType.List; + elementNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | SpreadNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; +} + +export interface ListComprehensionNode extends NamedNodeBase { + type: SyntaxType.ListComprehension; + bodyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + conditionNodes: ListComprehensionConditionNode[]; + generatorNodes: ListComprehensionGeneratorNode[]; +} + +export interface ListComprehensionConditionNode extends NamedNodeBase { + type: SyntaxType.ListComprehensionCondition; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface ListComprehensionGeneratorNode extends NamedNodeBase { + type: SyntaxType.ListComprehensionGenerator; + nameNode: IdentifierPatternNameNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface ListPatternNode extends NamedNodeBase { + type: SyntaxType.ListPattern; + elementNodes: (BooleanNode | DestructuringPatternNode | IdentifierPatternNode | NumberNode | PatternGroupNode | RawStringNode | RegexNode | TaggedPatternNode | WildcardPatternNode)[]; + restNode?: IdentifierPatternNode; } export interface MapTypeNode extends NamedNodeBase { type: SyntaxType.MapType; - keyNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; + keyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; propertyNode?: TypeVariableDeclarationNameNode; - valueNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } -export interface MemberTypeNode extends NamedNodeBase { - type: SyntaxType.MemberType; - keyNode: ShorthandMemberIdentifierNode; - valueNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; +export interface MemberNode extends NamedNodeBase { + type: SyntaxType.Member; + keyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | ShorthandMemberIdentifierNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface MemberPatternNode extends NamedNodeBase { + type: SyntaxType.MemberPattern; + keyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | ShorthandMemberIdentifierNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + valueNode: BooleanNode | DestructuringPatternNode | IdentifierPatternNode | NumberNode | PatternGroupNode | RawStringNode | RegexNode | TaggedPatternNode | WildcardPatternNode; +} + +export interface NumberNode extends NamedNodeBase { + type: SyntaxType.Number; } export interface OptionalTypeNode extends NamedNodeBase { type: SyntaxType.OptionalType; - typeNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; + typeNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } -export interface ParametricTypeNode extends NamedNodeBase { - type: SyntaxType.ParametricType; - argumentNodes: (ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode)[]; - nameNode: TypeNode; +export interface ParametricTypeInstanceNode extends NamedNodeBase { + type: SyntaxType.ParametricTypeInstance; + nameNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + typeArgumentNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; +} + +export interface PatternGroupNode extends NamedNodeBase { + type: SyntaxType.PatternGroup; + patternNode: BooleanNode | DestructuringPatternNode | IdentifierPatternNode | NumberNode | PatternGroupNode | RawStringNode | RegexNode | TaggedPatternNode | WildcardPatternNode; } export interface ProgramNode extends NamedNodeBase { @@ -400,51 +673,123 @@ export interface ProgramNode extends NamedNodeBase { importNodes: ImportNode[]; } +export interface PureNode extends NamedNodeBase { + type: SyntaxType.Pure; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + export interface RawStringNode extends NamedNodeBase { type: SyntaxType.RawString; } +export interface RegexNode extends NamedNodeBase { + type: SyntaxType.Regex; + flagsNode?: RegexFlagsNode; + patternNode: RegexPatternNode; +} + +export interface ReturnNode extends NamedNodeBase { + type: SyntaxType.Return; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface RightSectionNode extends NamedNodeBase { + type: SyntaxType.RightSection; + nameNode: IdentifierNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface ShorthandAccessIdentifierNode extends NamedNodeBase { + type: SyntaxType.ShorthandAccessIdentifier; +} + +export interface ShorthandMemberNode extends NamedNodeBase { + type: SyntaxType.ShorthandMember; +} + export interface ShorthandMemberIdentifierNode extends NamedNodeBase { type: SyntaxType.ShorthandMemberIdentifier; } -export interface StructTypeNode extends NamedNodeBase { - type: SyntaxType.StructType; - memberNodes: MemberTypeNode[]; +export interface ShorthandMemberPatternNode extends NamedNodeBase { + type: SyntaxType.ShorthandMemberPattern; + defaultNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + nameNode: IdentifierPatternNameNode; + typeNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface SpreadNode extends NamedNodeBase { + type: SyntaxType.Spread; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } -export interface SubtractionTypeNode extends NamedNodeBase { - type: SyntaxType.SubtractionType; - leftNode: ParametricTypeNode | UnionTypeNode; - rightNode: ParametricTypeNode | UnionTypeNode; +export interface StringNode extends NamedNodeBase { + type: SyntaxType.String; + escapeSequenceNodes: EscapeSequenceNode[]; + interpolationNodes: InterpolationNode[]; } -export interface TaggedTypeNode extends NamedNodeBase { - type: SyntaxType.TaggedType; - nameNode: IdentifierPatternNameNode; - typeNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; +export interface StructNode extends NamedNodeBase { + type: SyntaxType.Struct; + memberNodes: (MemberNode | ShorthandMemberNode | SpreadNode)[]; } -export interface TupleTypeNode extends NamedNodeBase { - type: SyntaxType.TupleType; - elementNodes: (ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode)[]; +export interface StructPatternNode extends NamedNodeBase { + type: SyntaxType.StructPattern; + memberNodes: (MemberPatternNode | ShorthandMemberPatternNode)[]; + restNode?: IdentifierPatternNode; } -export interface TypeGroupNode extends NamedNodeBase { - type: SyntaxType.TypeGroup; - typeNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; +export interface TaggedPatternNode extends NamedNodeBase { + type: SyntaxType.TaggedPattern; + nameNode: IdentifierNode; + patternNode: BooleanNode | DestructuringPatternNode | IdentifierPatternNode | NumberNode | PatternGroupNode | RawStringNode | RegexNode | TaggedPatternNode | WildcardPatternNode; } -export interface UnionTypeNode extends NamedNodeBase { - type: SyntaxType.UnionType; - leftNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; - rightNode: ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | UnionTypeNode; +export interface TernaryNode extends NamedNodeBase { + type: SyntaxType.Ternary; + bodyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + conditionNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + elseNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface TupleNode extends NamedNodeBase { + type: SyntaxType.Tuple; + elementNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | SpreadNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; +} + +export interface TuplePatternNode extends NamedNodeBase { + type: SyntaxType.TuplePattern; + elementNodes: (BooleanNode | DestructuringPatternNode | IdentifierPatternNode | NumberNode | PatternGroupNode | RawStringNode | RegexNode | TaggedPatternNode | WildcardPatternNode)[]; + restNode?: IdentifierPatternNode; +} + +export interface TypeHintNode extends NamedNodeBase { + type: SyntaxType.TypeHint; + typeNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + +export interface TypeVariableDeclarationNode extends NamedNodeBase { + type: SyntaxType.TypeVariableDeclaration; + constraintNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; + nameNode: TypeVariableDeclarationNameNode; +} + +export interface WhenNode extends NamedNodeBase { + type: SyntaxType.When; + bodyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + patternNodes: (BooleanNode | DestructuringPatternNode | IdentifierPatternNode | NumberNode | PatternGroupNode | RawStringNode | RegexNode | TaggedPatternNode | WildcardPatternNode)[]; } export interface CommentNode extends NamedNodeBase { type: SyntaxType.Comment; } +export interface EscapeSequenceNode extends NamedNodeBase { + type: SyntaxType.EscapeSequence; +} + export interface RegexFlagsNode extends NamedNodeBase { type: SyntaxType.RegexFlags; } @@ -461,3 +806,7 @@ export interface TypeVariableDeclarationNameNode extends NamedNodeBase { type: SyntaxType.TypeVariableDeclarationName; } +export interface WildcardPatternNode extends NamedNodeBase { + type: SyntaxType.WildcardPattern; +} + diff --git a/tony/corpus/patterns.txt b/tony/corpus/patterns.txt index 739e7e1c..a06777a7 100644 --- a/tony/corpus/patterns.txt +++ b/tony/corpus/patterns.txt @@ -202,8 +202,8 @@ list pattern tagged list pattern ============================================ -tag [b :: Type, c :: Type] = a -tag [b :: Type, c :: Type, ...d :: Type = [1]] = a +tag [b: Type, c: Type] = a +tag [b: Type, c: Type, ...d: Type = [1]] = a --- @@ -215,12 +215,10 @@ tag [b :: Type, c :: Type, ...d :: Type = [1]] = a pattern: (list_pattern element: (identifier_pattern name: (identifier_pattern_name) - type: (parametric_type - name: (type))) + type: (type)) element: (identifier_pattern name: (identifier_pattern_name) - type: (parametric_type - name: (type)))))) + type: (type))))) value: (identifier)) term: (assignment pattern: (tagged_pattern @@ -229,16 +227,13 @@ tag [b :: Type, c :: Type, ...d :: Type = [1]] = a pattern: (list_pattern element: (identifier_pattern name: (identifier_pattern_name) - type: (parametric_type - name: (type))) + type: (type)) element: (identifier_pattern name: (identifier_pattern_name) - type: (parametric_type - name: (type))) + type: (type)) rest: (identifier_pattern name: (identifier_pattern_name) - type: (parametric_type - name: (type)) + type: (type) default: (list element: (number)))))) value: (identifier))) diff --git a/tony/grammar.ts b/tony/grammar.ts index bca43d0f..2d799461 100644 --- a/tony/grammar.ts +++ b/tony/grammar.ts @@ -36,7 +36,7 @@ import { _section, _section_identifier, _term, - abstraction, + function_, access, application, argument, @@ -67,7 +67,14 @@ import { struct, ternary, tuple, - type_alias, + data, + data_constructor, + function_type, + optional_type, + map_type, + keyof_type, + type, + type_variable_declaration, type_hint, when, } from '../common/terms' @@ -78,33 +85,6 @@ import { import_identifier, import_type, } from '../common/imports' -import { - _predicate, - _term_type, - _type_constructor, - access_type, - conditional_type, - curried_type, - intersection_type, - keyof, - labeled_type, - list_type, - map_type, - member_type, - optional_type, - parametric_type_constructor, - refinement_type, - refinement_type_declaration, - struct_type, - subtraction_type, - tagged_type, - tuple_type, - type, - type_group, - type_variable_declaration, - typeof_, - union_type, -} from '../common/types' import { comment, hash_bang_line } from '../common/miscellaneous' import { Dialect } from '../common/enums' @@ -125,31 +105,37 @@ export = grammar({ [$._term, $.identifier_pattern], [$._term, $.identifier_pattern, $.root_identifier_pattern], [$.identifier_pattern, $.root_identifier_pattern], - [ - $.identifier_pattern, - $.root_identifier_pattern, - $.refinement_type_declaration, - ], + // [ + // $.identifier_pattern, + // $.root_identifier_pattern, + // $.refinement_type_declaration, + // ], [$._term, $.root_identifier_pattern], - [$._term, $.identifier_pattern, $._type], + // [$._term, $.identifier_pattern, $._type], [$._term, $.identifier_pattern, $.struct], [$.string, $.raw_string], [$.struct, $.struct_pattern], - [$.struct, $.struct_pattern, $.struct_type], + // [$.struct, $.struct_pattern, $.struct_type], [$.tuple, $.tuple_pattern], - [$.tuple, $.tuple_pattern, $.tuple_type], + // [$.tuple, $.tuple_pattern, $.tuple_type], [$.list, $.list_pattern], - [$.abstraction, $.tuple_type], + // [$.abstraction, $.tuple_type], [$.member, $.member_pattern, $._element], + [$.member, $.member_pattern, $._element, $.map_type], + [$.member, $.map_type], [$.parametric_type_instance, $.infix_application], [$.parametric_type_instance, $.infix_application, $.application], [$.application, $.infix_application], [$.application, $.infix_application, $.ternary], + [$.application, $.infix_application, $.ternary, $.optional_type], [$.application, $.assignment, $.ternary], + // [$.application, $.assignment, $.ternary, $.optional_type], [$.tagged_pattern, $.identifier], - [$.tagged_pattern, $.tagged_type], - [$.type_variable_declaration, $.parametric_type], + // [$.tagged_pattern, $.tagged_type], + // [$.type_variable_declaration, $.parametric_type], [$._element, $.group], + [$.data_constructor, $.identifier], + [$.data_constructor, $.identifier, $.tagged_pattern], ], precedences: () => [], @@ -181,7 +167,7 @@ export = grammar({ class_member, instance, argument, - abstraction, + function: function_, application, infix_application, _section, @@ -206,9 +192,16 @@ export = grammar({ spread, parametric_type_instance, pure, - type_alias, - type_hint, hole, + type_hint, + data, + data_constructor, + type_variable_declaration, + function_type, + optional_type, + map_type, + keyof_type, + type, _identifier_without_operators, _operator, identifier, @@ -228,32 +221,6 @@ export = grammar({ _literal_pattern, pattern_group, - type_variable_declaration, - _type: _type_constructor(dialect), - _term_type, - typeof: typeof_, - parametric_type: parametric_type_constructor(dialect), - curried_type, - intersection_type, - union_type, - subtraction_type, - conditional_type, - struct_type, - member_type, - map_type, - tuple_type, - list_type, - optional_type, - access_type, - tagged_type, - labeled_type, - keyof, - refinement_type_declaration, - refinement_type, - _predicate, - type_group, - type, - _literal, boolean, _decimal, diff --git a/tony/index.d.ts b/tony/index.d.ts index f9c7c3ca..73b329b9 100644 --- a/tony/index.d.ts +++ b/tony/index.d.ts @@ -172,9 +172,7 @@ export interface ErrorNode extends NamedNodeBase { export const enum SyntaxType { ERROR = "ERROR", - Abstraction = "abstraction", Access = "access", - AccessType = "access_type", Application = "application", Argument = "argument", Assignment = "assignment", @@ -183,12 +181,14 @@ export const enum SyntaxType { Case = "case", Class = "class", ClassMember = "class_member", - ConditionalType = "conditional_type", - CurriedType = "curried_type", + Data = "data", + DataConstructor = "data_constructor", DestructuringPattern = "destructuring_pattern", ElseIf = "else_if", Export = "export", ExportedImport = "exported_import", + Function = "function", + FunctionType = "function_type", Group = "group", Hole = "hole", Identifier = "identifier", @@ -201,30 +201,23 @@ export const enum SyntaxType { InfixApplication = "infix_application", Instance = "instance", Interpolation = "interpolation", - IntersectionType = "intersection_type", - Keyof = "keyof", - LabeledType = "labeled_type", + KeyofType = "keyof_type", LeftSection = "left_section", List = "list", ListComprehension = "list_comprehension", ListComprehensionCondition = "list_comprehension_condition", ListComprehensionGenerator = "list_comprehension_generator", ListPattern = "list_pattern", - ListType = "list_type", MapType = "map_type", Member = "member", MemberPattern = "member_pattern", - MemberType = "member_type", Number = "number", OptionalType = "optional_type", - ParametricType = "parametric_type", ParametricTypeInstance = "parametric_type_instance", PatternGroup = "pattern_group", Program = "program", Pure = "pure", RawString = "raw_string", - RefinementType = "refinement_type", - RefinementTypeDeclaration = "refinement_type_declaration", Regex = "regex", Return = "return", RightSection = "right_section", @@ -236,20 +229,12 @@ export const enum SyntaxType { String = "string", Struct = "struct", StructPattern = "struct_pattern", - StructType = "struct_type", - SubtractionType = "subtraction_type", TaggedPattern = "tagged_pattern", - TaggedType = "tagged_type", Ternary = "ternary", Tuple = "tuple", TuplePattern = "tuple_pattern", - TupleType = "tuple_type", - TypeAlias = "type_alias", - TypeGroup = "type_group", TypeHint = "type_hint", TypeVariableDeclaration = "type_variable_declaration", - Typeof = "typeof", - UnionType = "union_type", When = "when", Comment = "comment", EscapeSequence = "escape_sequence", @@ -262,7 +247,6 @@ export const enum SyntaxType { } export type UnnamedType = - | "&" | "(" | "()" | ")" @@ -271,7 +255,6 @@ export type UnnamedType = | "..." | "/" | ":" - | "::" | ";" | "<" | "<:" @@ -280,13 +263,14 @@ export type UnnamedType = | ">" | "?" | "@" + | "Keyof" | "[" - | "\\" | "]" | "`" | "as" | SyntaxType.Case // both named and unnamed | SyntaxType.Class // both named and unnamed + | SyntaxType.Data // both named and unnamed | "else" | "else if" | SyntaxType.Export // both named and unnamed @@ -296,15 +280,12 @@ export type UnnamedType = | SyntaxType.Import // both named and unnamed | "in" | SyntaxType.Instance // both named and unnamed - | SyntaxType.Keyof // both named and unnamed | "of" | SyntaxType.Pure // both named and unnamed | "r/" | SyntaxType.Return // both named and unnamed | "then" | "true" - | SyntaxType.Type // both named and unnamed - | SyntaxType.Typeof // both named and unnamed | SyntaxType.When // both named and unnamed | "{" | "|" @@ -314,9 +295,7 @@ export type UnnamedType = export type TypeString = SyntaxType | UnnamedType; export type SyntaxNode = - | AbstractionNode | AccessNode - | AccessTypeNode | ApplicationNode | ArgumentNode | AssignmentNode @@ -325,12 +304,14 @@ export type SyntaxNode = | CaseNode | ClassNode | ClassMemberNode - | ConditionalTypeNode - | CurriedTypeNode + | DataNode + | DataConstructorNode | DestructuringPatternNode | ElseIfNode | ExportNode | ExportedImportNode + | FunctionNode + | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode @@ -343,30 +324,23 @@ export type SyntaxNode = | InfixApplicationNode | InstanceNode | InterpolationNode - | IntersectionTypeNode - | KeyofNode - | LabeledTypeNode + | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | ListComprehensionConditionNode | ListComprehensionGeneratorNode | ListPatternNode - | ListTypeNode | MapTypeNode | MemberNode | MemberPatternNode - | MemberTypeNode | NumberNode | OptionalTypeNode - | ParametricTypeNode | ParametricTypeInstanceNode | PatternGroupNode | ProgramNode | PureNode | RawStringNode - | RefinementTypeNode - | RefinementTypeDeclarationNode | RegexNode | ReturnNode | RightSectionNode @@ -378,22 +352,13 @@ export type SyntaxNode = | StringNode | StructNode | StructPatternNode - | StructTypeNode - | SubtractionTypeNode | TaggedPatternNode - | TaggedTypeNode | TernaryNode | TupleNode | TuplePatternNode - | TupleTypeNode - | TypeAliasNode - | TypeGroupNode | TypeHintNode | TypeVariableDeclarationNode - | TypeofNode - | UnionTypeNode | WhenNode - | UnnamedNode<"&"> | UnnamedNode<"("> | UnnamedNode<"()"> | UnnamedNode<")"> @@ -402,7 +367,6 @@ export type SyntaxNode = | UnnamedNode<"..."> | UnnamedNode<"/"> | UnnamedNode<":"> - | UnnamedNode<"::"> | UnnamedNode<";"> | UnnamedNode<"<"> | UnnamedNode<"<:"> @@ -411,14 +375,15 @@ export type SyntaxNode = | UnnamedNode<">"> | UnnamedNode<"?"> | UnnamedNode<"@"> + | UnnamedNode<"Keyof"> | UnnamedNode<"["> - | UnnamedNode<"\\"> | UnnamedNode<"]"> | UnnamedNode<"`"> | UnnamedNode<"as"> | UnnamedNode | UnnamedNode | CommentNode + | UnnamedNode | UnnamedNode<"else"> | UnnamedNode<"else if"> | EscapeSequenceNode @@ -430,7 +395,6 @@ export type SyntaxNode = | UnnamedNode | UnnamedNode<"in"> | UnnamedNode - | UnnamedNode | UnnamedNode<"of"> | UnnamedNode | UnnamedNode<"r/"> @@ -439,10 +403,8 @@ export type SyntaxNode = | UnnamedNode | UnnamedNode<"then"> | UnnamedNode<"true"> - | UnnamedNode | TypeNode | TypeVariableDeclarationNameNode - | UnnamedNode | UnnamedNode | WildcardPatternNode | UnnamedNode<"{"> @@ -451,47 +413,33 @@ export type SyntaxNode = | ErrorNode ; -export interface AbstractionNode extends NamedNodeBase { - type: SyntaxType.Abstraction; - bodyNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; - elementNodes: (BooleanNode | DestructuringPatternNode | IdentifierPatternNode | NumberNode | PatternGroupNode | RawStringNode | RegexNode | TaggedPatternNode | WildcardPatternNode)[]; - restNode?: IdentifierPatternNode; - typeParameterNodes: TypeVariableDeclarationNode[]; -} - export interface AccessNode extends NamedNodeBase { type: SyntaxType.Access; - nameNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; - valueNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | ShorthandAccessIdentifierNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; -} - -export interface AccessTypeNode extends NamedNodeBase { - type: SyntaxType.AccessType; - typeNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; - valueNode: BooleanNode | IdentifierNode | NumberNode | RegexNode | ShorthandAccessIdentifierNode | StringNode; + nameNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | ShorthandAccessIdentifierNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface ApplicationNode extends NamedNodeBase { type: SyntaxType.Application; - elementNodes: (AbstractionNode | AccessNode | ApplicationNode | ArgumentNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode)[]; - nameNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + elementNodes: (AccessNode | ApplicationNode | ArgumentNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; + nameNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface ArgumentNode extends NamedNodeBase { type: SyntaxType.Argument; placeholderNode?: UnnamedNode<"?">; - valueNode?: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | SpreadNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + valueNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | SpreadNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface AssignmentNode extends NamedNodeBase { type: SyntaxType.Assignment; patternNode: DestructuringPatternNode | IdentifierPatternNode | PatternGroupNode | TaggedPatternNode; - valueNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface BlockNode extends NamedNodeBase { type: SyntaxType.Block; - termNodes: (AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode)[]; + termNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; } export interface BooleanNode extends NamedNodeBase { @@ -500,14 +448,14 @@ export interface BooleanNode extends NamedNodeBase { export interface CaseNode extends NamedNodeBase { type: SyntaxType.Case; - elseNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; - valueNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + elseNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; whenNodes: WhenNode[]; } export interface ClassNode extends NamedNodeBase { type: SyntaxType.Class; - constraintNodes: (AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode)[]; + constraintNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; memberNodes: ClassMemberNode[]; nameNode: TypeNode; } @@ -515,21 +463,20 @@ export interface ClassNode extends NamedNodeBase { export interface ClassMemberNode extends NamedNodeBase { type: SyntaxType.ClassMember; nameNode: IdentifierPatternNameNode; - typeNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; + typeNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } -export interface ConditionalTypeNode extends NamedNodeBase { - type: SyntaxType.ConditionalType; - alternativeNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; - consequenceNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; - constraintNodes: (AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode)[]; - typeNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; +export interface DataNode extends NamedNodeBase { + type: SyntaxType.Data; + constructorNodes: DataConstructorNode[]; + nameNode: TypeNode; + parameterNodes: TypeVariableDeclarationNode[]; } -export interface CurriedTypeNode extends NamedNodeBase { - type: SyntaxType.CurriedType; - fromNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; - toNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; +export interface DataConstructorNode extends NamedNodeBase { + type: SyntaxType.DataConstructor; + nameNode: IdentifierPatternNameNode; + typeNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface DestructuringPatternNode extends NamedNodeBase { @@ -540,8 +487,8 @@ export interface DestructuringPatternNode extends NamedNodeBase { export interface ElseIfNode extends NamedNodeBase { type: SyntaxType.ElseIf; - bodyNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; - conditionNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + bodyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + conditionNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface ExportNode extends NamedNodeBase { @@ -556,9 +503,23 @@ export interface ExportedImportNode extends NamedNodeBase { sourceNode: RawStringNode; } +export interface FunctionNode extends NamedNodeBase { + type: SyntaxType.Function; + bodyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + elementNodes: (BooleanNode | DestructuringPatternNode | IdentifierPatternNode | NumberNode | PatternGroupNode | RawStringNode | RegexNode | TaggedPatternNode | WildcardPatternNode)[]; + restNode?: IdentifierPatternNode; + typeParameterNodes: TypeVariableDeclarationNode[]; +} + +export interface FunctionTypeNode extends NamedNodeBase { + type: SyntaxType.FunctionType; + fromNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + toNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; +} + export interface GroupNode extends NamedNodeBase { type: SyntaxType.Group; - termNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + termNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface HoleNode extends NamedNodeBase { @@ -572,9 +533,9 @@ export interface IdentifierNode extends NamedNodeBase { export interface IdentifierPatternNode extends NamedNodeBase { type: SyntaxType.IdentifierPattern; - defaultNode?: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + defaultNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; nameNode: IdentifierPatternNameNode; - typeNode?: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; + typeNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface IdentifierPatternNameNode extends NamedNodeBase { @@ -583,9 +544,9 @@ export interface IdentifierPatternNameNode extends NamedNodeBase { export interface IfNode extends NamedNodeBase { type: SyntaxType.If; - bodyNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; - conditionNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; - elseNode?: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + bodyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + conditionNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + elseNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; elseIfNodes: ElseIfNode[]; } @@ -610,69 +571,56 @@ export interface ImportTypeNode extends NamedNodeBase { export interface InfixApplicationNode extends NamedNodeBase { type: SyntaxType.InfixApplication; - leftNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + leftNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; nameNode: IdentifierNode; - rightNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + rightNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface InstanceNode extends NamedNodeBase { type: SyntaxType.Instance; assignmentNodes: AssignmentNode[]; classNode: TypeNode; - elementNodes: IdentifierPatternNode[]; nameNode: TypeNode; parameterNodes: TypeVariableDeclarationNode[]; } export interface InterpolationNode extends NamedNodeBase { type: SyntaxType.Interpolation; - termNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + termNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } -export interface IntersectionTypeNode extends NamedNodeBase { - type: SyntaxType.IntersectionType; - leftNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; - rightNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; -} - -export interface KeyofNode extends NamedNodeBase { - type: SyntaxType.Keyof; - typeNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; -} - -export interface LabeledTypeNode extends NamedNodeBase { - type: SyntaxType.LabeledType; - labelNode: IdentifierNode; - typeNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; +export interface KeyofTypeNode extends NamedNodeBase { + type: SyntaxType.KeyofType; + typeNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface LeftSectionNode extends NamedNodeBase { type: SyntaxType.LeftSection; nameNode: IdentifierNode; - valueNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface ListNode extends NamedNodeBase { type: SyntaxType.List; - elementNodes: (AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | SpreadNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode)[]; + elementNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | SpreadNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; } export interface ListComprehensionNode extends NamedNodeBase { type: SyntaxType.ListComprehension; - bodyNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + bodyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; conditionNodes: ListComprehensionConditionNode[]; generatorNodes: ListComprehensionGeneratorNode[]; } export interface ListComprehensionConditionNode extends NamedNodeBase { type: SyntaxType.ListComprehensionCondition; - valueNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface ListComprehensionGeneratorNode extends NamedNodeBase { type: SyntaxType.ListComprehensionGenerator; nameNode: IdentifierPatternNameNode; - valueNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface ListPatternNode extends NamedNodeBase { @@ -681,56 +629,38 @@ export interface ListPatternNode extends NamedNodeBase { restNode?: IdentifierPatternNode; } -export interface ListTypeNode extends NamedNodeBase { - type: SyntaxType.ListType; - elementNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; -} - export interface MapTypeNode extends NamedNodeBase { type: SyntaxType.MapType; - keyNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; + keyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; propertyNode?: TypeVariableDeclarationNameNode; - valueNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface MemberNode extends NamedNodeBase { type: SyntaxType.Member; - keyNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | ShorthandMemberIdentifierNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; - valueNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + keyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | ShorthandMemberIdentifierNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface MemberPatternNode extends NamedNodeBase { type: SyntaxType.MemberPattern; - keyNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | ShorthandMemberIdentifierNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + keyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | ShorthandMemberIdentifierNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; valueNode: BooleanNode | DestructuringPatternNode | IdentifierPatternNode | NumberNode | PatternGroupNode | RawStringNode | RegexNode | TaggedPatternNode | WildcardPatternNode; } -export interface MemberTypeNode extends NamedNodeBase { - type: SyntaxType.MemberType; - keyNode: ShorthandMemberIdentifierNode; - valueNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; -} - export interface NumberNode extends NamedNodeBase { type: SyntaxType.Number; } export interface OptionalTypeNode extends NamedNodeBase { type: SyntaxType.OptionalType; - typeNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; -} - -export interface ParametricTypeNode extends NamedNodeBase { - type: SyntaxType.ParametricType; - argumentNodes: (AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode)[]; - elementNodes: (BooleanNode | IdentifierNode | NumberNode | RegexNode | StringNode)[]; - nameNode: TypeNode; + typeNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface ParametricTypeInstanceNode extends NamedNodeBase { type: SyntaxType.ParametricTypeInstance; - nameNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; - typeArgumentNodes: ParametricTypeNode[]; + nameNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + typeArgumentNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; } export interface PatternGroupNode extends NamedNodeBase { @@ -742,30 +672,18 @@ export interface ProgramNode extends NamedNodeBase { type: SyntaxType.Program; hashBangLineNode?: HashBangLineNode; importNodes: (ExportedImportNode | ImportNode)[]; - termNodes: (AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode)[]; + termNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; } export interface PureNode extends NamedNodeBase { type: SyntaxType.Pure; - valueNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface RawStringNode extends NamedNodeBase { type: SyntaxType.RawString; } -export interface RefinementTypeNode extends NamedNodeBase { - type: SyntaxType.RefinementType; - generatorNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; - predicateNodes: (ApplicationNode | InfixApplicationNode)[]; -} - -export interface RefinementTypeDeclarationNode extends NamedNodeBase { - type: SyntaxType.RefinementTypeDeclaration; - nameNode: IdentifierPatternNameNode; - typeNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; -} - export interface RegexNode extends NamedNodeBase { type: SyntaxType.Regex; flagsNode?: RegexFlagsNode; @@ -774,13 +692,13 @@ export interface RegexNode extends NamedNodeBase { export interface ReturnNode extends NamedNodeBase { type: SyntaxType.Return; - valueNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface RightSectionNode extends NamedNodeBase { type: SyntaxType.RightSection; nameNode: IdentifierNode; - valueNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface ShorthandAccessIdentifierNode extends NamedNodeBase { @@ -797,14 +715,14 @@ export interface ShorthandMemberIdentifierNode extends NamedNodeBase { export interface ShorthandMemberPatternNode extends NamedNodeBase { type: SyntaxType.ShorthandMemberPattern; - defaultNode?: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + defaultNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; nameNode: IdentifierPatternNameNode; - typeNode?: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; + typeNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface SpreadNode extends NamedNodeBase { type: SyntaxType.Spread; - valueNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface StringNode extends NamedNodeBase { @@ -824,39 +742,22 @@ export interface StructPatternNode extends NamedNodeBase { restNode?: IdentifierPatternNode; } -export interface StructTypeNode extends NamedNodeBase { - type: SyntaxType.StructType; - memberNodes: MemberTypeNode[]; -} - -export interface SubtractionTypeNode extends NamedNodeBase { - type: SyntaxType.SubtractionType; - leftNode: ParametricTypeNode | UnionTypeNode; - rightNode: ParametricTypeNode | UnionTypeNode; -} - export interface TaggedPatternNode extends NamedNodeBase { type: SyntaxType.TaggedPattern; nameNode: IdentifierNode; patternNode: BooleanNode | DestructuringPatternNode | IdentifierPatternNode | NumberNode | PatternGroupNode | RawStringNode | RegexNode | TaggedPatternNode | WildcardPatternNode; } -export interface TaggedTypeNode extends NamedNodeBase { - type: SyntaxType.TaggedType; - nameNode: IdentifierPatternNameNode; - typeNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; -} - export interface TernaryNode extends NamedNodeBase { type: SyntaxType.Ternary; - bodyNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; - conditionNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; - elseNode?: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + bodyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + conditionNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + elseNode?: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface TupleNode extends NamedNodeBase { type: SyntaxType.Tuple; - elementNodes: (AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | SpreadNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode)[]; + elementNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | SpreadNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; } export interface TuplePatternNode extends NamedNodeBase { @@ -865,50 +766,21 @@ export interface TuplePatternNode extends NamedNodeBase { restNode?: IdentifierPatternNode; } -export interface TupleTypeNode extends NamedNodeBase { - type: SyntaxType.TupleType; - elementNodes: (AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode)[]; -} - -export interface TypeAliasNode extends NamedNodeBase { - type: SyntaxType.TypeAlias; - elementNodes: IdentifierPatternNode[]; - nameNode: TypeNode; - parameterNodes: TypeVariableDeclarationNode[]; - typeNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; -} - -export interface TypeGroupNode extends NamedNodeBase { - type: SyntaxType.TypeGroup; - typeNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; -} - export interface TypeHintNode extends NamedNodeBase { type: SyntaxType.TypeHint; - typeNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; - valueNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + typeNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; + valueNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; } export interface TypeVariableDeclarationNode extends NamedNodeBase { type: SyntaxType.TypeVariableDeclaration; - constraintNodes: (AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode)[]; + constraintNodes: (AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode)[]; nameNode: TypeVariableDeclarationNameNode; } -export interface TypeofNode extends NamedNodeBase { - type: SyntaxType.Typeof; - valueNode: BooleanNode | IdentifierNode | NumberNode | RegexNode | StringNode; -} - -export interface UnionTypeNode extends NamedNodeBase { - type: SyntaxType.UnionType; - leftNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; - rightNode: AccessTypeNode | ConditionalTypeNode | CurriedTypeNode | IntersectionTypeNode | KeyofNode | LabeledTypeNode | ListTypeNode | MapTypeNode | OptionalTypeNode | ParametricTypeNode | RefinementTypeNode | RefinementTypeDeclarationNode | StructTypeNode | SubtractionTypeNode | TaggedTypeNode | TupleTypeNode | TypeGroupNode | TypeofNode | UnionTypeNode; -} - export interface WhenNode extends NamedNodeBase { type: SyntaxType.When; - bodyNode: AbstractionNode | AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | ExportNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | LeftSectionNode | ListNode | ListComprehensionNode | NumberNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeAliasNode | TypeHintNode; + bodyNode: AccessNode | ApplicationNode | AssignmentNode | BlockNode | BooleanNode | CaseNode | ClassNode | DataNode | ExportNode | FunctionNode | FunctionTypeNode | GroupNode | HoleNode | IdentifierNode | IfNode | InfixApplicationNode | InstanceNode | KeyofTypeNode | LeftSectionNode | ListNode | ListComprehensionNode | MapTypeNode | NumberNode | OptionalTypeNode | ParametricTypeInstanceNode | PureNode | RegexNode | ReturnNode | RightSectionNode | StringNode | StructNode | TernaryNode | TupleNode | TypeNode | TypeHintNode; patternNodes: (BooleanNode | DestructuringPatternNode | IdentifierPatternNode | NumberNode | PatternGroupNode | RawStringNode | RegexNode | TaggedPatternNode | WildcardPatternNode)[]; }