@@ -205,5 +205,42 @@ TEST(AstTest, ToStringCastWithinLtComparison) {
205205 EXPECT_EQ (lt->ToString (), " (x as t) < x" );
206206}
207207
208+ TEST (AstTest, GetFuncParam) {
209+ // Create an empty function
210+ // fn f(p: u32) -> u32 {}
211+
212+ FileTable file_table;
213+ const Span fake_span;
214+ Module m (" test" , /* fs_path=*/ std::nullopt , file_table);
215+
216+ BuiltinNameDef* builtin_name_def = m.GetOrCreateBuiltinNameDef (" u32" );
217+ BuiltinTypeAnnotation* u32_type_annotation = m.Make <BuiltinTypeAnnotation>(
218+ fake_span, BuiltinType::kU32 , builtin_name_def);
219+
220+ NameDef* func_name_def =
221+ m.Make <NameDef>(fake_span, std::string (" f" ), nullptr );
222+ NameDef* param_name_def =
223+ m.Make <NameDef>(fake_span, std::string (" p" ), nullptr );
224+
225+ std::vector<Param*> params;
226+ params.push_back (m.Make <Param>(param_name_def, u32_type_annotation));
227+
228+ std::vector<ParametricBinding*> parametric_bindings;
229+
230+ StatementBlock* block =
231+ m.Make <StatementBlock>(fake_span, std::vector<Statement*>{}, true );
232+
233+ Function* f =
234+ m.Make <Function>(fake_span, func_name_def, parametric_bindings, params,
235+ u32_type_annotation, block, FunctionTag::kNormal , false );
236+
237+ XLS_ASSERT_OK_AND_ASSIGN (Param * found_param, f->GetParamByName (" p" ));
238+ EXPECT_EQ (found_param, params[0 ]);
239+
240+ EXPECT_THAT (f->GetParamByName (" not_a_param" ),
241+ StatusIs (absl::StatusCode::kNotFound ,
242+ HasSubstr (" Param 'not_a_param' not a parameter" )));
243+ }
244+
208245} // namespace
209246} // namespace xls::dslx
0 commit comments