Skip to content

Commit cc5519c

Browse files
authored
feat(compiler): Support record field updating assignment (#1320)
1 parent c1d8907 commit cc5519c

File tree

6 files changed

+408
-89
lines changed

6 files changed

+408
-89
lines changed

compiler/src/formatting/format.re

Lines changed: 81 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -2348,15 +2348,13 @@ and print_expression =
23482348
print_ident(txt),
23492349
])
23502350
| PExpRecordSet(expression, {txt, _}, expression2) =>
2351-
Doc.concat([
2352-
print_expression(~original_source, ~comments, expression),
2353-
Doc.dot,
2354-
print_ident(txt),
2355-
Doc.space,
2356-
Doc.equal,
2357-
Doc.space,
2358-
print_expression(~original_source, ~comments, expression2),
2359-
])
2351+
let left =
2352+
Doc.concat([
2353+
print_expression(~original_source, ~comments, expression),
2354+
Doc.dot,
2355+
print_ident(txt),
2356+
]);
2357+
print_assignment(~original_source, ~comments, left, expression2);
23602358
| PExpMatch(expression, match_branches) =>
23612359
let arg =
23622360
Doc.concat([
@@ -3100,97 +3098,92 @@ and print_expression =
31003098
print_expression(~original_source, ~comments, expression1),
31013099
])
31023100
| PExpAssign(expression, expression1) =>
3103-
switch (expression1.pexp_desc) {
3104-
| PExpApp(func, expressions) =>
3105-
let function_name = get_function_name(func);
3106-
3107-
let trimmed_operator = String.trim(function_name);
3101+
let left = print_expression(~original_source, ~comments, expression);
3102+
print_assignment(~original_source, ~comments, left, expression1);
3103+
| /** Used for modules without body expressions */ PExpNull => Doc.nil
3104+
};
31083105

3109-
let left = print_expression(~original_source, ~comments, expression);
3106+
expression_doc;
3107+
}
3108+
and print_assignment = (~original_source, ~comments, left, value) => {
3109+
switch (value.pexp_desc) {
3110+
| PExpApp(func, expressions) =>
3111+
let function_name = get_function_name(func);
31103112

3111-
let left_matches_first =
3112-
switch (expressions) {
3113-
| [expr, ...remainder] =>
3114-
print_expression(~original_source, ~comments, expr) == left
3115-
| _ => false
3116-
};
3113+
let trimmed_operator = String.trim(function_name);
31173114

3118-
if (left_matches_first) {
3119-
// +=, -=, *=, /=, and %=
3120-
switch (trimmed_operator) {
3121-
| "+"
3122-
| "-"
3123-
| "*"
3124-
| "/"
3125-
| "%" =>
3126-
let sugared_op = Doc.text(" " ++ trimmed_operator ++ "= ");
3127-
Doc.concat([
3128-
print_expression(~original_source, ~comments, expression),
3129-
sugared_op,
3130-
switch (expressions) {
3131-
| [] =>
3132-
raise(
3133-
IllegalParse("Sugared op needs at least one expression"),
3134-
)
3135-
| [expression] =>
3136-
let expr =
3137-
print_expression(~original_source, ~comments, expression);
3138-
switch (expression.pexp_desc) {
3139-
| PExpIf(_) =>
3140-
Doc.indent(
3141-
print_expression(~original_source, ~comments, expression),
3142-
)
3143-
| _ => expr
3144-
};
3145-
| [expression1, expression2, ...rest] =>
3146-
let expr =
3147-
print_expression(~original_source, ~comments, expression2);
3148-
switch (expression2.pexp_desc) {
3149-
| PExpIf(_) =>
3150-
Doc.indent(
3151-
print_expression(
3152-
~original_source,
3153-
~comments,
3154-
expression2,
3155-
),
3156-
)
3157-
| _ => expr
3158-
};
3159-
},
3160-
]);
3161-
| _ =>
3162-
Doc.concat([
3163-
print_expression(~original_source, ~comments, expression),
3164-
Doc.space,
3165-
Doc.equal,
3166-
Doc.space,
3167-
print_expression(~original_source, ~comments, expression1),
3168-
])
3169-
};
3170-
} else {
3171-
Doc.concat([
3172-
print_expression(~original_source, ~comments, expression),
3173-
Doc.space,
3174-
Doc.equal,
3175-
Doc.space,
3176-
print_expression(~original_source, ~comments, expression1),
3177-
]);
3178-
};
3115+
let left_matches_first =
3116+
switch (expressions) {
3117+
| [expr, ...remainder] =>
3118+
print_expression(~original_source, ~comments, expr) == left
3119+
| _ => false
3120+
};
31793121

3122+
if (left_matches_first) {
3123+
// +=, -=, *=, /=, and %=
3124+
switch (trimmed_operator) {
3125+
| "+"
3126+
| "-"
3127+
| "*"
3128+
| "/"
3129+
| "%" =>
3130+
let sugared_op = Doc.text(" " ++ trimmed_operator ++ "= ");
3131+
Doc.concat([
3132+
left,
3133+
sugared_op,
3134+
switch (expressions) {
3135+
| [] =>
3136+
raise(IllegalParse("Sugared op needs at least one expression"))
3137+
| [expression] =>
3138+
let expr =
3139+
print_expression(~original_source, ~comments, expression);
3140+
switch (expression.pexp_desc) {
3141+
| PExpIf(_) =>
3142+
Doc.indent(
3143+
print_expression(~original_source, ~comments, expression),
3144+
)
3145+
| _ => expr
3146+
};
3147+
| [expression1, expression2, ...rest] =>
3148+
let expr =
3149+
print_expression(~original_source, ~comments, expression2);
3150+
switch (expression2.pexp_desc) {
3151+
| PExpIf(_) =>
3152+
Doc.indent(
3153+
print_expression(~original_source, ~comments, expression2),
3154+
)
3155+
| _ => expr
3156+
};
3157+
},
3158+
]);
31803159
| _ =>
31813160
Doc.concat([
3182-
print_expression(~original_source, ~comments, expression),
3161+
left,
31833162
Doc.space,
31843163
Doc.equal,
31853164
Doc.space,
3186-
print_expression(~original_source, ~comments, expression1),
3165+
print_expression(~original_source, ~comments, value),
31873166
])
3188-
}
3189-
3190-
| /** Used for modules without body expressions */ PExpNull => Doc.nil
3167+
};
3168+
} else {
3169+
Doc.concat([
3170+
left,
3171+
Doc.space,
3172+
Doc.equal,
3173+
Doc.space,
3174+
print_expression(~original_source, ~comments, value),
3175+
]);
31913176
};
31923177

3193-
expression_doc;
3178+
| _ =>
3179+
Doc.concat([
3180+
left,
3181+
Doc.space,
3182+
Doc.equal,
3183+
Doc.space,
3184+
print_expression(~original_source, ~comments, value),
3185+
])
3186+
};
31943187
}
31953188
and print_value_bind =
31963189
(

0 commit comments

Comments
 (0)