Skip to content

Commit 02fd9c0

Browse files
committed
[checkpoint] Fix NumParams location for lambdas
1 parent f80ea00 commit 02fd9c0

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

parser/prism/Translator.cc

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4459,20 +4459,45 @@ ast::ExpressionPtr Translator::desugarHash(core::LocOffsets loc, NodeVec &kvPair
44594459
// or `pm_lambda_node *`, and wrapping it around the given `Send` node.
44604460
unique_ptr<parser::Node> Translator::translateCallWithBlock(pm_node_t *prismBlockOrLambdaNode,
44614461
unique_ptr<parser::Node> sendNode) {
4462-
unique_ptr<parser::Node> parametersNode;
4462+
pm_node_t *prismParametersNode;
44634463
unique_ptr<parser::Node> body;
44644464
auto blockLoc = translateLoc(prismBlockOrLambdaNode->location);
44654465
if (PM_NODE_TYPE_P(prismBlockOrLambdaNode, PM_BLOCK_NODE)) {
44664466
auto prismBlockNode = down_cast<pm_block_node>(prismBlockOrLambdaNode);
4467-
parametersNode = translate(prismBlockNode->parameters);
4467+
prismParametersNode = prismBlockNode->parameters;
44684468
body = this->enterBlockContext().translate(prismBlockNode->body);
44694469
} else {
44704470
ENFORCE(PM_NODE_TYPE_P(prismBlockOrLambdaNode, PM_LAMBDA_NODE))
44714471
auto prismLambdaNode = down_cast<pm_lambda_node>(prismBlockOrLambdaNode);
4472-
parametersNode = translate(prismLambdaNode->parameters);
4472+
prismParametersNode = prismLambdaNode->parameters; // need to change location here.
44734473
body = this->enterBlockContext().translate(prismLambdaNode->body);
44744474
}
44754475

4476+
unique_ptr<parser::Node> parametersNode;
4477+
if (prismParametersNode != nullptr) {
4478+
switch (PM_NODE_TYPE(prismParametersNode)) {
4479+
case PM_NUMBERED_PARAMETERS_NODE: {
4480+
if (PM_NODE_TYPE_P(prismBlockOrLambdaNode, PM_BLOCK_NODE)) {
4481+
auto prismBlockNode = down_cast<pm_block_node>(prismBlockOrLambdaNode);
4482+
parametersNode = translate(prismBlockNode->parameters);
4483+
} else {
4484+
ENFORCE(PM_NODE_TYPE_P(prismBlockOrLambdaNode, PM_LAMBDA_NODE))
4485+
auto prismLambdaNode = down_cast<pm_lambda_node>(prismBlockOrLambdaNode);
4486+
prismLambdaNode->parameters->location = (pm_location_t){.start = prismLambdaNode->operator_loc.end,
4487+
.end = prismLambdaNode->operator_loc.end};
4488+
parametersNode = translate(prismLambdaNode->parameters);
4489+
body = this->enterBlockContext().translate(prismLambdaNode->body);
4490+
}
4491+
4492+
break;
4493+
}
4494+
default: {
4495+
parametersNode = translate(prismParametersNode);
4496+
break;
4497+
}
4498+
}
4499+
}
4500+
44764501
// Modify send node's endLoc to be position before first space
44774502
// This fixes location for cases like:
44784503
// Module.new do

test/prism_regression/lambda.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,6 @@ def method_returning_lambda
2323
end
2424

2525
# Empty lambda parameters
26-
->() { 1 + 2 }
26+
->() { 1 }
27+
-> (){ 2 }
28+
-> () { 3 }

0 commit comments

Comments
 (0)