Skip to content

Commit 1d4ca54

Browse files
committed
feat: generalize module exprs and first-class modules
1 parent a58ada0 commit 1d4ca54

File tree

2 files changed

+57
-43
lines changed

2 files changed

+57
-43
lines changed

grammar.js

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ module.exports = grammar({
100100
[$._switch_value_pattern, $._parenthesized_pattern],
101101
[$.variant_declaration],
102102
[$.unit, $._function_type_parameter_list],
103+
[$._module_definition, $.parenthesized_module_expression],
104+
[$.functor_parameter, $.module_primary_expression, $.module_identifier_path],
103105
],
104106

105107
rules: {
@@ -159,10 +161,7 @@ module.exports = grammar({
159161

160162
include_statement: $ => seq(
161163
'include',
162-
choice(
163-
$.module_expression,
164-
seq('(', choice($.module_expression, $.functor_parameter), ')')
165-
),
164+
$.module_expression,
166165
),
167166

168167
declaration: $ => choice(
@@ -219,7 +218,6 @@ module.exports = grammar({
219218
':',
220219
choice(
221220
$.module_expression,
222-
seq('(', $.module_expression, ')'),
223221
$.block,
224222
)
225223
),
@@ -740,7 +738,10 @@ module.exports = grammar({
740738
module_pack: $ => seq(
741739
'module',
742740
'(',
743-
$._module_definition,
741+
choice(
742+
$.type_identifier_path,
743+
$._module_definition,
744+
),
744745
optional($.module_type_annotation),
745746
')'
746747
),
@@ -1250,18 +1251,25 @@ module.exports = grammar({
12501251

12511252
module_expression: $ => choice(
12521253
$.module_primary_expression,
1253-
$.type_identifier_path,
12541254
$.module_type_of,
12551255
$.module_type_constraint,
12561256
),
12571257

12581258
module_primary_expression: $ => choice(
1259+
$.parenthesized_module_expression,
12591260
$.module_identifier,
12601261
$.module_identifier_path,
12611262
$.functor_use,
12621263
$.module_unpack,
12631264
),
12641265

1266+
parenthesized_module_expression: $ => seq(
1267+
'(',
1268+
$.module_expression,
1269+
optional($.module_type_annotation),
1270+
')',
1271+
),
1272+
12651273
module_identifier_path: $ => path(
12661274
$.module_primary_expression,
12671275
$.module_identifier,

test/corpus/modules.txt

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -54,21 +54,23 @@ include module type of {
5454
(module_type_of
5555
(module_identifier_path (module_identifier) (module_identifier))))
5656
(include_statement
57-
(module_type_of
58-
(module_identifier_path (module_identifier) (module_identifier))))
57+
(parenthesized_module_expression
58+
(module_type_of
59+
(module_identifier_path (module_identifier) (module_identifier)))))
5960

6061
(include_statement
61-
(functor_parameter (module_identifier)
62-
(module_type_annotation
63-
(module_type_constraint
64-
(module_type_of (module_identifier))
65-
(constrain_module
66-
(module_identifier)
67-
(module_identifier_path (module_identifier) (module_identifier)))
68-
(constrain_module
69-
(module_identifier)
70-
(module_identifier_path (module_identifier)
71-
(module_identifier)))))))
62+
(parenthesized_module_expression
63+
(module_identifier)
64+
(module_type_annotation
65+
(module_type_constraint
66+
(module_type_of (module_identifier))
67+
(constrain_module
68+
(module_identifier)
69+
(module_identifier_path (module_identifier) (module_identifier)))
70+
(constrain_module
71+
(module_identifier)
72+
(module_identifier_path (module_identifier)
73+
(module_identifier)))))))
7274

7375
(include_statement
7476
(module_type_of
@@ -479,34 +481,38 @@ module M = (Na: N, Nb: N): (
479481
(type_identifier))))))
480482

481483
(module_declaration
482-
(module_identifier)
483-
(functor
484-
(functor_parameters)
485-
(module_type_annotation
486-
(module_type_constraint
487-
(module_identifier)
488-
(constrain_type
489-
(type_identifier)
490-
(type_identifier))))
491-
(block)))
484+
name: (module_identifier)
485+
definition: (functor
486+
parameters: (functor_parameters)
487+
return_module_type: (module_type_annotation
488+
(parenthesized_module_expression
489+
(module_type_constraint
490+
(module_identifier)
491+
(constrain_type
492+
(type_identifier)
493+
(type_identifier)))))
494+
body: (block)))
492495

493496
(module_declaration
494-
(module_identifier)
495-
(functor
496-
(functor_parameters
497+
name: (module_identifier)
498+
definition: (functor
499+
parameters: (functor_parameters
497500
(functor_parameter
498501
(module_identifier)
499502
(module_type_annotation (module_identifier)))
500503
(functor_parameter
501504
(module_identifier)
502505
(module_type_annotation (module_identifier))))
503-
(module_type_annotation
504-
(module_type_constraint
505-
(module_identifier)
506-
(constrain_type
507-
(type_identifier)
508-
(type_identifier))
509-
(constrain_type
510-
(type_identifier)
511-
(type_identifier))))
512-
(block))))
506+
return_module_type: (module_type_annotation
507+
(parenthesized_module_expression
508+
(module_type_constraint
509+
(parenthesized_module_expression
510+
(module_type_constraint
511+
(module_identifier)
512+
(constrain_type
513+
(type_identifier)
514+
(type_identifier))))
515+
(constrain_type
516+
(type_identifier)
517+
(type_identifier)))))
518+
body: (block))))

0 commit comments

Comments
 (0)