chiark
/
gitweb
/
~ianmdlvl
/
dgit.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
i18n: i18n-diff-auditor: fix `on was non-string' message
[dgit.git]
/
i18n-diff-auditor
diff --git
a/i18n-diff-auditor
b/i18n-diff-auditor
index e8c86fec55426a63c3d784eafa8a3c4cf84e4fc2..ce2034f600c64edc6716422f1058e12ca001946e 100755
(executable)
--- a/
i18n-diff-auditor
+++ b/
i18n-diff-auditor
@@
-107,7
+107,8
@@
our ($ihunkhead, $ihunkend);
our ($ichunkstart, $ichunkend);
our ($before, $after);
our ($ichunkstart, $ichunkend);
our ($before, $after);
-sub is_string ($) { $_[0]{T} =~ m/heredoc|string/; };
+sub is_string ($) { $_[0]{T} =~ m/heredoc|string/; }
+sub is_trans ($) { grep { $_[0]{E} eq $_ } qw(__ f_ i_); }
sub semiparse ($) {
($_) = @_;
sub semiparse ($) {
($_) = @_;
@@
-139,13
+140,13
@@
sub semiparse ($) {
)*
) \1 }{}x) {
my ($q,$v) = ($1,$2);
)*
) \1 }{}x) {
my ($q,$v) = ($1,$2);
- push @o, { T => 'string', E => $&, P => "$q
-string
",
+ push @o, { T => 'string', E => $&, P => "$q
$q
",
Q => $q, V => $v};
} elsif (s{^$perlop_re|^\;}{}) {
push @o, { T => 'op', E => $&, P => $& };
Q => $q, V => $v};
} elsif (s{^$perlop_re|^\;}{}) {
push @o, { T => 'op', E => $&, P => $& };
- } elsif (s/[[{(]//) {
+ } elsif (s/
^
[[{(]//) {
push @o, { T => 'bra', E => $&, P => $& };
push @o, { T => 'bra', E => $&, P => $& };
- } elsif (s/[]})]//) {
+ } elsif (s/
^
[]})]//) {
push @o, { T => 'ket', E => $&, P => $& };
} elsif (s/^( [\$\@\%] )( \{ )//x) {
push @o, { T => 'deref', E => $1, P => $1 },
push @o, { T => 'ket', E => $&, P => $& };
} elsif (s/^( [\$\@\%] )( \{ )//x) {
push @o, { T => 'deref', E => $1, P => $1 },
@@
-159,9
+160,10
@@
sub semiparse ($) {
die "cannot tokenise \`$&'";
}
}
die "cannot tokenise \`$&'";
}
}
- for (my $i=
@o-2; $i>0; --$i
) {
+ for (my $i=
0; $i+2 < @o; $i++
) {
next unless $o[$i+1]{E} eq '.';
my @inputs = @o[$i, $i+2];
next unless $o[$i+1]{E} eq '.';
my @inputs = @o[$i, $i+2];
+ #print STDERR Dumper(\@inputs);
next if grep { !is_string($_) } @inputs;
my $q = $inputs[0]{Q};
next if grep { $_->{Q} ne $q } @inputs;
next if grep { !is_string($_) } @inputs;
my $q = $inputs[0]{Q};
next if grep { $_->{Q} ne $q } @inputs;
@@
-172,7
+174,7
@@
sub semiparse ($) {
Q => $q,
};
@o = (@o[0..$i-1], $new, @o[$i+3..$#o]);
Q => $q,
};
@o = (@o[0..$i-1], $new, @o[$i+3..$#o]);
- print STDERR Dumper(\@o);
+ $i--; # counteracts $i++
}
debug $ichunkstart, "semiparsed: ".join ' ', map { $_->{P} } @o;
return @o;
}
debug $ichunkstart, "semiparsed: ".join ' ', map { $_->{P} } @o;
return @o;
@@
-197,17
+199,33
@@
sub analyse_chunk_core () {
my ($x,$y);
my $next_x = sub { $next_something->(\@xs, \@analysed_x, \$x, 'before'); };
my $next_y = sub { $next_something->(\@ys, \@analysed_y, \$y, 'after' ); };
my ($x,$y);
my $next_x = sub { $next_something->(\@xs, \@analysed_x, \$x, 'before'); };
my $next_y = sub { $next_something->(\@ys, \@analysed_y, \$y, 'after' ); };
+ our @y_expect_suffix = ();
for (;;) {
for (;;) {
+ while (my $e = shift @y_expect_suffix) {
+ $next_y->();
+ $y->{E} eq $e
+ or die "suffix mismatch, expected $e got $y->{E}\n";
+ }
last unless @xs or @ys;
$next_x->();
$next_y->();
next if $x->{E} eq $y->{E};
last unless @xs or @ys;
$next_x->();
$next_y->();
next if $x->{E} eq $y->{E};
+ next if $x->{E} eq 'sprintf' and $y->{E} eq 'f_';
+ next if $x->{E} eq 'die' and $y->{E} eq 'confess';
+ if ($y->{E} eq '+'
+ and @ys >= 3
+ and $ys[0]{E} eq '('
+ and is_trans($ys[1])) {
+ $next_y->(); # (
+ $next_y->(); # __ f_
+ @y_expect_suffix = ')';
+ }
my $string_changed;
my $ye = $y->{E};
my $string_changed;
my $ye = $y->{E};
- if (
$ye eq '__' or $ye eq 'f_'
) {
+ if (
is_trans($y)
) {
$next_y->();
die "__ on non-string $y->{P}\n" unless is_string($y);
$next_y->();
die "__ on non-string $y->{P}\n" unless is_string($y);
- die "__ on was non-string $
y
->{P}\n" unless is_string($x);
+ die "__ on was non-string $
x
->{P}\n" unless is_string($x);
if ($y->{Q} ne "'") {
die "var subst in new string\n"
if $y->{V} =~ m{(?<!\\) [\$\@]};
if ($y->{Q} ne "'") {
die "var subst in new string\n"
if $y->{V} =~ m{(?<!\\) [\$\@]};
@@
-224,6
+242,10
@@
sub analyse_chunk_core () {
die $string_changed if length $string_changed;
next;
}
die $string_changed if length $string_changed;
next;
}
+ if ($ye eq 'i_') {
+ die $string_changed if length $string_changed;
+ next;
+ }
if ($ye eq 'f_') {
my $fmt = $y->{V};
die "no percent in _f string\n" unless $fmt =~ m{\%};
if ($ye eq 'f_') {
my $fmt = $y->{V};
die "no percent in _f string\n" unless $fmt =~ m{\%};
@@
-234,8
+256,8
@@
sub analyse_chunk_core () {
my ($lit, $what) = @_;
my $xl = substr($xs, 0, length($lit));
if ($xl ne $lit) {
my ($lit, $what) = @_;
my $xl = substr($xs, 0, length($lit));
if ($xl ne $lit) {
- debug $ichunkstart, "not exactly x:
$xs
";
- debug $ichunkstart, "not exactly y: $lit";
+ debug $ichunkstart, "not exactly x:
\"..$xs\"
";
+ debug $ichunkstart, "not exactly y:
$lit";
my $next = @ys ? $ys[0]{P} : '(end)';
die "string contents mismatch near $what before $next\n";
}
my $next = @ys ? $ys[0]{P} : '(end)';
die "string contents mismatch near $what before $next\n";
}
@@
-253,6
+275,15
@@
sub analyse_chunk_core () {
elsif ($& ne '%s') { die "unhandled %-subst $&\n"; }
$next_y->();
die "expected comma, got $y->{P}\n" unless $y->{E} eq ',';
elsif ($& ne '%s') { die "unhandled %-subst $&\n"; }
$next_y->();
die "expected comma, got $y->{P}\n" unless $y->{E} eq ',';
+ if (!length $fmt and
+ !length $xs and
+ @xs and
+ $xs[0]{E} eq '.') {
+ # X has "<earlier>" . <something>
+ # Y has "<earlier>%s" [other args] , <something>
+ $next_x->(); # eat the '.'
+ next;
+ }
if ($xs =~ m{^\@}) {
$next_y->();
die "\@... => not string" unless is_string($y);
if ($xs =~ m{^\@}) {
$next_y->();
die "\@... => not string" unless is_string($y);
@@
-267,14
+298,22
@@
sub analyse_chunk_core () {
}
$next_y->();
if (!$bras and
}
$next_y->();
if (!$bras and
- (grep { $y->{E} eq $_ } qw( or xor and not ; : )
+ (grep { $y->{E} eq $_ } qw( or xor and not ; :
+ if unless while when )
+ or $y->{E} eq ','
or $y->{T} eq 'ket'
)) {
or $y->{T} eq 'ket'
)) {
+ # lookahead shows close of containing scope
+ # or lower precedence operator
unshift @ys, $y;
unshift @ys, $y;
+ pop @analysed_y;
last;
}
last;
}
- $xs =~ s{^\s+}{};
- #debug $ichunkstart, "TOKEN $y->{P}\n";
+ $xs =~ s{^\s+}{} if $bras;
+ if (is_string($y) and $y->{Q} eq '"') {
+ $exactly->($y->{V}, $y->{P});
+ next;
+ }
$exactly->($y->{E}, $y->{P});
if ($y->{T} eq 'bra' or $y->{E} eq '?') {
$bras++;
$exactly->($y->{E}, $y->{P});
if ($y->{T} eq 'bra' or $y->{E} eq '?') {
$bras++;