File Coverage

blib/lib/App/PerlFuzzyTokenFinder.pm
Criterion Covered Total %
statement 11 45 24.4
branch 0 18 0.0
condition 0 6 0.0
subroutine 4 8 50.0
pod 0 2 0.0
total 15 79 18.9


line stmt bran cond sub pod time code
1             package App::PerlFuzzyTokenFinder;
2 1     1   573 use 5.008001;
  1         3  
3 1     1   4 use strict;
  1         14  
  1         17  
4 1     1   3 use warnings;
  1         2  
  1         17  
5              
6 1     1   419 use PPI;
  1         88360  
  1         336  
7              
8             our $VERSION = "0.01";
9              
10             sub tokenize {
11 0     0 0   my ($class, $expr) = @_;
12              
13 0           my $tokenizer = PPI::Tokenizer->new(\$expr);
14 0           my $exclude_whitespace = [ grep { ! $_->isa('PPI::Token::Whitespace') } @{$tokenizer->all_tokens} ];
  0            
  0            
15              
16 0           return $exclude_whitespace;
17             }
18              
19             # target_tokens: ArrayRef[PPI::Token]
20             # find_tokens: ArrayRef[PPI::Token]
21             sub matches {
22 0     0 0   my ($class, $target_tokens, $find_tokens) = @_;
23              
24 0           for my $start (@$target_tokens) {
25 0 0         return 1 if $class->_try_match($start, $find_tokens);
26             }
27              
28 0           return 0;
29             }
30              
31             sub _try_match {
32 0     0     my ($class, $target_token, $find_tokens) = @_;
33              
34 0           my $idx = 0;
35 0           while (1) {
36 0 0         last unless defined $target_token;
37              
38 0           my $find = $find_tokens->[$idx];
39              
40 0 0         return 1 unless defined $find;
41              
42 0 0         if ($find->content eq '...') {
43 0 0         return 0 if $target_token->content eq ';';
44              
45             # asterisk
46 0           my $find_next = $find_tokens->[$idx + 1];
47 0 0         return 1 unless defined $find_next;
48              
49 0 0 0       if ($class->_snext_token($target_token) && $class->_snext_token($target_token)->content eq $find_next->content) {
50 0           $target_token = $class->_snext_token($target_token);
51 0           $idx++;
52             } else {
53 0           $target_token = $class->_snext_token($target_token);
54             }
55             } else {
56 0 0         if ($target_token->content eq $find->content) {
57 0           $target_token = $class->_snext_token($target_token);
58 0           $idx++;
59             } else {
60 0           return 0;
61             }
62             }
63             }
64              
65 0           return 0;
66             }
67              
68             # point $token to next significant token
69             sub _snext_token {
70 0     0     my ($class, $token) = @_;
71              
72 0   0       do {
73 0           $token = $token->next_token;
74 0 0         return undef unless $token;
75             } while ($token && $token->isa('PPI::Token::Whitespace'));
76              
77 0           return $token;
78             }
79              
80              
81             1;
82             __END__