Skip to content

Commit 4ae8f69

Browse files
authored
Merge pull request #191 from Shopify/Alex/translate-local-vars
Implement Prism -> Sorbet translation for local variables
2 parents b6d9981 + 28c552e commit 4ae8f69

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed

parser/prism/Translator.cc

+19-2
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,25 @@ std::unique_ptr<parser::Node> Translator::translate(pm_node_t *node) {
282282

283283
return make_unique<parser::Kwrestarg>(parser.translateLocation(loc), gs.enterNameUTF8(name));
284284
}
285+
case PM_LOCAL_VARIABLE_READ_NODE: {
286+
auto localVarReadNode = reinterpret_cast<pm_local_variable_read_node *>(node);
287+
pm_location_t *loc = &localVarReadNode->base.location;
288+
289+
std::string_view name = parser.resolveConstant(localVarReadNode->name);
290+
291+
return make_unique<parser::LVar>(parser.translateLocation(loc), gs.enterNameUTF8(name));
292+
}
293+
case PM_LOCAL_VARIABLE_WRITE_NODE: {
294+
auto localVarWriteNode = reinterpret_cast<pm_local_variable_write_node *>(node);
295+
pm_location_t *loc = &localVarWriteNode->base.location;
296+
pm_location_t *nameLoc = &localVarWriteNode->name_loc;
297+
298+
auto name = parser.resolveConstant(localVarWriteNode->name);
299+
auto lhs = make_unique<parser::LVarLhs>(parser.translateLocation(nameLoc), gs.enterNameUTF8(name));
300+
auto rhs = translate(localVarWriteNode->value);
301+
302+
return make_unique<parser::Assign>(parser.translateLocation(loc), std::move(lhs), std::move(rhs));
303+
}
285304
case PM_MODULE_NODE: { // Modules declarations, like `module A::B::C; ...; end`
286305
auto moduleNode = reinterpret_cast<pm_module_node *>(node);
287306
pm_location_t *loc = &moduleNode->base.location;
@@ -620,9 +639,7 @@ std::unique_ptr<parser::Node> Translator::translate(pm_node_t *node) {
620639
case PM_LOCAL_VARIABLE_AND_WRITE_NODE:
621640
case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE:
622641
case PM_LOCAL_VARIABLE_OR_WRITE_NODE:
623-
case PM_LOCAL_VARIABLE_READ_NODE:
624642
case PM_LOCAL_VARIABLE_TARGET_NODE:
625-
case PM_LOCAL_VARIABLE_WRITE_NODE:
626643
case PM_MATCH_LAST_LINE_NODE:
627644
case PM_MATCH_PREDICATE_NODE:
628645
case PM_MATCH_REQUIRED_NODE:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
Begin {
2+
stmts = [
3+
Assign {
4+
lhs = LVarLhs {
5+
name = <U local_variable1>
6+
}
7+
rhs = Integer {
8+
val = "123"
9+
}
10+
}
11+
Assign {
12+
lhs = LVarLhs {
13+
name = <U local_variable2>
14+
}
15+
rhs = Send {
16+
receiver = NULL
17+
method = <U this_is_a_method_call>
18+
args = [
19+
]
20+
}
21+
}
22+
Assign {
23+
lhs = LVarLhs {
24+
name = <U local_variable2>
25+
}
26+
rhs = LVar {
27+
name = <U local_variable1>
28+
}
29+
}
30+
]
31+
}
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# typed: true
2+
3+
local_variable1 = 123
4+
5+
local_variable2 = this_is_a_method_call
6+
# ^^^^^^^^^^^^^^^^^^^^^ error: Method `this_is_a_method_call` does not exist on `T.class_of(<root>)`
7+
8+
local_variable2 = local_variable1 # should parse as local variable lookup

0 commit comments

Comments
 (0)