@@ -201,6 +201,21 @@ string_view nodeKindToString(const pm_node_t *node) {
201201 }
202202}
203203
204+ // Get the NameRef for an anonymous parameter node
205+ core::NameRef anonymousParamName (core::MutableContext ctx, const pm_node_t *node) {
206+ switch (PM_NODE_TYPE (node)) {
207+ case PM_REST_PARAMETER_NODE:
208+ return core::Names::star ();
209+ case PM_KEYWORD_REST_PARAMETER_NODE:
210+ return core::Names::starStar ();
211+ case PM_BLOCK_PARAMETER_NODE:
212+ return core::Names::ampersand ();
213+ default :
214+ ENFORCE (false , " Unexpected anonymous parameter node type" );
215+ return core::NameRef::noName ();
216+ }
217+ }
218+
204219optional<core::AutocorrectSuggestion> autocorrectArg (core::MutableContext ctx, pm_node_t *methodArg, RBSArg arg,
205220 const parser::Prism::Parser &prismParser,
206221 const RBSDeclaration &declaration) {
@@ -624,7 +639,13 @@ pm_node_t *MethodTypeToParserNodePrism::methodSignature(pm_node_t *methodDef, co
624639 pm_node_t *methodParam = methodParams[i];
625640 if (!checkParameterKindMatch (arg, methodParam)) {
626641 if (auto e = ctx.beginIndexerError (arg.loc , core::errors::Rewriter::RBSIncorrectParameterKind)) {
627- auto methodParamNameStr = prismParser.resolveConstant (getParamName (methodParams[i]));
642+ auto paramNameId = getParamName (methodParams[i]);
643+ string_view methodParamNameStr;
644+ if (paramNameId != PM_CONSTANT_ID_UNSET) {
645+ methodParamNameStr = prismParser.resolveConstant (paramNameId);
646+ } else {
647+ methodParamNameStr = anonymousParamName (ctx, methodParam).shortName (ctx.state );
648+ }
628649 e.setHeader (" Argument kind mismatch for `{}`, method declares `{}`, but RBS signature declares `{}`" ,
629650 methodParamNameStr, nodeKindToString (methodParam), argKindToString (arg.kind ));
630651
@@ -641,11 +662,12 @@ pm_node_t *MethodTypeToParserNodePrism::methodSignature(pm_node_t *methodDef, co
641662 auto *methodParam = methodParams[i];
642663 auto methodParamName = getParamName (methodParam);
643664
644- // Special case: anonymous block parameter (&) should use symbol :&
645- if (arg.kind == RBSArg::Kind::Block && methodParamName == PM_CONSTANT_ID_UNSET) {
646- symbolNode = prism.Symbol (tinyLocOffsets, " &" sv);
647- } else {
665+ if (methodParamName != PM_CONSTANT_ID_UNSET) {
648666 symbolNode = prism.SymbolFromConstant (tinyLocOffsets, methodParamName);
667+ } else {
668+ // Anonymous parameter - use the canonical name (*, **, &)
669+ auto name = anonymousParamName (ctx, methodParam);
670+ symbolNode = prism.Symbol (tinyLocOffsets, name.shortName (ctx.state ));
649671 }
650672 }
651673
0 commit comments