Changeset 2198


Ignore:
Timestamp:
12/25/08 15:22:27 (3 years ago)
Author:
pshangov
Message:
  • The Error List now requires Parse::ErrorString::Perl 0.08
  • support for messages with "at" and "near" information at the end. Added t/files/error_near.pl to test "near" messages. "At" messages can be tested with the existing t/files/missing_brace_1.pl
  • support for errors inside eval
  • support for error messages reformatted by "use diagnostics"
  • support for stack traces on fatal errors when "use diagnostics" is in force. Added test script t/files/error_stack.pl
  • file paths are truncated for clarity where possible (see info on "file" method in Parse::ErrorString::Perl)
  • the type of error (e.g. warning or fatal) is displayed in the title bar of the diagnostics message box
  • change in language for diagnostic messages is detected automatically and applied the next time a script is run (no restart needed)
  • if for some reason a translation of a perl error is not available in a translated perldiag, fall back to default perldiag
  • loading of Parse::ErrorString::Perl is delayed until the first time a script is run, thus visibly improving Padre startup time
  • loading of Parse::ErrorString::Perl is now implemented as non-blocking Padre::Task
Location:
trunk/Padre
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Padre/Makefile.PL

    r2172 r2198  
    8989} 
    9090 
    91 requires       'Parse::ErrorString::Perl'=> '0.06'; 
     91requires       'Parse::ErrorString::Perl'=> '0.08'; 
    9292test_requires  'Test::Compile'           => '0.08' unless win32; 
    9393test_requires  'Test::More'              => '0.47'; 
  • trunk/Padre/lib/Padre/Wx/ErrorList.pm

    r2184 r2198  
    2121        enabled  => 'enabled', 
    2222        index    => 'index', 
     23        config   => 'config', 
     24        lang     => 'lang', 
    2325        parser   => 'parser', 
    24         config   => 'config', 
    2526    }; 
    2627 
     
    4243    my $root = $self->AddRoot( 'Root', -1, -1, Wx::TreeItemData->new( 'Data' ) ); 
    4344    $self->{root} = $root;   
     45 
     46    Wx::Event::EVT_TREE_ITEM_ACTIVATED($self, $self, \&on_activate); 
     47    Wx::Event::EVT_TREE_KEY_DOWN($self, $self, \&on_f1); 
    4448     
    4549    $self->{mw} = $mw; 
     
    6064    $self->Show; 
    6165    $self->{mw}->{gui}->{bottompane}->SetSelection($index); 
    62     my $lang = $self->config->{diagnostics_lang}; 
    63     if ($lang) { 
    64         $lang =~ s/^\s*//; 
    65         $lang =~ s/\s*$//; 
    66         $self->{parser} = Parse::ErrorString::Perl->new(lang => $lang); 
    67     } else { 
    68         $self->{parser} = Parse::ErrorString::Perl->new; 
    69     } 
    7066    $self->{enabled} = 1; 
    7167} 
     
    8278    my $self = shift; 
    8379    return unless $self->enabled; 
    84     my $root = $self->root; 
    85      
     80     
     81    my $cur_lang = $self->config->{diagnostics_lang}; 
     82    $cur_lang =~ s/^\s*//; 
     83    $cur_lang =~ s/\s*$//; 
     84    my $old_lang = $self->lang; 
     85    $self->{lang} = $cur_lang; 
     86 
    8687    my $data = $self->data; 
    87     my $parser = $self->parser; 
    88     my @errors = defined $data && $data ne '' ? $parser->parse_string($data) : (); 
    8988    $self->{data} = ""; 
    90     Wx::Event::EVT_TREE_KEY_DOWN($self, $self, \&on_f1); 
    91      
    92     foreach my $err (@errors) { 
    93         my $message = $err->message . " at " . $err->file_msgpath . " line " . $err->line; 
    94         my $err_tree_item = $self->AppendItem( $root, $message, -1, -1, Wx::TreeItemData->new( $err ) ); 
    95          
    96         Wx::Event::EVT_TREE_ITEM_ACTIVATED($self, $self, \&on_activate); 
    97     } 
     89    return unless $data; 
     90     
     91 
     92    my $parser_task = Padre::Task::ErrorParser->new( 
     93        parser    => $self->parser, 
     94        cur_lang  => $cur_lang, 
     95        old_lang  => $old_lang, 
     96        data      => $data, 
     97    ); 
     98     
     99    $parser_task->schedule; 
    98100} 
    99101 
     
    105107        #my $item = $event->GetItem; 
    106108        my $item = $self->GetSelection; 
     109        return unless $item; 
    107110        my $err = $self->GetPlData($item); 
     111        return if $err->isa('Parse::ErrorString::Perl::StackItem'); 
    108112        my $diagnostics = gettext("No diagnostics available for this error!"); 
    109113        if ($err->diagnostics) { 
     
    112116        } 
    113117        $diagnostics = $^O eq 'MSWin32' ? $diagnostics : encode('utf8', $diagnostics); 
    114         my $dialog = Wx::MessageDialog->new($self->mw, $diagnostics, "Diagnostics", Wx::wxOK); 
     118        my $dialog_title = gettext("Diagnostics"); 
     119        if ($err->type_description) { 
     120            $dialog_title .= (": " . gettext($err->type_description)); 
     121        } 
     122        my $dialog = Wx::MessageDialog->new($self->mw, $diagnostics, $dialog_title, Wx::wxOK); 
    115123        $dialog->ShowModal; 
    116124    } 
     
    121129    my $event = shift; 
    122130    my $item = $event->GetItem; 
     131    return unless $item; 
    123132    my $err = $self->GetPlData($item); 
    124133    my $mw = $self->mw; 
     134    return if $err->file eq 'eval'; 
    125135    $mw->setup_editor($err->file_abspath); 
    126136    my $editor = $mw->selected_editor; 
     
    148158} 
    149159 
     160package Padre::Task::ErrorParser; 
     161 
     162use base 'Padre::Task'; 
     163 
     164use Class::XSAccessor 
     165    getters => { 
     166        parser       => 'parser', 
     167        old_lang     => 'old_lang', 
     168        cur_lang     => 'cur_lang', 
     169        data         => 'data', 
     170    }; 
     171 
     172sub run { 
     173    my $self = shift; 
     174    unless ($self->parser and ( (!$self->cur_lang and !$self->old_lang) or ($self->cur_lang eq $self->old_lang) )) { 
     175        if ($self->cur_lang) { 
     176            $self->{parser} = Parse::ErrorString::Perl->new(lang => $self->cur_lang); 
     177        } else { 
     178            $self->{parser} = Parse::ErrorString::Perl->new; 
     179        } 
     180    } 
     181    return 1; 
     182} 
     183 
     184sub finish { 
     185    my $self = shift; 
     186    my $mw = shift; 
     187 
     188    my $errorlist = $mw->errorlist; 
     189     
     190    my $data = $self->data; 
     191    my $parser = $self->parser; 
     192    $errorlist->{parser} = $parser; 
     193 
     194    my @errors = defined $data && $data ne '' ? $parser->parse_string($data) : (); 
     195     
     196    foreach my $err (@errors) { 
     197        my $message = $err->message . " at " . $err->file . " line " . $err->line; 
     198        #$message = encode('utf8', $message); 
     199        if ($err->near) { 
     200            my $near = $err->near; 
     201            # some day when we have unicode in wx ... 
     202            #$near =~ s/\n/\x{c2b6}/g; 
     203            $near =~ s/\n/\\n/g; 
     204            $near =~ s/\r//g; 
     205            $message .= ", near \"$near\""; 
     206        } elsif ($err->at) { 
     207            my $at = $err->at; 
     208            $message .= ", at $at"; 
     209        } 
     210        my $err_tree_item = $errorlist->AppendItem( $errorlist->root, $message, -1, -1, Wx::TreeItemData->new( $err ) ); 
     211         
     212        if ($err->stack) { 
     213            foreach my $stack_item ($err->stack) { 
     214                my $stack_message = $stack_item->sub .  
     215                    " called at " . $stack_item->file .  
     216                    " line " . $stack_item->line; 
     217                $errorlist->AppendItem( $err_tree_item, $stack_message, -1, -1, Wx::TreeItemData->new( $stack_item ) ); 
     218            } 
     219        } 
     220    } 
     221     
     222    return 1; 
     223} 
     224 
    1502251; 
    151226 
Note: See TracChangeset for help on using the changeset viewer.