chiark / gitweb /
i18n: i18n-diff-auditor: fixes and minor improvements
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 30 Sep 2018 22:27:33 +0000 (23:27 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 30 Sep 2018 23:54:38 +0000 (00:54 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
i18n-diff-auditor

index 61f877ed9719e9db09152dbb3b885e03ddfe0c35..b4fc5968ad66bde2bae169b9457c9dc831b4b3bb 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_') {
@@ -267,7 +281,9 @@ 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
@@ -276,7 +292,6 @@ sub analyse_chunk_core () {
                        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++;