chiark / gitweb /
i18n: i18n-diff-auditor: improve debug output
[dgit.git] / i18n-diff-auditor
index 61f877ed9719e9db09152dbb3b885e03ddfe0c35..6f9dab51a53c1c9c189ad5cafe19b02c1a21ac5c 100755 (executable)
@@ -139,7 +139,7 @@ sub semiparse ($) {
                               )*
                        ) \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 => $& };
@@ -197,11 +197,25 @@ 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' ); };
+    our @y_expect_suffix = ();
     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};
+       if ($y->{E} eq '+'
+           and @ys >= 3
+           and $ys[0]{E} eq '('
+           and ($ys[1]{E} eq '__' or $ys[2]{E} eq 'f_')) {
+           $next_y->(); # (
+           $next_y->(); # __ f_
+           @y_expect_suffix = ')';
+       }
        my $string_changed;
        my $ye = $y->{E};
        if ($ye eq '__' or $ye eq 'f_') {
@@ -234,8 +248,8 @@ sub analyse_chunk_core () {
                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";
                }
@@ -267,16 +281,18 @@ sub analyse_chunk_core () {
                    }
                    $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'
                        )) {
                        # lookahead shows close of containing scope
                        # or lower precedence operator
                        unshift @ys, $y;
+                       pop @analysed_y;
                        last;
                    }
                    $xs =~ s{^\s+}{};
-                   #debug $ichunkstart, "TOKEN $y->{P}\n";
                    $exactly->($y->{E}, $y->{P});
                    if ($y->{T} eq 'bra' or $y->{E} eq '?') {
                        $bras++;