Login
ProhibitQuotedWordLists does not apply to lists
authorJeffrey Ryan Thalhammer <jeff@imaginative-software.com>
Sun, 27 Jul 2008 03:35:46 +0000 (03:35 +0000)
committerJeffrey Ryan Thalhammer <jeff@imaginative-software.com>
Sun, 27 Jul 2008 03:35:46 +0000 (03:35 +0000)
that contain non-words. RT #37886.

Changes
lib/Perl/Critic/Policy/CodeLayout/ProhibitQuotedWordLists.pm
t/CodeLayout/ProhibitQuotedWordLists.run

diff --git a/Changes b/Changes
index 50ab35e..721d50c 100644 (file)
--- a/Changes
+++ b/Changes
@@ -4,6 +4,11 @@
     * ValuesAndExpressions::RequireConstantOnLeftSideOfEquality -- In
       case you accidentally say "if($foo = 42){...}"
 
+    Policy Changes:
+    * CodeLayout::ProhibitQuotedWordLists no longer applies if the
+      list contains any non-words.  A non-word is anything that
+      does not match /[\w-]+/.  RT #37886.
+
 [1.090] Released on 2008-07-22
 
     Bug Fixes:
index 87c1c17..92ac618 100644 (file)
@@ -45,13 +45,13 @@ sub applies_to       { return 'PPI::Structure::List' }
 sub violates {
     my ( $self, $elem, undef ) = @_;
 
-    #Don't worry about subroutine calls
+    # Don't worry about subroutine calls
     my $sib = $elem->sprevious_sibling();
     return if !$sib;
     return if $sib->isa('PPI::Token::Word');
     return if $sib->isa('PPI::Token::Symbol');
 
-    #Get the list elements
+    # Get the list elements
     my $expr = $elem->schild(0);
     return if !$expr;
     my @children = $expr->schildren();
@@ -61,21 +61,20 @@ sub violates {
     for my $child ( @children ) {
         next if $child->isa('PPI::Token::Operator')  && $child eq $COMMA;
 
-        #All elements must be literal strings,
-        #of non-zero length, with no whitespace
+        # All elements must be literal strings,
+        # and must contain 1 or more word characters.
 
         return if ! _is_literal($child);
 
         my $string = $child->string();
-        return if $string =~ m{ \s }mx;
-        return if $string eq $EMPTY;
+        return if $string !~ m{\A [\w-]+ \z}mx;
         $count++;
     }
 
-    #Were there enough?
+    # Were there enough?
     return if $count < $self->{_min_elements};
 
-    #If we get here, then all elements were literals
+    # If we get here, then all elements were literals
     return $self->violation( $DESC, $EXPL, $elem );
 }
 
index 2bc6f53..8df31ac 100644 (file)
@@ -2,14 +2,24 @@
 ## failures 2
 ## cut
 
-@list = ('foo', 'bar', 'baz');
+@list = ('foo', 'bar', 'baz-bot');
 
 @list = ('foo',
         'bar',
-        'baz');
+        'baz-bot');
 
 #-----------------------------------------------------------------------------
+## name Non-word lists
+## failures 0
+## cut
+
+@list = ('3/4', '-123', '#@$%');
 
+@list = ('3/4',
+        '-123',
+        '#@$%');
+
+#-----------------------------------------------------------------------------
 ## name Basic passing
 ## failures 0
 ## cut
 @list = ('foo', 'bar', q{});
 @list = ('foo', 'bar', 1.0);
 @list = ('foo', 'bar', 'foo'.'bar');
-@list = ('foo, 'bar'); # XXX is this a typo?  What is this trying to test?
 @list = ($foo, 'bar', 'baz');
 @list = (foo => 'bar');
 %hash = ('foo' => 'bar', 'fo' => 'fum');
 my_function('foo', 'bar', 'fudge');
-$a_function->('foo', 'bar', 'fudge');
+$an_object->a_method('foo', 'bar', 'fudge');
 foreach ('foo', 'bar', 'nuts'){ do_something($_) }
 
 #-----------------------------------------------------------------------------
@@ -37,7 +46,7 @@ foreach ('foo', 'bar', 'nuts'){ do_something($_) }
 ## parms {min_elements => 4}
 ## cut
 
-@list = ('foo', 'bar, 'baz');
+@list = ('foo', 'bar', 'baz');
 
 #-----------------------------------------------------------------------------