summaryrefslogtreecommitdiffstats
path: root/src/perl_checker.html.pl
diff options
context:
space:
mode:
Diffstat (limited to 'src/perl_checker.html.pl')
-rw-r--r--src/perl_checker.html.pl112
1 files changed, 87 insertions, 25 deletions
diff --git a/src/perl_checker.html.pl b/src/perl_checker.html.pl
index e90d2eb..38ec959 100644
--- a/src/perl_checker.html.pl
+++ b/src/perl_checker.html.pl
@@ -1,5 +1,42 @@
$s = <<'EOF';
-<head><title>perl_checker</title></head>
+<head>
+ <title>perl_checker</title>
+ <style> body { max-width: 900; } </style>
+</head>
+
+
+<h1>Quick Start</h1>
+
+To use perl_checker, simply use "perl_checker a_file.pl"
+<p>
+To use under emacs, simply add the following line to your .emacs,
+then when you visit a perl file, you can use Ctrl-Return to run perl_checker
+on this file
+
+<pre>
+ (global-set-key [(control return)] (lambda () (interactive) (save-some-buffers 1) (compile (concat "perl_checker --restrict-to-files " (buffer-file-name (current-buffer))))))
+</pre>
+
+<p>
+To use with vim, use something like:
+<pre>
+ perl_checker --restrict-to-files scanner.pm > errors.err ; vim -c ':copen 4' -c ':so /usr/share/vim/ftplugin/perl_checker.vim' -q
+</pre>
+where /usr/share/vim/ftplugin/perl_checker.vim is
+
+<pre>
+" Error formats
+setlocal efm=
+ \%EFile\ \"%f\"\\,\ line\ %l\\,\ characters\ %c-%*\\d:,
+ \%EFile\ \"%f\"\\,\ line\ %l\\,\ character\ %c:%m,
+ \%+EReference\ to\ unbound\ regexp\ name\ %m,
+ \%Eocamlyacc:\ e\ -\ line\ %l\ of\ \"%f\"\\,\ %m,
+ \%Wocamlyacc:\ w\ -\ %m,
+ \%-Zmake%.%#,
+ \%C%m
+</pre>
+
+
<h1>Goals of perl_checker</h1>
<ul>
@@ -23,12 +60,21 @@ $s = <<'EOF';
(NB: the subset is chosen to keep a good expressivity)
</ul>
-<h1>Compared to <a href="http://perlcritic.tigris.org/">Perl-Critic</a>
+<h1>Compared to <a href="http://www.perl.com/pub/a/2005/06/09/ppi.html">PPI</a> and <a href="http://perlcritic.tigris.org/">Perl-Critic</a></h1>
<ul>
-<li>perl_checker use its own OCaml-written perl parser, which is in no way as robust as <a href="http://www.perl.com/pub/a/2005/06/09/ppi.html">PPI</a>.
- A PPI require is to be able to parse non finished perl documents.
- perl_checker is a checker, and it is not a big deal to die horribly on a weird perl expression, telling the programmer what to write instead.
+<li>perl_checker use its own OCaml-written parser.
+ This parser only handle a subset of perl,
+ whereas one of PPI's goal is to be able to parse non finished perl documents.
+ <p>perl_checker is a checker: it is not a big deal to die horribly on a weird perl expression, it tells the programmer what to write instead.
+ The issue is that perl_checker includes inter-modules analysis, and it implies being able to parse non-perl_checker compliant modules.
+ A solution for this is perl_checker <i>fake</i> modules. No perfect solution though.
+
+<li>PPI doesn't handle operator priorities: <tt>1 + 2 &lt;&lt; 3</tt> is parsed as
+ <ul><li>PPI: a list [ Number(<tt>1</tt>), Operator(<tt>+</tt>), Number(<tt>2</tt>), Operator(<tt>&lt;&lt;</tt>), Number(<tt>3</tt>) ]
+ <li>perl_checker: a tree Operator(<tt>&lt;&lt;</tt>, [ Operator(<tt>+</tt>, [ Number(<tt>1</tt>), Number(<tt>2</tt>) ]), Number(<tt>3</tt>) ])
+ </ul>
+ This limits perlcritic checks to a syntax level.
<li>perl_checker is <b>much</b> faster (more than 100 times) (ML pattern matching rulez)
@@ -39,24 +85,33 @@ $s = <<'EOF';
<h1>Get it</h1>
-<a href="http://cvs.mandriva.com/cgi-bin/cvsweb.cgi/soft/perl-MDK-Common/perl_checker.src/">CVS source</a>
+<a href="http://svn.mandriva.com/cgi-bin/viewvc.cgi/packages/cooker/perl_checker/current/SOURCES/">tarball</a>
+<br>
+<a href="http://svn.mandriva.com/cgi-bin/viewvc.cgi/soft/perl_checker/">SVN source</a>
+<br>
+<a href="http://svn.mandriva.com/cgi-bin/viewvc.cgi/packages/cooker/perl-MDK-Common/current/SOURCES/">MDK::Common tarball</a>
<h1>Implemented features</h1>
<dl>
- <dt>white space normalization
- <dd>enforce a similar coding style. In many languages you can find a coding
- style document (eg: <a href="http://www.gnu.org/prep/standards_23.html">the GNU one</a>).
- TESTS=force_layout.t
+ <dt>detect some Perl traps
+ <dd>some Perl expressions are stupid, and one gets a warning when running
+ them with <tt>perl -w</tt>. The drawback of <tt>perl -w</tt> is the lack of
+ code coverage, it only detects expressions which are evaluated.
+
+ TESTS=various_errors.t
</dd>
- <dt>disallow <i>complex</i> expressions
- <dd>perl_checker try to ban some weird-not-used-a-lot features.
- TESTS=syntax_restrictions.t
+ <dt>context checks
+ <dd>Perl has types associated with variables names, the so-called "context".
+ Some expressions mixing contexts are stupid, perl_checker detects them.
+
+ TESTS=context.t
</dd>
+
<dt>suggest simpler expressions
<dd>when there is a simpler way to write an expression, suggest it. It can
also help detecting errors.
@@ -64,13 +119,7 @@ $s = <<'EOF';
TESTS=suggest_better.t
</dd>
- <dt>context checks
- <dd>Perl has types associated with variables names, the so-called "context".
- Some expressions mixing contexts are stupid, perl_checker detects them.
- TESTS=context.t
-
- </dd>
<dt>function call check
<dd>detection of unknown functions or mismatching prototypes (warning: since
perl is a dynamic language, some spurious warnings may occur when a function
@@ -79,6 +128,7 @@ $s = <<'EOF';
TESTS=prototype.t
</dd>
+
<dt>method call check
<dd>detection of unknown methods or mismatching prototypes. perl_checker
doesn't have any idea what the object type is, it simply checks if a method
@@ -87,19 +137,31 @@ $s = <<'EOF';
TESTS=method.t
</dd>
+
<dt>return value check
<dd>dropping the result of a functionnally <i>pure</i> function is stupid.
using the result of a function returning void is stupid too.
+ <br>(nb: perl_checker enforces <tt>&&</tt> and <tt>||</tt> are used as boolean operators
+ whereas <tt>and</tt> and <tt>or</tt> are used for control flow)
TESTS=return_value.t
</dd>
- <dt>detect some Perl traps
- <dd>some Perl expressions are stupid, and one gets a warning when running
- them with <tt>perl -w</tt>. The drawback are <tt>perl -w</tt> is the lack of
- code coverage, it only detects expressions which are evaluated.
- TESTS=various_errors.t
+ <dt>white space normalization
+ <dd>enforce a similar coding style. In many languages you can find a coding
+ style document (eg: <a href="http://www.gnu.org/prep/standards/standards.html#Writing-C">the GNU one</a>).
+
+ TESTS=force_layout.t
+
+ </dd>
+
+ <dt>disallow <i>complex</i> expressions
+ <dd>perl_checker try to ban some weird-not-used-a-lot features.
+
+ TESTS=syntax_restrictions.t
+
+ </dd>
</dl>
@@ -136,7 +198,7 @@ sub get_example {
join('', map {
my $lines = join("<br>", map { "<tt>" . html_quote($_) . "</tt>" } @{$_->{lines}});
my $logs = join("<br>", map { html_quote($_) } @{$_->{logs}});
- " <tr><td>\n", $lines, "</td><td>", $logs, "</td></tr>\n";
+ $logs ? " <tr><td>\n" . $lines . "</td><td>" . $logs . "</td></tr>\n" : '';
} @tests) .
"</table></a>\n";
}