Detecting sub/call mismatches?

T

Tim McDaniel

I'm moving subs from one source file to another, and sometimes
renaming them according to a more unified naming convention, so
OldModule::OldName
OldName (while in package OldModule)
should all be changed to NewModule::NewName.

The problem, of course, is when I screw up a call to some version of
the old name, which (so far) has ended up as
OldModule::OldName (that is, I overlooked it entirely)
OldModule::NewName
OldName (while in package OldModule; overlooked)
NewName (while in package OldModule, so that's OldModule::NewName)
I've caught these by eyeball inspection and I'll go thru it again, but
I'm nervous.

In Perl, of course, you can't in general do a static "compile time"
check -- in principle, there could be a sub defined with eval, a
reference to a sub, a sub name generated by code, et cetera.

Nevertheless, even if I can't get perfection, I'd like to do some
static verification if it's possible -- a Perl lint, for those
familiar with the old C tool. In practice, our code rarely does
obscure things. All I've seen are package declarations alone on a
line, and "sub SomeName *{" starting in column 1, and calls to
SomeModule:SomeName, except within SomeModule, where we usually do
just SomeName.

Is there anything I can do to get a partial check?

I've thought of hacking together a script that reads source files to
look for package and sub declarations to generate a table of potential
definitions, and the uses are every word that is followed by a left
paren. I could get some false results due to not following the proper
parsing (is there a module to parse Perl code?), like misunderstanding
quotation or comments. But even if I find one error now instead of
several weeks from now when some obscure path is finally run, and get
a slew of bad hits, I'd be happier.
 
C

C.DeRykus

I'm moving subs from one source file to another, and sometimes

renaming them according to a more unified naming convention, so

OldModule::OldName

OldName (while in package OldModule)

should all be changed to NewModule::NewName.



The problem, of course, is when I screw up a call to some version of

the old name, which (so far) has ended up as

OldModule::OldName (that is, I overlooked it entirely)

OldModule::NewName

OldName (while in package OldModule; overlooked)

NewName (while in package OldModule, so that's OldModule::NewName)

I've caught these by eyeball inspection and I'll go thru it again, but

I'm nervous.



In Perl, of course, you can't in general do a static "compile time"

check -- in principle, there could be a sub defined with eval, a

reference to a sub, a sub name generated by code, et cetera.



Nevertheless, even if I can't get perfection, I'd like to do some

static verification if it's possible -- a Perl lint, for those

familiar with the old C tool. In practice, our code rarely does

obscure things. All I've seen are package declarations alone on a

line, and "sub SomeName *{" starting in column 1, and calls to

SomeModule:SomeName, except within SomeModule, where we usually do

just SomeName.



Is there anything I can do to get a partial check?



I've thought of hacking together a script that reads source files to

look for package and sub declarations to generate a table of potential

definitions, and the uses are every word that is followed by a left

paren. I could get some false results due to not following the proper

parsing (is there a module to parse Perl code?), like misunderstanding

quotation or comments. But even if I find one error now instead of

several weeks from now when some obscure path is finally run, and get

a slew of bad hits, I'd be happier.

B::Xref might help - perldoc B::Xref
 
T

Tim McDaniel

B::Xref might help - perldoc B::Xref

Interesting -- thank you for the pointer.

It's strange, though, that /^File / lines are so odd:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
File
Subroutine (definitions)
....

File ^E
Subroutine (definitions)
Package Moose::Error::Util
&_create_error_carpmess s26
&create_error s43
&create_error_confess s34
&create_error_croak s30
File<EB>}
Subroutine (definitions)
....

File
2Bh^W
Subroutine (definitions)
....

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
R

Rainer Weikusat

I'm moving subs from one source file to another, and sometimes
renaming them according to a more unified naming convention, so
OldModule::OldName
OldName (while in package OldModule)
should all be changed to NewModule::NewName.

The problem, of course, is when I screw up a call to some version of
the old name, which (so far) has ended up as
OldModule::OldName (that is, I overlooked it entirely)
OldModule::NewName
OldName (while in package OldModule; overlooked)
NewName (while in package OldModule, so that's OldModule::NewName)
I've caught these by eyeball inspection and I'll go thru it again, but
I'm nervous.

In Perl, of course, you can't in general do a static "compile time"
check -- in principle, there could be a sub defined with eval, a
reference to a sub, a sub name generated by code, et cetera.

Nevertheless, even if I can't get perfection, I'd like to do some
static verification if it's possible -- a Perl lint, for those
familiar with the old C tool.

You could try B::Lint.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top