Skip to content

Commit b57aa85

Browse files
authored
Merge pull request #233 from Shopify/emily/op-assigns
Implement Sorbet -> Prism translations for op assigns for local and instance variables
2 parents ea5e6f4 + a54cbe2 commit b57aa85

5 files changed

+294
-6
lines changed

parser/prism/Translator.cc

+18-6
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,15 @@ std::unique_ptr<parser::Node> Translator::translate(pm_node_t *node) {
340340
return make_unique<parser::If>(parser.translateLocation(loc), std::move(predicate), std::move(ifTrue),
341341
std::move(ifFalse));
342342
}
343+
case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
344+
return translateAssignment<pm_instance_variable_and_write_node, parser::AndAsgn, parser::IVarLhs>(node);
345+
}
346+
case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
347+
return translateAssignment<pm_instance_variable_operator_write_node, parser::OpAsgn, parser::IVarLhs>(node);
348+
}
349+
case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
350+
return translateAssignment<pm_instance_variable_or_write_node, parser::OrAsgn, parser::IVarLhs>(node);
351+
}
343352
case PM_INSTANCE_VARIABLE_READ_NODE: {
344353
auto instanceVarNode = reinterpret_cast<pm_instance_variable_read_node *>(node);
345354
pm_location_t *loc = &instanceVarNode->base.location;
@@ -386,6 +395,15 @@ std::unique_ptr<parser::Node> Translator::translate(pm_node_t *node) {
386395

387396
return make_unique<parser::Kwrestarg>(parser.translateLocation(loc), gs.enterNameUTF8(name));
388397
}
398+
case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
399+
return translateAssignment<pm_local_variable_and_write_node, parser::AndAsgn, parser::LVarLhs>(node);
400+
}
401+
case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
402+
return translateAssignment<pm_local_variable_operator_write_node, parser::OpAsgn, parser::LVarLhs>(node);
403+
}
404+
case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
405+
return translateAssignment<pm_local_variable_or_write_node, parser::OrAsgn, parser::LVarLhs>(node);
406+
}
389407
case PM_LOCAL_VARIABLE_READ_NODE: {
390408
auto localVarReadNode = reinterpret_cast<pm_local_variable_read_node *>(node);
391409
pm_location_t *loc = &localVarReadNode->base.location;
@@ -810,9 +828,6 @@ std::unique_ptr<parser::Node> Translator::translate(pm_node_t *node) {
810828
case PM_INDEX_OPERATOR_WRITE_NODE:
811829
case PM_INDEX_OR_WRITE_NODE:
812830
case PM_INDEX_TARGET_NODE:
813-
case PM_INSTANCE_VARIABLE_AND_WRITE_NODE:
814-
case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE:
815-
case PM_INSTANCE_VARIABLE_OR_WRITE_NODE:
816831
case PM_INSTANCE_VARIABLE_TARGET_NODE:
817832
case PM_INTERPOLATED_MATCH_LAST_LINE_NODE:
818833
case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE:
@@ -821,9 +836,6 @@ std::unique_ptr<parser::Node> Translator::translate(pm_node_t *node) {
821836
case PM_IT_LOCAL_VARIABLE_READ_NODE:
822837
case PM_IT_PARAMETERS_NODE:
823838
case PM_LAMBDA_NODE:
824-
case PM_LOCAL_VARIABLE_AND_WRITE_NODE:
825-
case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE:
826-
case PM_LOCAL_VARIABLE_OR_WRITE_NODE:
827839
case PM_MATCH_LAST_LINE_NODE:
828840
case PM_MATCH_PREDICATE_NODE:
829841
case PM_MATCH_REQUIRED_NODE:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
Begin {
2+
stmts = [
3+
Assign {
4+
lhs = IVarLhs {
5+
name = <U @regular>
6+
}
7+
rhs = Integer {
8+
val = "1"
9+
}
10+
}
11+
OpAsgn {
12+
left = IVarLhs {
13+
name = <U @bitwise_and>
14+
}
15+
op = <U &>
16+
right = Integer {
17+
val = "2"
18+
}
19+
}
20+
OpAsgn {
21+
left = IVarLhs {
22+
name = <U @bitwise_xor>
23+
}
24+
op = <U ^>
25+
right = Integer {
26+
val = "4"
27+
}
28+
}
29+
OpAsgn {
30+
left = IVarLhs {
31+
name = <U @shift_right>
32+
}
33+
op = <U >>>
34+
right = Integer {
35+
val = "5"
36+
}
37+
}
38+
OpAsgn {
39+
left = IVarLhs {
40+
name = <U @shift_left>
41+
}
42+
op = <U <<>
43+
right = Integer {
44+
val = "6"
45+
}
46+
}
47+
OpAsgn {
48+
left = IVarLhs {
49+
name = <U @subtract_assign>
50+
}
51+
op = <U ->
52+
right = Integer {
53+
val = "7"
54+
}
55+
}
56+
OpAsgn {
57+
left = IVarLhs {
58+
name = <U @module_assign>
59+
}
60+
op = <U %>
61+
right = Integer {
62+
val = "8"
63+
}
64+
}
65+
OpAsgn {
66+
left = IVarLhs {
67+
name = <U @bitwise_or>
68+
}
69+
op = <U |>
70+
right = Integer {
71+
val = "9"
72+
}
73+
}
74+
OpAsgn {
75+
left = IVarLhs {
76+
name = <U @divide_assign>
77+
}
78+
op = <U />
79+
right = Integer {
80+
val = "10"
81+
}
82+
}
83+
OpAsgn {
84+
left = IVarLhs {
85+
name = <U @multiply_assign>
86+
}
87+
op = <U *>
88+
right = Integer {
89+
val = "11"
90+
}
91+
}
92+
OpAsgn {
93+
left = IVarLhs {
94+
name = <U @exponentiate_assign>
95+
}
96+
op = <U **>
97+
right = Integer {
98+
val = "12"
99+
}
100+
}
101+
AndAsgn {
102+
left = IVarLhs {
103+
name = <U @lazy_and_assign>
104+
}
105+
right = Integer {
106+
val = "13"
107+
}
108+
}
109+
OrAsgn {
110+
left = IVarLhs {
111+
name = <U @lazy_or_assgin>
112+
}
113+
right = Integer {
114+
val = "14"
115+
}
116+
}
117+
]
118+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# typed: false
2+
3+
# Regular assignment
4+
@regular = 1
5+
6+
# Compound assignment operators
7+
@bitwise_and &= 2
8+
@bitwise_xor ^= 4
9+
@shift_right >>= 5
10+
@shift_left <<= 6
11+
@subtract_assign -= 7
12+
@module_assign %= 8
13+
@bitwise_or |= 9
14+
@divide_assign /= 10
15+
@multiply_assign *= 11
16+
@exponentiate_assign **= 12
17+
18+
# Special cases
19+
@lazy_and_assign &&= 13
20+
@lazy_or_assgin ||= 14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
Begin {
2+
stmts = [
3+
Assign {
4+
lhs = LVarLhs {
5+
name = <U regular>
6+
}
7+
rhs = Integer {
8+
val = "1"
9+
}
10+
}
11+
OpAsgn {
12+
left = LVarLhs {
13+
name = <U bitwise_and>
14+
}
15+
op = <U &>
16+
right = Integer {
17+
val = "2"
18+
}
19+
}
20+
OpAsgn {
21+
left = LVarLhs {
22+
name = <U bitwise_xor>
23+
}
24+
op = <U ^>
25+
right = Integer {
26+
val = "4"
27+
}
28+
}
29+
OpAsgn {
30+
left = LVarLhs {
31+
name = <U shift_right>
32+
}
33+
op = <U >>>
34+
right = Integer {
35+
val = "5"
36+
}
37+
}
38+
OpAsgn {
39+
left = LVarLhs {
40+
name = <U shift_left>
41+
}
42+
op = <U <<>
43+
right = Integer {
44+
val = "6"
45+
}
46+
}
47+
OpAsgn {
48+
left = LVarLhs {
49+
name = <U subtract_assign>
50+
}
51+
op = <U ->
52+
right = Integer {
53+
val = "7"
54+
}
55+
}
56+
OpAsgn {
57+
left = LVarLhs {
58+
name = <U module_assign>
59+
}
60+
op = <U %>
61+
right = Integer {
62+
val = "8"
63+
}
64+
}
65+
OpAsgn {
66+
left = LVarLhs {
67+
name = <U bitwise_or>
68+
}
69+
op = <U |>
70+
right = Integer {
71+
val = "9"
72+
}
73+
}
74+
OpAsgn {
75+
left = LVarLhs {
76+
name = <U divide_assign>
77+
}
78+
op = <U />
79+
right = Integer {
80+
val = "10"
81+
}
82+
}
83+
OpAsgn {
84+
left = LVarLhs {
85+
name = <U multiply_assign>
86+
}
87+
op = <U *>
88+
right = Integer {
89+
val = "11"
90+
}
91+
}
92+
OpAsgn {
93+
left = LVarLhs {
94+
name = <U exponentiate_assign>
95+
}
96+
op = <U **>
97+
right = Integer {
98+
val = "12"
99+
}
100+
}
101+
AndAsgn {
102+
left = LVarLhs {
103+
name = <U lazy_and_assign>
104+
}
105+
right = Integer {
106+
val = "13"
107+
}
108+
}
109+
OrAsgn {
110+
left = LVarLhs {
111+
name = <U lazy_or_assgin>
112+
}
113+
right = Integer {
114+
val = "14"
115+
}
116+
}
117+
]
118+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# typed: false
2+
3+
# Regular assignment
4+
regular = 1
5+
6+
# Compound assignment operators
7+
bitwise_and &= 2
8+
bitwise_xor ^= 4
9+
shift_right >>= 5
10+
shift_left <<= 6
11+
subtract_assign -= 7
12+
module_assign %= 8
13+
bitwise_or |= 9
14+
divide_assign /= 10
15+
multiply_assign *= 11
16+
exponentiate_assign **= 12
17+
18+
# Special cases
19+
lazy_and_assign &&= 13
20+
lazy_or_assgin ||= 14

0 commit comments

Comments
 (0)