File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -145,3 +145,33 @@ fn test_create_table_in_generic_function() {
145145
146146 queue.conn.close ()!
147147}
148+
149+ // Test inserting from within a generic function
150+ // This tests the fix for the "cannot use `Message` as `Message[Payload]`" error
151+ pub fn (mut q Queue[T]) add_message (data string ) ! GenericMessage[T] {
152+ msg := GenericMessage[T]{
153+ data: data
154+ }
155+ sql q.conn {
156+ insert msg into GenericMessage[T]
157+ }!
158+ return msg
159+ }
160+
161+ fn test_insert_in_generic_function () {
162+ mut queue := create_queue[Payload](':memory:' )!
163+
164+ // Insert from within a generic function
165+ msg := queue.add_message ('inserted from generic fn' )!
166+ assert msg.data == 'inserted from generic fn'
167+
168+ // Verify it was inserted
169+ messages := sql queue.conn {
170+ select from GenericMessage[Payload]
171+ }!
172+
173+ assert messages.len == 1
174+ assert messages[0 ].data == 'inserted from generic fn'
175+
176+ queue.conn.close ()!
177+ }
Original file line number Diff line number Diff line change @@ -277,6 +277,13 @@ fn (mut c Checker) sql_stmt_line(mut node ast.SqlStmtLine) ast.Type {
277277 inserting_object_type = inserting_object.typ.deref ()
278278 }
279279
280+ // Resolve generic inserting object type if we're inside a generic function context
281+ if inserting_object_type.has_flag (.generic) && c.table.cur_fn != unsafe { nil }
282+ && c.table.cur_fn.generic_names.len > 0 && c.table.cur_concrete_types.len > 0 {
283+ inserting_object_type = c.table.unwrap_generic_type (inserting_object_type,
284+ c.table.cur_fn.generic_names, c.table.cur_concrete_types)
285+ }
286+
280287 if inserting_object_type != node.table_expr.typ
281288 && ! c.table.sumtype_has_variant (inserting_object_type, node.table_expr.typ, false ) {
282289 table_name := table_sym.name
You can’t perform that action at this time.
0 commit comments