diff --git a/main/pipeline/pipeline.cc b/main/pipeline/pipeline.cc index d6664a9c3bd..6a997a20525 100644 --- a/main/pipeline/pipeline.cc +++ b/main/pipeline/pipeline.cc @@ -173,8 +173,28 @@ const unique_ptr convertPrismToSorbet(pm_node_t *node, pm_parser_t return make_unique(locOffset(loc, parser), std::to_string(intNode->value.value)); } case PM_PROGRAM_NODE: { - pm_statements_node *stmts = (reinterpret_cast(node))->statements; - return convertPrismToSorbet((pm_node *)stmts, parser, gs); + pm_program_node *programNode = reinterpret_cast(node); + pm_statements_node *stmts = programNode->statements; + + auto size = stmts->body.size; + + // For a single statement, do not create a Begin node and just return the statement + if (size == 1) { + return convertPrismToSorbet((pm_node *)stmts->body.nodes[0], parser, gs); + } + + // For multiple statements, convert each statement and add them to the body of a Begin node + parser::NodeVec sorbetStmts; + + for (int i = 0; i < stmts->body.size; i++) { + pm_node_t *node = stmts->body.nodes[i]; + unique_ptr convertedStmt = convertPrismToSorbet(node, parser, gs); + sorbetStmts.emplace_back(std::move(convertedStmt)); + } + + auto *loc = &programNode->base.location; + + return make_unique(locOffset(loc, parser), std::move(sorbetStmts)); } case PM_RATIONAL_NODE: { auto *rationalNode = reinterpret_cast(node); @@ -190,11 +210,7 @@ const unique_ptr convertPrismToSorbet(pm_node_t *node, pm_parser_t break; } case PM_STATEMENTS_NODE: { - pm_node_list *body = &(reinterpret_cast(node))->body; - // TODO: Handle multiple statements - pm_node *first = body->nodes[0]; - - return convertPrismToSorbet(first, parser, gs); + Exception::raise("Handling for statements node should be performed in program node"); } case PM_STRING_NODE: { auto strNode = reinterpret_cast(node); diff --git a/test/prism_regression/multi_statements.parse-tree.exp b/test/prism_regression/multi_statements.parse-tree.exp new file mode 100644 index 00000000000..4dab2e360f5 --- /dev/null +++ b/test/prism_regression/multi_statements.parse-tree.exp @@ -0,0 +1,13 @@ +Begin { + stmts = [ + Integer { + val = "42" + } + String { + val = + } + Rational { + val = "1.0" + } + ] +} diff --git a/test/prism_regression/multi_statements.rb b/test/prism_regression/multi_statements.rb new file mode 100644 index 00000000000..d567720ab32 --- /dev/null +++ b/test/prism_regression/multi_statements.rb @@ -0,0 +1,5 @@ +# typed: true + +42 +"hello" +1.0r