Tutorial part 6: fix-it hints

libgdiagnostics supports adding “fix-it hints” to a diagnostic: suggestions for the user on how to edit their code to fix a problem. These can be expressed as insertions, replacements, and removals of text.

For example, here we use diagnostic_add_fix_it_hint_replace() to add a replacement fix-it hint to a diagnostic:

  diagnostic *d = diagnostic_begin (diag_mgr,
				    DIAGNOSTIC_LEVEL_ERROR);
  diagnostic_set_location (d, loc_token);

  diagnostic_add_fix_it_hint_replace (d, loc_token, "color");
  
  diagnostic_finish (d, "unknown field %qs; did you mean %qs", "colour", "color");

On compiling and running the program, we should get output similar to:

test-fix-it-hint.c:19:13: error: unknown field 'colour'; did you mean 'color'
   19 |   return p->colour;
      |             ^~~~~~
      |             color

We can also add a call to diagnostic_manager_write_patch() to the program cleanup code:

diagnostic_manager_write_patch (diag_mgr, stderr);

This will write a patch to the stream (here stderr) giving the effect of all fix-it hints on all diagnostics emitted by the diagnostic_manager, giving something like:

@@ -16,7 +16,7 @@
 struct rgb
 get_color (struct object *p)
 {
-  return p->colour;
+  return p->color;
 }

See the guide to fix-it hints for more information, or go on to the next section of the tutorial.