Subject: | Handle Perl 5.12 package statements with blocks |
Perl 5.12 adds another form of package:
package NAME VERSION BLOCK
This means that the package statement isn't necessarily finished by a statement separator. The
lexer needs to know that a package statement ended with a block.
These patches fix ::Package to tell the lexer that it's no longer normal, and fixes the lexer to
recognize the package ending with a block.
Subject: | 0002-Check-for-5.12-package-statements-with-blocks.patch |
From 70381c816ed793ef164c56a1251f4d318d85f063 Mon Sep 17 00:00:00 2001
From: brian d foy <brian.d.foy@gmail.com>
Date: Fri, 29 Apr 2011 07:36:42 -0500
Subject: [PATCH 2/2] Check for 5.12 package statements with blocks
These blocks might implicitly end the package
statement (that is, without a statement
separator). It's not really a compound like if()
or while(), so I make its own special case.
---
lib/PPI/Lexer.pm | 27 +++++++++++++++++++++++----
1 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/lib/PPI/Lexer.pm b/lib/PPI/Lexer.pm
index 553dcd2..cc7eb0e 100644
--- a/lib/PPI/Lexer.pm
+++ b/lib/PPI/Lexer.pm
@@ -710,10 +710,29 @@ sub _continues {
return '';
}
- # Alrighty then, there are only five implied end statement types,
- # ::Scheduled blocks, ::Sub declarations, ::Compound, ::Given, and ::When
- # statements.
- unless ( ref($Statement) =~ /\b(?:Scheduled|Sub|Compound|Given|When)$/ ) {
+ # Alrighty then, there are only six implied end statement types,
+ # ::Scheduled blocks, ::Sub declarations, ::Compound, ::Package,
+ # ::Given, and ::When statements.
+ unless ( ref($Statement) =~ /\b(?:Scheduled|Sub|Compound|Given|When|Package)$/ ) {
+ return 1;
+ }
+
+ # Package is a bit weird because it can terminate in two ways.
+ # The Perl 5.12 syntax allows it to end with a block, and that's
+ # the only case we need to handle here. The other case is handled
+ # elsewhere automatically.
+ if ( $Statement->isa('PPI::Statement::Package') ) {
+ # This should be one of the following
+ # package Foo;
+ # package Foo VERSION;
+ # package Foo BLOCK
+ # package Foo VERSION BLOCK
+ my @schildren = $Statement->schildren;
+
+ if ( $schildren[-1]->isa('PPI::Structure::Block') ) {
+ return 0;
+ }
+
return 1;
}
--
1.6.5.4
Subject: | 0001-Add-a-lexer-hint-to-Package.patch |
From 88fe798fcbb7aaf5954ac619245da63caf521147 Mon Sep 17 00:00:00 2001
From: brian d foy <brian.d.foy@gmail.com>
Date: Fri, 29 Apr 2011 07:35:11 -0500
Subject: [PATCH 1/2] Add a lexer hint to ::Package
The package statement now can end implicitly
with a block, so we have to let the lexer guess
if it's continuing or stopping.
---
lib/PPI/Statement/Package.pm | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/lib/PPI/Statement/Package.pm b/lib/PPI/Statement/Package.pm
index 8c48adf..7a992e3 100644
--- a/lib/PPI/Statement/Package.pm
+++ b/lib/PPI/Statement/Package.pm
@@ -73,6 +73,10 @@ BEGIN {
@ISA = 'PPI::Statement';
}
+# clues for the lexer. The Perl 5.12 syntax muddies the waters a bit because
+# we can end with a statement terminator or a block.
+sub __LEXER__normal { '' }
+
=pod
=head2 namespace
--
1.6.5.4