bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

fixits: track byte-columns, not character-columns


From: Akim Demaille
Subject: fixits: track byte-columns, not character-columns
Date: Wed, 24 Apr 2019 07:38:48 +0200

commit 01fe32ee5380010748a383e77eb05baf0c0f9bdc
Author: Akim Demaille <address@hidden>
Date:   Tue Apr 23 22:00:38 2019 +0200

    fixits: track byte-columns, not character-columns
    
    Because the fix-its were ready the character-based columns, but were
    applied on byte-based columns, the result with multibyte characters or
    tabs could be "interesting".  For instance
    
                %fixed-output_files
                %fixed_output-files
        %fixed-output-files
        %define api.prefix {foo}
        %no-default-prec
    
    would give
    
             %fixed-%fixed-output-files  %fixed_output-files
        %fixed-orefix= "foo"
        o_default-prec
    
    * src/fixits.c (fixit_print, fixits_run): Work on byte-base columns.
    * tests/input.at: Check it.

diff --git a/src/fixits.c b/src/fixits.c
index 5ffd7935..3a8bf481 100644
--- a/src/fixits.c
+++ b/src/fixits.c
@@ -69,8 +69,8 @@ fixit_print (fixit const *f, FILE *out)
 {
   fprintf (out, "fix-it:%s:{%d:%d-%d:%d}:%s\n",
            quotearg_n_style (1, c_quoting_style, f->location.start.file),
-           f->location.start.line, f->location.start.column,
-           f->location.end.line, f->location.end.column,
+           f->location.start.line, f->location.start.byte,
+           f->location.end.line, f->location.end.byte,
            quotearg_n_style (2, c_quoting_style, f->fix));
 }
 
@@ -136,19 +136,29 @@ fixits_run (void)
             }
           putc (c, out);
         }
+
       /* Look for the right offset. */
-      while (offset < f->location.start.column)
+      bool need_eol = false;
+      while (offset < f->location.start.byte)
         {
           int c = getc (in);
           if (c == EOF)
             break;
           ++offset;
-          putc (c, out);
+          if (c == '\n')
+            /* The position we are asked for is beyond the actual
+               line: pad with spaces, and remember we need a \n.  */
+            need_eol = true;
+          putc (need_eol ? ' ' : c, out);
         }
 
       /* Paste the fix instead. */
       fputs (f->fix, out);
 
+      /* Maybe install the eol afterwards.  */
+      if (need_eol)
+        putc ('\n', out);
+
       /* Skip the bad input. */
       while (line < f->location.end.line)
         {
@@ -161,16 +171,17 @@ fixits_run (void)
               offset = 1;
             }
         }
-      while (offset < f->location.end.column)
+      while (offset < f->location.end.byte)
         {
           int c = getc (in);
           if (c == EOF)
             break;
           ++offset;
         }
+
       /* If erasing the content of a full line, also remove the
          end-of-line. */
-      if (f->fix[0] == 0 && f->location.start.column == 1)
+      if (f->fix[0] == 0 && f->location.start.byte == 1)
         {
           int c = getc (in);
           if (c == EOF)
diff --git a/tests/input.at b/tests/input.at
index 822521f5..883056a4 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -2509,8 +2509,8 @@ AT_DATA_GRAMMAR([[input.y]],
 %file-prefix
  =
 "bar"
-%fixed-output_files
-%fixed_output-files
+       %fixed-output_files
+        %fixed_output-files
 %fixed-output-files
 %name-prefix= "foo"
 %no-default_prec
@@ -2538,13 +2538,13 @@ fix-it:"input.y":{13:1-13:15}:"%file-prefix"
 input.y:14.1-16.5: warning: duplicate directive: '%file-prefix\n =' [-Wother]
 input.y:13.1-20:       previous declaration
 fix-it:"input.y":{14:1-16:6}:""
-input.y:17.1-19: warning: deprecated directive: '%fixed-output_files', use 
'%fixed-output-files' [-Wdeprecated]
-fix-it:"input.y":{17:1-17:20}:"%fixed-output-files"
-input.y:18.1-19: warning: duplicate directive: '%fixed_output-files' [-Wother]
-input.y:17.1-19:     previous declaration
-fix-it:"input.y":{18:1-18:20}:""
+input.y:17.9-27: warning: deprecated directive: '%fixed-output_files', use 
'%fixed-output-files' [-Wdeprecated]
+fix-it:"input.y":{17:2-17:21}:"%fixed-output-files"
+input.y:18.9-27: warning: duplicate directive: '%fixed_output-files' [-Wother]
+input.y:17.9-27:     previous declaration
+fix-it:"input.y":{18:9-18:28}:""
 input.y:19.1-19: warning: duplicate directive: '%fixed-output-files' [-Wother]
-input.y:17.1-19:     previous declaration
+input.y:17.9-27:     previous declaration
 fix-it:"input.y":{19:1-19:20}:""
 input.y:20.1-19: warning: deprecated directive: '%name-prefix= "foo"', use 
'%define api.prefix {foo}' [-Wdeprecated]
 fix-it:"input.y":{20:1-20:20}:"%define api.prefix {foo}"
@@ -2604,7 +2604,8 @@ AT_CHECK([cat input.y], [],
 %define parse.error verbose
 %expect-rr 0
 %file-prefix "foo"
-%fixed-output-files
+       %fixed-output-files
+        @&t@
 %define api.prefix {foo}
 %no-default-prec
 %no-default-prec




reply via email to

[Prev in Thread] Current Thread [Next in Thread]