Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Incorrect syntax errors reported with Carp::cluck #112

Open
dearieme opened this issue Feb 1, 2024 · 2 comments
Open

Incorrect syntax errors reported with Carp::cluck #112

dearieme opened this issue Feb 1, 2024 · 2 comments

Comments

@dearieme
Copy link

dearieme commented Feb 1, 2024

I get spurious syntax errors when working with a particular codebase and I think the culprit is Moose using Carp::cluck to emit warnings at compile time.

As far as I can tell, the problem is that the clucked line get's correctly flagged as a warning but the following stacktrace lines are not, so you end up with a syntax error reported for each line of stacktrace, and with Moose stacktraces are deep! I've had a look through the Inquisitor code but I can't see an obvious way to fix it. All the stacktrace lines are indented, but it might be a bit brittle to rely on that.

Yes, I should just not ignore the warnings and fix them, and I will eventually, but it's huge untested codebase and fixing all of them would require extensive re-factoring. Specifically I'm hitting a warning about accessors having the same name as existing functions in the namespace.

Here's a minimal test case to demonstrate...

package CluckTest;

use Carp qw(cluck);
BEGIN {
  cluck "This is a cluck";
}
1;
#! /usr/bin/perl

# cluck_test.pl
use strict;
use warnings;

use CluckTest;
scott@ardbeg ~/dev/perlnavtest $ perl -c -I lib/ -I /home/scott/.local/share/nvim/mason/packages/perlnavigator/node_modules/perlnavigator-server/src/perl -MInquisitor cluck_test.pl 
=PerlWarning=This is a cluck at lib/CluckTest.pm line 6.
        CluckTest::BEGIN() called at lib/CluckTest.pm line 7
        eval {...} called at lib/CluckTest.pm line 7
        require CluckTest.pm called at cluck_test.pl line 6
        main::BEGIN() called at lib/CluckTest.pm line 7
        eval {...} called at lib/CluckTest.pm line 7
Running inquisitor
CluckTest       m               lib/CluckTest.pm        CluckTest       0
$!      c
%!      h
$"      c                                        
$0      c                                       cluck_test.pl
$@      c
%ENV    h
@INC    c                                       /home/scott/.local/share/nvim/mason/packages/perlnavigator/node_modules/perlnavigator-server/src/perl/lib_bs22, lib/, /home/scott/.local/share/nvim/mason/packages/perlnavigator/node_modules/perlnavigator-server/src/perl, /etc/perl, /usr/local/lib/x86_64-linux-gnu/perl/5.32.1, /usr/local/share/perl/5.32.1, /usr/lib/x86_64-linux-gnu/perl5/5.32, /usr/share/perl5, /usr/lib/x86_64-linux-gnu/perl-base, /usr/lib/x86_64-linux-gnu/perl/5.32, /usr/share/perl/5.32, /usr/local/lib/site_perl
%INC    h
%SIG    h
$]      c                                       5.032001
@_      c                                       main
Encode::Internal::Define        t       Encode::Encoding::Define        /usr/lib/x86_64-linux-gnu/perl/5.32/Encode/Encoding.pm  Encode::Encoding        16
Encode::Internal::decode        t       Encode::Internal::decode        /usr/lib/x86_64-linux-gnu/perl/5.32/Encode.pm   Encode::Internal        210
Encode::Internal::encode        t       Encode::Internal::decode        /usr/lib/x86_64-linux-gnu/perl/5.32/Encode.pm   Encode::Internal        210
Encode::Internal::fromUnicode   t       Encode::Encoding::fromUnicode   /usr/lib/x86_64-linux-gnu/perl/5.32/Encode/Encoding.pm  Encode::Encoding        51
Encode::Internal::mime_name     t       Encode::Encoding::mime_name     /usr/lib/x86_64-linux-gnu/perl/5.32/Encode/Encoding.pm  Encode::Encoding        27
Encode::Internal::name  t       Encode::Encoding::name  /usr/lib/x86_64-linux-gnu/perl/5.32/Encode/Encoding.pm  Encode::Encoding        24
Encode::Internal::needs_lines   t       Encode::Encoding::needs_lines   /usr/lib/x86_64-linux-gnu/perl/5.32/Encode/Encoding.pm  Encode::Encoding        42
Encode::Internal::new_sequence  t       Encode::Encoding::renew /usr/lib/x86_64-linux-gnu/perl/5.32/Encode/Encoding.pm  Encode::Encoding        31
Encode::Internal::perlio_ok     t       Encode::Encoding::perlio_ok     /usr/lib/x86_64-linux-gnu/perl/5.32/Encode/Encoding.pm  Encode::Encoding        45
Encode::Internal::renew t       Encode::Encoding::renew /usr/lib/x86_64-linux-gnu/perl/5.32/Encode/Encoding.pm  Encode::Encoding        31
Encode::Internal::renewed       t       Encode::Encoding::renewed       /usr/lib/x86_64-linux-gnu/perl/5.32/Encode/Encoding.pm  Encode::Encoding        38
Encode::Internal::toUnicode     t       Encode::Encoding::toUnicode     /usr/lib/x86_64-linux-gnu/perl/5.32/Encode/Encoding.pm  Encode::Encoding        50
Encode::Internal::DEBUG t       Encode::Encoding::DEBUG /home/scott/.local/share/nvim/mason/packages/perlnavigator/node_modules/perlnavigator-server/src/perl/lib_bs22/Inspectorito.pm Encode::Encoding
Encode::Internal::DESTROY       t       Encode::Encoding::DESTROY       /usr/lib/x86_64-linux-gnu/perl/5.32/Encode/Encoding.pm  Encode::Encoding        69

--------------Now Building the new pltags ---------------------
Done with pltags. Now dumping same-file packages
cluck_test.pl syntax OK
scott@ardbeg ~/dev/perlnavtest $ 
@bscan
Copy link
Owner

bscan commented Feb 1, 2024

Hi @dearieme, thanks for filing the issue. I'm able to reproduce the problem:

image

In this case, the Inquistor.pm code is already intercepting the warning itself and re-issuing the warning with a prefix of =PerlWarning= as shown in your inquisitor output. This is to allow us to detect the difference between a warning and an error. Code here:

$SIG{__WARN__} = sub { warn '=PerlWarning=', @_ };

I suspect the solution here would be to change this function to format the warning onto a single line. Perhaps replacing newlines with \n or similar replacement character, and then restoring the newlines before posting the warnings to vscode:

if (violation.indexOf("=PerlWarning=") != -1) {

A pull request would be welcome here, or I will eventually get around to it. Thanks!

@dearieme
Copy link
Author

dearieme commented Feb 1, 2024

Hi @bscan thanks for looking so quickly! That seems like a neat solution - I'll have a go and send a PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants