File name and line number of parser error/warning

e$B$J$+$@$G$9!#e(B

YARVe$B$K$J$C$F$+$i!"e(Bsyntax
errore$B$de(Bparsee$B;~$N7Y9p$G%=!<%9%U%!%$%kL>e(B
e$B$d9THV9f$,=P$J$/$J$C$F$$$^$9!#e(B

e$BEv=i!“e(Berr_position()e$B$r<B9T;~MQ$He(Bparsere$BMQ$KJ,$1$l$P$$$$$+$H;W$Ce(B
e$B$?$s$G$9$,!”$I$&$;$J$ie(Bruby_sourcefile/ruby_sourcelinee$B$re(Brippere$BF1e(B
e$BMMe(Bparser_paramse$B$K0$7$Fe(Bparser_warn()e$B$J$I$G=hM}$9$k$h$&$K$7$F$Oe(B
e$B$I$&$+$H$$$&5$$b$7$^$9!#e(B

e$B$I$A$i$K$9$k$K$7$F$b!"%7%0%J%k$G8F$P$l$k2DG=@-$N$"$ke(Brb_bug()e$B$Oe(B
e$BC1=c$K$I$A$i$+0lJ}$K$O$G$-$=$&$K$J$$$H$$$&LdBj$,$"$j$^$9!#$I$&e(B
e$B$7$?$b$s$G$7$g$&$+!#e(B

e$B0l1~!":G=i$N0F$G;n$7$F$_$?%Q%C%A$r$D$1$F$*$-$^$9!#e(B

Index: parse.y

— parse.y (revision 11525)
+++ parse.y (working copy)
@@ -500,9 +500,9 @@ static VALUE ripper_id2sym(ID);

#ifndef RIPPER
-# define rb_warn0(fmt) rb_warn(fmt)
-# define rb_warnI(fmt,a) rb_warn(fmt,a)
-# define rb_warnS(fmt,a) rb_warn(fmt,a)
-# define rb_warning0(fmt) rb_warning(fmt)
-# define rb_warningS(fmt,a) rb_warning(fmt,a)
+# define rb_warn0(fmt) rb_compile_warn(fmt)
+# define rb_warnI(fmt,a) rb_compile_warn(fmt,a)
+# define rb_warnS(fmt,a) rb_compile_warn(fmt,a)
+# define rb_warning0(fmt) rb_compile_warning(fmt)
+# define rb_warningS(fmt,a) rb_compile_warning(fmt,a)
#else

define rb_warn0(fmt) ripper_warn0(parser, fmt)

@@ -739,5 +739,5 @@ bodystmt : compstmt
}
else if ($3) {

  •      rb_warn("else without rescue is useless");
    
  •      rb_warn0("else without rescue is useless");
         $$ = block_append($$, $3);
     }
    

@@ -2234,5 +2234,5 @@ opt_call_args : none
call_args : command
{

  •        rb_warn("parenthesize argument(s) for future version");
    
  •        rb_warn0("parenthesize argument(s) for future version");
       /*%%%*/
     $$ = NEW_LIST($1);
    

@@ -6987,5 +6987,5 @@ parser_warn(NODE *node, const char *mesg
int line = ruby_sourceline;
ruby_sourceline = nd_line(node);

  • rb_warn("%s", mesg);
  • rb_warnS("%s", mesg);
    ruby_sourceline = line;
    }
    @@ -7593,5 +7593,5 @@ void_expr_gen(struct parser_params *pars

ruby_sourceline = nd_line(node);

  • rb_warn(“useless use of %s in void context”, useless);
  • rb_warnS(“useless use of %s in void context”, useless);
    ruby_sourceline = line;
    }
    @@ -7788,5 +7788,5 @@ cond0(struct parser_params *parser, NODE
    case NODE_EVSTR:
    case NODE_STR:
  • rb_warn(“string literal in condition”);
  • rb_warn0(“string literal in condition”);
    break;

Index: error.c

— error.c (revision 11525)
+++ error.c (working copy)
@@ -31,18 +31,30 @@ int rb_sourceline();

static int
-err_position(char *buf, long len)
+err_position_0(char *buf, long len, const char *file, long line)
{

  • ruby_set_current_source();
  • if (!rb_sourcefile()) {
  • if (!file) {
    return 0;
    }
  • else if (rb_sourceline() == 0) {
  • return snprintf(buf, len, "%s: ", rb_sourcefile());
  • else if (line == 0) {
  • return snprintf(buf, len, "%s: ", file);
    }
    else {
  • return snprintf(buf, len, "%s:%d: ", rb_sourcefile(),
    rb_sourceline());
  • return snprintf(buf, len, "%s:%d: ", file, line);
    }
    }

+static int
+err_position(char *buf, long len)
+{

  • return err_position_0(buf, len, rb_sourcefile(), rb_sourceline());
    +}

+static int
+compile_position(char *buf, long len)
+{

  • ruby_set_current_source();
  • return err_position_0(buf, len, ruby_sourcefile, ruby_sourceline);
    +}

static void
err_snprintf(char *buf, long len, const char *fmt, va_list args)
@@ -56,21 +68,27 @@ err_snprintf(char *buf, long len, const
}

-static void err_append(const char*);
static void
-err_print(const char *fmt, va_list args)
+compile_snprintf(char *buf, long len, const char *fmt, va_list args)
{

  • char buf[BUFSIZ];
  • long n;
  • err_snprintf(buf, BUFSIZ, fmt, args);
  • err_append(buf);
  • n = compile_position(buf, len);
  • if (len > n) {
  • vsnprintf((char*)buf+n, len-n, fmt, args);
  • }
    }

+static void err_append(const char*);
+
void
rb_compile_error(const char *fmt, …)
{
va_list args;

  • char buf[BUFSIZ];
  • va_start(args, fmt);
  • err_print(fmt, args);
  • compile_snprintf(buf, BUFSIZ, fmt, args);
    va_end(args);
  • err_append(buf);
    ruby_nerrs++;
    }
    @@ -89,4 +107,47 @@ rb_compile_error_append(const char *fmt,

static void
+compile_warn_print(const char *fmt, va_list args)
+{

  • char buf[BUFSIZ];
  • int len;
  • compile_snprintf(buf, BUFSIZ, fmt, args);
  • len = strlen(buf);
  • buf[len++] = ‘\n’;
  • rb_write_error2(buf, len);
    +}

+void
+rb_compile_warn(const char *fmt, …)
+{

  • char buf[BUFSIZ];
  • va_list args;
  • if (NIL_P(ruby_verbose)) return;
  • snprintf(buf, BUFSIZ, “warning: %s”, fmt);
  • va_start(args, fmt);
  • compile_warn_print(buf, args);
  • va_end(args);
    +}

+/* rb_compile_warning() reports only in verbose mode */
+void
+rb_compile_warning(const char *fmt, …)
+{

  • char buf[BUFSIZ];
  • va_list args;
  • if (!RTEST(ruby_verbose)) return;
  • snprintf(buf, BUFSIZ, “warning: %s”, fmt);
  • va_start(args, fmt);
  • compile_warn_print(buf, args);
  • va_end(args);
    +}

+static void
warn_print(const char *fmt, va_list args)
{
Index: ruby.h

— ruby.h (revision 11525)
+++ ruby.h (working copy)
@@ -632,8 +632,10 @@ NORETURN(void rb_notimplement(void));
/* reports if -w' specified */ PRINTF_ARGS(void rb_warning(const char*, ...), 1, 2); +PRINTF_ARGS(void rb_compile_warning(const char*, ...), 1, 2); /* reports if-w’ specified /
PRINTF_ARGS(void rb_sys_warning(const char
, …), 1, 2);
/* reports always /
PRINTF_ARGS(void rb_warn(const char
, …), 1, 2);
+PRINTF_ARGS(void rb_compile_warn(const char*, …), 1, 2);

VALUE rb_each(VALUE);

e$B!!$5$5$@$G$9!#e(B

e$B!!JV;v$,CY$/$J$C$F$9$_$^$;$s!#e(B

[email protected] wrote:

e$B$7$?$b$s$G$7$g$&$+!#e(B

e$B0l1~!":G=i$N0F$G;n$7$F$_$?%Q%C%A$r$D$1$F$*$-$^$9!#e(B

e$B!!8e<T$N0F$,$$$$!"$H$$$&$+!"%0%m!<%P%kJQ?te(B ruby_sourcefile/line
e$B$O>C5n$7e(B
e$B$?$$$N$G$9$,!"Fq$7$$$G$7$g$&$+!#e(B