@@ -15,6 +15,7 @@ const CrashContext = eval_mod.CrashContext;
1515const BuiltinTypes = eval_mod .BuiltinTypes ;
1616const builtin_loading = eval_mod .builtin_loading ;
1717const collections = @import ("collections" );
18+ const reporting = @import ("reporting" );
1819
1920const AST = parse .AST ;
2021const Allocator = std .mem .Allocator ;
@@ -385,6 +386,53 @@ pub const Repl = struct {
385386 };
386387 defer parse_ast .deinit (self .allocator );
387388
389+ // Check for parse errors and render them
390+ if (parse_ast .hasErrors ()) {
391+ // Render the first error as the error message
392+ if (parse_ast .tokenize_diagnostics .items .len > 0 ) {
393+ var report = try parse_ast .tokenizeDiagnosticToReport (
394+ parse_ast .tokenize_diagnostics .items [0 ],
395+ self .allocator ,
396+ null ,
397+ );
398+ defer report .deinit ();
399+
400+ var output = std .array_list .Managed (u8 ).init (self .allocator );
401+ var unmanaged = output .moveToUnmanaged ();
402+ var writer_alloc = std .Io .Writer .Allocating .fromArrayList (self .allocator , & unmanaged );
403+ report .render (& writer_alloc .writer , .markdown ) catch | err | switch (err ) {
404+ error .WriteFailed = > return error .OutOfMemory ,
405+ else = > return err ,
406+ };
407+ unmanaged = writer_alloc .toArrayList ();
408+ output = unmanaged .toManaged (self .allocator );
409+ return try output .toOwnedSlice ();
410+ } else if (parse_ast .parse_diagnostics .items .len > 0 ) {
411+ var report = try parse_ast .parseDiagnosticToReport (
412+ & module_env .common ,
413+ parse_ast .parse_diagnostics .items [0 ],
414+ self .allocator ,
415+ "repl" ,
416+ );
417+ defer report .deinit ();
418+
419+ var output = std .array_list .Managed (u8 ).init (self .allocator );
420+ var unmanaged = output .moveToUnmanaged ();
421+ var writer_alloc = std .Io .Writer .Allocating .fromArrayList (self .allocator , & unmanaged );
422+ report .render (& writer_alloc .writer , .markdown ) catch | err | switch (err ) {
423+ error .WriteFailed = > return error .OutOfMemory ,
424+ else = > return err ,
425+ };
426+ unmanaged = writer_alloc .toArrayList ();
427+ output = unmanaged .toManaged (self .allocator );
428+ // Trim trailing newlines from the output and return a properly allocated copy
429+ const full_result = try output .toOwnedSlice ();
430+ defer self .allocator .free (full_result );
431+ const trimmed = std .mem .trimRight (u8 , full_result , "\n " );
432+ return try self .allocator .dupe (u8 , trimmed );
433+ }
434+ }
435+
388436 // Empty scratch space
389437 parse_ast .store .emptyScratch ();
390438
@@ -453,6 +501,25 @@ pub const Repl = struct {
453501 const expr_idx : AST.Expr.Idx = @enumFromInt (parse_ast .root_node_idx );
454502
455503 const canonical_expr = try czer .canonicalizeExpr (expr_idx ) orelse {
504+ // Check for diagnostics and render them as error messages
505+ const diagnostics = try module_env .getDiagnostics ();
506+ if (diagnostics .len > 0 ) {
507+ // Render the first diagnostic as the error message
508+ const diagnostic = diagnostics [0 ];
509+ var report = try module_env .diagnosticToReport (diagnostic , self .allocator , "repl" );
510+ defer report .deinit ();
511+
512+ var output = std .array_list .Managed (u8 ).init (self .allocator );
513+ var unmanaged = output .moveToUnmanaged ();
514+ var writer_alloc = std .Io .Writer .Allocating .fromArrayList (self .allocator , & unmanaged );
515+ report .render (& writer_alloc .writer , .markdown ) catch | err | switch (err ) {
516+ error .WriteFailed = > return error .OutOfMemory ,
517+ else = > return err ,
518+ };
519+ unmanaged = writer_alloc .toArrayList ();
520+ output = unmanaged .toManaged (self .allocator );
521+ return try output .toOwnedSlice ();
522+ }
456523 return try self .allocator .dupe (u8 , "Canonicalize expr error: expression returned null" );
457524 };
458525 const final_expr_idx = canonical_expr .get_idx ();
0 commit comments