Skip to content

Commit 030c543

Browse files
authored
Merge pull request #146 from nkrkv/refactor-simplify-module-expressions
Generalize module exprs and first-class modules
2 parents a58ada0 + 5db67b5 commit 030c543

File tree

2 files changed

+68
-52
lines changed

2 files changed

+68
-52
lines changed

grammar.js

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ module.exports = grammar({
2727
$.module_primary_expression,
2828
],
2929

30+
inline: $ => [
31+
$._module_definition,
32+
],
33+
3034
precedences: $ => [
3135
// + - Operators -> precendence
3236
[
@@ -100,6 +104,7 @@ module.exports = grammar({
100104
[$._switch_value_pattern, $._parenthesized_pattern],
101105
[$.variant_declaration],
102106
[$.unit, $._function_type_parameter_list],
107+
[$.functor_parameter, $.module_primary_expression, $.module_identifier_path],
103108
],
104109

105110
rules: {
@@ -159,10 +164,7 @@ module.exports = grammar({
159164

160165
include_statement: $ => seq(
161166
'include',
162-
choice(
163-
$.module_expression,
164-
seq('(', choice($.module_expression, $.functor_parameter), ')')
165-
),
167+
$.module_expression,
166168
),
167169

168170
declaration: $ => choice(
@@ -177,7 +179,7 @@ module.exports = grammar({
177179
'module',
178180
optional('rec'),
179181
optional('type'),
180-
field('name', choice($.module_identifier, $._type_identifier)),
182+
field('name', choice($.module_identifier, $.type_identifier)),
181183
optional(seq(
182184
':',
183185
field('signature', choice($.block, $.module_expression, $.functor)),
@@ -219,7 +221,6 @@ module.exports = grammar({
219221
':',
220222
choice(
221223
$.module_expression,
222-
seq('(', $.module_expression, ')'),
223224
$.block,
224225
)
225226
),
@@ -740,7 +741,10 @@ module.exports = grammar({
740741
module_pack: $ => seq(
741742
'module',
742743
'(',
743-
$._module_definition,
744+
choice(
745+
$.type_identifier_path,
746+
$._module_definition,
747+
),
744748
optional($.module_type_annotation),
745749
')'
746750
),
@@ -1057,8 +1061,8 @@ module.exports = grammar({
10571061
'.',
10581062
optional(seq(
10591063
field('module', $.module_identifier),
1060-
'.')
1061-
),
1064+
'.'
1065+
)),
10621066
field('property', alias($.value_identifier, $.property_identifier)),
10631067
)),
10641068

@@ -1235,12 +1239,11 @@ module.exports = grammar({
12351239
optional(alias($.variant_arguments, $.arguments)),
12361240
)),
12371241

1238-
_type_identifier: $ =>
1239-
choice(
1240-
$.type_identifier,
1241-
$.type_identifier_path,
1242-
".."
1243-
),
1242+
_type_identifier: $ => choice(
1243+
$.type_identifier,
1244+
$.type_identifier_path,
1245+
".."
1246+
),
12441247

12451248
type_identifier_path: $ => seq(
12461249
$.module_primary_expression,
@@ -1250,18 +1253,25 @@ module.exports = grammar({
12501253

12511254
module_expression: $ => choice(
12521255
$.module_primary_expression,
1253-
$.type_identifier_path,
12541256
$.module_type_of,
12551257
$.module_type_constraint,
12561258
),
12571259

12581260
module_primary_expression: $ => choice(
1261+
$.parenthesized_module_expression,
12591262
$.module_identifier,
12601263
$.module_identifier_path,
12611264
$.functor_use,
12621265
$.module_unpack,
12631266
),
12641267

1268+
parenthesized_module_expression: $ => seq(
1269+
'(',
1270+
$.module_expression,
1271+
optional($.module_type_annotation),
1272+
')',
1273+
),
1274+
12651275
module_identifier_path: $ => path(
12661276
$.module_primary_expression,
12671277
$.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)