Skip to content

Commit ba5977a

Browse files
committed
More flip flop flags
Whenever you see a `not` or a `!`, the receiver of that method should potentially be marked as a flip-flop.
1 parent 9171a95 commit ba5977a

File tree

6 files changed

+101
-6
lines changed

6 files changed

+101
-6
lines changed

src/yarp.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,16 @@ yp_flip_flop(yp_node_t *node) {
447447
yp_flip_flop(cast->right);
448448
break;
449449
}
450+
case YP_NODE_PARENTHESES_NODE: {
451+
yp_parentheses_node_t *cast = (yp_parentheses_node_t *) node;
452+
453+
if ((cast->statements != NULL) && YP_NODE_TYPE_P(cast->statements, YP_NODE_STATEMENTS_NODE)) {
454+
yp_statements_node_t *statements = (yp_statements_node_t *) cast->statements;
455+
if (statements->body.size == 1) yp_flip_flop(statements->body.nodes[0]);
456+
}
457+
458+
break;
459+
}
450460
case YP_NODE_RANGE_NODE: {
451461
yp_range_node_t *cast = (yp_range_node_t *) node;
452462
cast->flags |= YP_RANGE_NODE_FLAGS_FLIP_FLOP;
@@ -11374,6 +11384,7 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
1137411384
arguments.closing_loc = ((yp_location_t) { .start = parser->previous.start, .end = parser->previous.end });
1137511385
} else {
1137611386
receiver = parse_expression(parser, YP_BINDING_POWER_COMPOSITION, "Expected expression after `not`.");
11387+
yp_flip_flop(receiver);
1137711388

1137811389
if (!parser->recovering) {
1137911390
accept(parser, YP_TOKEN_NEWLINE);
@@ -11383,6 +11394,7 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
1138311394
}
1138411395
} else {
1138511396
receiver = parse_expression(parser, YP_BINDING_POWER_DEFINED, "Expected expression after `not`.");
11397+
yp_flip_flop(receiver);
1138611398
}
1138711399

1138811400
return (yp_node_t *) yp_call_node_not_create(parser, receiver, &message, &arguments);
@@ -11960,6 +11972,7 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
1196011972
yp_node_t *receiver = parse_expression(parser, yp_binding_powers[parser->previous.type].right, "Expected a receiver after unary !.");
1196111973
yp_call_node_t *node = yp_call_node_unary_create(parser, &operator, receiver, "!");
1196211974

11975+
yp_flip_flop(receiver);
1196311976
return (yp_node_t *) node;
1196411977
}
1196511978
case YP_TOKEN_TILDE: {

test/fixtures/not.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,7 @@ foo
3131

3232

3333
)
34+
35+
not foo .. bar
36+
37+
not (foo .. bar)

test/snapshots/not.txt

Lines changed: 80 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/snapshots/unparser/corpus/literal/flipflop.txt

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/snapshots/whitequark/cond_eflipflop.txt

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/snapshots/whitequark/cond_iflipflop.txt

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)