Branch Coverage

File:blib/lib/App/Test/Generator/SchemaExtractor.pm
Coverage:73.9%

line%coveragebranch
128050TFunless exists $params->{'input_file'}
1295100TFunless (-f $self->{'input_file'})
138450TFunless my $document = "PPI::Document"->new($self->{'input_file'})
1406100TFunless $params->{'no_write'}
1437100TFunless (defined $document)
1441100TFif (@$pkgs == 0)
144350TF$package_stmt ? :
144550TFif @$pkgs > 1
148950TFunless defined $name
1492100TFif ($name =~ /^_/ and not $name =~ /^_(new|init|build)/)
1493100TFunless $self->{'include_private'}
1510100TFif ($content =~ /\bclass\b/)
151850TFif ($content =~ /^\s*(before|after|around)\s+['"]?(\w+)['"]?\b/)
15280TFif ($next_sib and $next_sib->isa("PPI::Statement::Sub"))
154850TFif ($seen{$n}++) { }
1602100TFif $char eq "{"
1603100TFif $char eq "}"
160750TFif $depth != 0
162150TFif ($method_name =~ /^_/ and not $method_name =~ /^_(new|init|build)/)
16220TFunless $self->{'include_private'}
1685100TFif ($current->isa('PPI::Token::Pod')) { }
100TFelsif ($current->isa('PPI::Token::Comment')) { }
100TFelsif ($current->isa('PPI::Token::Whitespace') or $current->isa('PPI::Token::Separator')) { }
100TFelsif ($current->isa('PPI::Statement::Include')) { }
169050TFif ($comment =~ /#\s*(?:param|arg|input)\s+\$(\w+)\s*:\s*(.+)/i)
175650TFif ($method->{'fields'} and keys %{$$method{"fields"};})
1777100TFif ($self->{'strict_pod'})
1788100TFif (@validation_errors)
179650TFif ($self->{'strict_pod'} == 2) { }
1809100TFif ($validator_params) { }
1818100TFif (keys %$fields)
1846100TFif ($method->{'name'} ne "new" and $needs_object)
185350TFunless (ref $input_confidence)
187450TFif ($input_confidence->{'per_parameter'})
1893100TF$level_rank{$input_level} < $level_rank{$output_level} ? :
1899100TFif ($relationships and @{$relationships;})
1905100TFif keys %$attributes
1906100TFif keys %$postfix_derefs
1907100TFif keys %$fields
1910100TFif ($method->{'class'})
192050TFdefined $_ ? :
1928100TFif ($self->_method_has_numeric_intent($schema))
19340TFdefined $_ ? :
193950TFunless $seen{$v}++
194150TFdefined $v ? :
194250TFunless $seen{$key}++
194850TFif (keys %$hints)
1952100TFunless exists $schema->{'_yamltest_hints'}{$k}
1956100TFif ($level_rank{$overall} < $level_rank{$LEVEL_MEDIUM} and $level_rank{$overall} < $self->{'confidence_threshold'} * 4)
197450TFif ($schema->{'output'})
2043100TFif $schema->{'output'} and $schema->{'output'}{'type'} and $schema->{'output'}{'type'} =~ /^(number|integer)$/
2046100TFunless $schema->{'input'}
2047100TFif $p->{'optional'}
2048100TFif $p->{'type'} and $p->{'type'} =~ /^(number|integer)$/
2119100TFif (keys %fields_seen > 1)
212750TFif ($code =~ /\$self\s*->\s*\{\s*['"]?([^}'"]+)['"]?\s*\}\s*=\s*shift\s*;/ and $code =~ /return\s+\$self\s*->\s*\{\s*['"]?\Q$1\E['"]?\s*\}\s*;/ and $code =~ /if\s*\(\s*\@_/) { }
100TFelsif ($code =~ /if\s*\(\s*(?:\@_|[\$]\w+)/ and $code =~ /\$self\s*->\s*\{\s*['"]?([^}'"]+)['"]?\s*\}\s*=\s*(?:shift|\@_|\$_\[\d+\]|\$\w+)\b/x and $code =~ /return\b/) { }
100TFelsif ($code =~ /return\s+\$self\s*->\s*\{\s*['"]?([^}'"]+)['"]?\s*\}\s*;/) { }
100TFelsif ($code =~ /return\s+\$self\b/ and $code =~ /\$self\s*->\s*\{\s*['"]?([^}'"]+)['"]?\s*\}\s*=\s*\$(\w+)\s*;/) { }
21350TFunless (defined $property)
21360TFif ($code =~ /\$self\s*->\s*\{\s*['"]?([^}'"]+)['"]?\s*\}\s*=\s*shift\s*;/)
21560TFif (my $pod = $method->{'pod'})
21570TFif ($pod =~ /\b(LWP::UserAgent(::\w+)*)\b/)
218450TFunless (defined $property)
218550TFif ($code =~ /\$self\s*->\s*\{\s*['"]?([^}'"]+)['"]?\s*\}\s*=/)
2189100TFif ($code =~ /validate_strict/) { }
219550TFif ($code =~ /blessed\s*\(\s*\$(\w+)\s*\)/) { }
2224100TFif (my $pod = $method->{'pod'})
222550TFif ($pod =~ /\b(LWP::UserAgent(::\w+)*)\b/)
224350TFif (ref $schema->{'input'} eq "HASH")
224450TFif (scalar keys %{$$schema{"input"};} > 1)
2262100TFunless ($code =~ /\$self\s*->\s*\{\s*['"]?\Q$property\E['"]?\s*\}\s*=\s*(?:shift|\$\w+\s*=\s*shift|\@_|\$_\[\d+\])/)
2266100TFif (scalar @returns == scalar @self_returns)
2308100TFif ($schema->{'output'}{'_returns_self'}) { }
50TFelsif (scalar keys %{$$schema{'output'};} != 0) { }
230950TFif ($schema->{'output'}{'type'} ne "object")
231250TFif ($schema->{'output'}{'isa'} ne $self->{'_package_name'})
2323100TFif (exists $schema->{'accessor'})
232450TFif ($schema->{'accessor'}{'type'} and $schema->{'accessor'}{'type'} =~ /setter|getset/ and $schema->{'input'})
2328100TFif ($in->{'type'} and $in->{'type'} eq "object")
233150TF$in->{'isa'} ? :
2342100TFif ($schema->{'accessor'}{'type'} and $schema->{'accessor'}{'property'} and $schema->{'accessor'}{'type'} =~ /getter|getset/ and !defined($schema->{'output'}{'type'}) || $schema->{'output'}{'type'} eq 'string')
2344100TFif (my $pod = $method->{'pod'})
2346100TFif ($pod =~ /\bUser[- ]?Agent\b.*\bobject\b/i)
242150TFunless $res->{'input'}
50TFif $res and ref $res eq "HASH" and keys %{{} unless $res->{'input'};}
245550TFif ($child->isa("PPI::Statement") or $child->isa("PPI::Statement::Expression"))
24640TFif ($tokens[$i]->isa('PPI::Token::Word') || $tokens[$i]->isa('PPI::Token::Quote') and $tokens[$i + 1]->isa("PPI::Structure::Constructor"))
24730TFunless $key and $val
24770TFunless $inner->isa("PPI::Statement") or $inner->isa("PPI::Statement::Expression")
24840TFunless $k and $v
24870TF$v->can('content') ? :
24880TFif defined $value
24900TFif ($keyname eq 'type') { }
0TFelsif ($keyname eq 'optional') { }
0TFelsif ($keyname =~ /^(min|max)$/ and &looks_like_number($value)) { }
0TFelsif ($keyname eq 'matches') { }
24930TF$value ? :
254350TFif ref $code and $code->can("find")
2569100TFunless $code =~ /\bvalidate_strict\s*\(/
257150TFunless my $doc = $self->_ppi($code)
2574100TFif $_[1]->isa("PPI::Token::Word")
257550TFunless my $calls = $doc->find(sub {         $_[1]->content eq "validate_strict" or $_[1]->content eq "Params::Validate::Strict::validate_strict" if $_[1]->isa("PPI::Token::Word"); } )
258250TFunless (defined $list)
258450TFunless defined $next
2585100TFif ($next->content =~ /schema\s*=>\s*(\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})/s)
259250TFif (scalar keys %{$schema;})
260150TFunless $list
26050TFunless $schema_block
26080TFif $schema
2633100TFunless $code =~ /\bvalidate\s*\(/
263550TFunless my $doc = $self->_ppi($code)
2638100TFif $_[1]->isa("PPI::Token::Word")
263950TFunless my $calls = $doc->find(sub {         $_[1]->content eq "validate" or $_[1]->content eq "Params::Validate::validate" if $_[1]->isa("PPI::Token::Word"); } )
264650TFunless (defined $list)
265050TFif ($schema_text)
2657100TFif (scalar keys %{$schema;})
266050TFif (my $type = $field->{'type'})
266150TFif ($type eq 'ARRAYREF') { }
50TFelsif ($type eq 'SCALAR') { }
267850TFunless $list
26820TFunless $schema_block
26850TFif $schema
2724100TFif ($char eq '{') { }
100TFelsif ($char eq '}') { }
100TFelsif ($char eq ',' and $depth == 0) { }
272850TFif $depth < 0
2735100TFunless defined $comma_pos
2768100TFunless $code =~ /\bvalidated_hash\s*\(/
277050TFunless my $doc = $self->_ppi($code)
2773100TFif $_[1]->isa("PPI::Token::Word")
277450TFunless my $calls = $doc->find(sub {         $_[1]->content eq "validated_hash" if $_[1]->isa("PPI::Token::Word"); } )
278150TFunless (defined $list)
278550TFif ($schema_text)
279350TFif (scalar keys %{$schema;})
279650TFif (my $isa = delete $field->{'isa'})
2799100TFif (exists $field->{'required'}) { }
2801100TF$required ? :
2805100TFif (ref $field->{'default'} eq "CODE")
281250TFif (my $type = $field->{'type'})
281350TFif ($type eq 'ARRAYREF') { }
50TFelsif ($type eq 'SCALAR') { }
28300TFunless $list
28340TFunless $schema_block
28370TFif $schema
286650TFunless $block and $block->can("children")
28700TFunless $result and ref $result eq "HASH" and $result->{'input'}
2907100TFexists $spec->{'optional'} ? :
2942100TFunless my $function = $self->_extract_function_name($code)
2944100TFunless my $doc = $self->{'_document'}
294550TFunless my $stmt = $self->_find_signature_statement($doc, $function)
29470TFunless my $signature_expr = $self->_extract_signature_expression($stmt, $function)
29490TFunless my $meta = $self->_compile_signature_isolated($function, $signature_expr)
2971100TFif $code =~ /^\s*sub\s+([a-zA-Z0-9_]+)/
2995100TFif $_[1]->isa("PPI::Statement")
2997100TFunless my $statements = $doc->find(sub {         $_[1]->content =~ /^\s*signature_for\b/ if $_[1]->isa("PPI::Statement"); } )
300150TFif ($content =~ /^\s*signature_for\s+\Q$function\E\b/)
3031100TFif ($content =~ /^\s*signature_for\s+\Q$function\E\s*=>\s*(.+?);?\s*$/s)
30720TFif ($signature_expr =~ /\b(?:system|exec|open|fork|require|do|eval|qx)\b/)
30760TFif ($signature_expr =~ /[`{};]/)
31430TFif (my $sig = $compartment->reval($payload))
31790TFif ($stderr and length $stderr)
322850TFunless $meta->{'parameters'}
3231100TFunless (exists $type_map{$p->{'type'}})
3239100TF$p->{'optional'} ? :
3247100TFif (my $ret = $meta->{'returns'})
325050TFunless (exists $type_map{$ret->{'type'}})
3307100TFunless $pod
3314100TFif ($pod =~ /=head2\s+\w+\s*\(([^)]+)\)/s)
332050TFif @sig_params and $sig_params[0] =~ /^(self|class)$/i
3335100TFif ($pod =~ /(?:Parameters?|Arguments?|Inputs?):?\s*\n((?:\s*\$.*\n)+)/is) { }
100TFelsif ($pod =~ /^=head\d+\s+(?:Parameters?|Arguments?|Inputs?)\b.*?\n(.*?)(?=^=head|\Z)/ism) { }
3340100TFif ($param_section)
334650TFif ($line =~ /C<\$(\w+)>\s*\((Required|Mandatory)\)/i)
3354100TFif ($line =~ /^\s*\$(\w+)\s*-\s*(\w+)(?:\s*\(([^)]+)\))?\s*,?\s*(.*)$/i or $line =~ /^\s*C<\$(\w+)>\s*-\s*(\w+)(?:\s*\(([^)]+)\))?\s*,?\s*(.*)$/i)
3359100TFif $desc
3362100TFif $name =~ /^(self|class|return|returns?)$/i
3367100TFunless (exists $params{$name}{'position'})
337350TFif $type eq "int"
337450TFif $type eq "num" or $type eq "float"
337550TFif $type eq "bool"
337650TFif $type eq "array"
337750TFif $type eq "hash"
3382100TFif ($constraint)
3388100TFif ($full_text =~ /optional/i) { }
100TFelsif ($full_text =~ /required|mandatory/i) { }
3397100TFif ($desc =~ /\b(email|url|uri|path|filename)\b/i)
3404100TFif ($desc and $desc =~ m[matches?\s+(/[^/]+/|qr/.+?/)]i)
3408100TF$constraint ? :
100TF$desc ? :
3420100TFif exists $params{$name}
342350TFif $desc
3426100TFif $name =~ /^(self|class|return|returns?)$/i
343150TFif $type eq "int"
343250TFif $type eq "num" or $type eq "float"
343350TFif $type eq "bool"
343450TFif $type eq "array"
343550TFif $type eq "hash"
344050TFif ($constraint)
344550TFif ($desc)
344650TFif ($desc =~ /optional/i) { }
50TFelsif ($desc =~ /required|mandatory/i) { }
345350TFif ($desc =~ m[matches?\s+(/[^/]+/|qr/.+?/)]i)
345850TF$constraint ? :
346850TFunless defined $name and length $name
347350TFif $name =~ /^(self|class|return|returns?)$/i
347950TFif ($desc =~ /^\s*(string|integer|int|number|num|float|boolean|bool|array|arrayref|hash|hashref)\b(?:\s*\(([^)]+)\))?/i) { }
34840TFif $type eq "int"
34850TFif $type eq "num" or $type eq "float"
34860TFif $type eq "bool"
34870TFif $type eq "array"
34880TFif $type eq "hash"
34920TFif ($constraint)
349950TFif ($desc =~ /\bstring\b/i) { }
50TFelsif ($desc =~ /\b(int|integer)\b/i) { }
50TFelsif ($desc =~ /\b(num|number|float)\b/i) { }
50TFelsif ($desc =~ /\b(bool|boolean)\b/i) { }
351150TFif ($desc =~ /optional/i) { }
50TFelsif ($desc =~ /required|mandatory/i) { }
351850TFif ($desc =~ m[matches?\s+(/[^/]+/|qr/.+?/)]i)
352850TFif (exists $params{$param})
3530100TFunless defined $params{$param}{'optional'}
3533100TFdefined $pod_defaults->{$param} ? :
354050TFif $name =~ /^(self|class)$/i
3592100TFif keys %output
3595100TFkeys %output ? :
3626100TFif ($pod)
3629100TFif ($pod =~ /Returns?:\s+([^\n]+(?:\n[^\n]+){0,2})/is)
3636100TFif ($returns_desc =~ /\b(string|text)\b/i) { }
100TFelsif ($returns_desc =~ /\b(integer|int|count)\b/i) { }
50TFelsif ($returns_desc =~ /\b(float|decimal|number)\b/i) { }
100TFelsif ($returns_desc =~ /\b(boolean|true|false)\b/i) { }
50TFelsif ($returns_desc =~ /\b(array|list)\b/i) { }
50TFelsif ($returns_desc =~ /\b(hash|hashref|dictionary)\b/i) { }
100TFelsif ($returns_desc =~ /\b(object|instance)\b/i) { }
50TFelsif ($returns_desc =~ /\bundef\b/i) { }
3655100TFif ($returns_desc =~ /\b1\s+(?:on\s+success|if\s+successful)\b/i) { }
50TFelsif ($returns_desc =~ /\b0\s+(?:on\s+failure|if\s+fail)\b/i) { }
50TFelsif ($returns_desc =~ /dies\s+on\s+(?:error|failure)/i) { }
365750TFif (defined $output->{'type'} and $output->{'type'} eq 'scalar') { }
3669100TFif ($returns_desc =~ /\b(true|false)\b/i)
367250TFif ($returns_desc =~ /\bundef\b/i)
3678100TFif (not $output->{'type'} and $pod =~ /returns?\s+(?:an?\s+)?(\w+)/i)
3681100TFif $type =~ /^(true|false|bool)$/
368350TFif $type eq "int"
368450TFif $type =~ /^(num|float)$/
368550TFif $type eq "array"
368650TFif $type eq "hash"
368850TFif ($type =~ /^\d+$/)
36890TFif ($type eq '1' or $type eq '0') { }
36910TFif ($pod =~ /1 on success.+0 (on|if) /i) { }
0TFelsif ($pod =~ /return 0 .+ 1 on success/) { }
370350TFif not $type and $pod =~ /returns?\s+.+\slist\b/i
3705100TFif ($VALID_OUTPUT_TYPES{$type}) { }
374350TFunless $pod
375650TFif @param_matches
375850TFif ($param)
376050TFif ($default_text =~ /(\w+)\s*=\s*(.+)$/) { }
378050TFif (@param_matches)
381850TFif ($code)
3821100TFif (@all_returns)
3828100TFif $ret =~ /^(?:0|1)(?:\s|$)/
3832100TFif ($boolean_count >= 2 and $boolean_count >= $total_count * "0.8")
383350TFunless ($output->{'type'})
3842100TFif ($code =~ /return\s+bless\s*\{[^}]*\}\s*,\s*['"]?(\w+)['"]?/s) { }
100TFelsif ($code =~ /return\s+bless/s) { }
100TFelsif ($code =~ /return\s*\(\s*[^)]+\s*,\s*[^)]+\s*\)\s*;/) { }
50TFelsif ($code =~ /return\s+bless[^,]+,\s*__PACKAGE__/) { }
50TFelsif ($code =~ /return\s*\(([^)]+)\)/) { }
100TFelsif ($code =~ /return\s+\$self\s*;/ and $code =~ /\$self\s*->\s*\{[^}]+\}\s*=/) { }
384550TFif ($method_name eq 'new') { }
38470TFif ($self->{'_document'} and my $package_stmt = $self->{'_document'}->find_first("PPI::Statement::Package"))
3857100TFif ($method_name eq 'new') { }
38710TFif ($self->{'_document'})
38730TF$pkg ? :
38790TFif ($content =~ /,/)
388550TFif ($self->{'_document'})
388750TF$pkg ? :
3899100TFif (@return_statements) { }
3905100TFif ($output->{'type'})
3913100TFif ($ret eq '1' or $ret eq '0') { }
100TFelsif ($ret =~ /^['"]/) { }
100TFelsif ($ret =~ /^-?\d+$/) { }
50TFelsif ($ret =~ /^-?\d+\.\d+$/) { }
100TFelsif ($ret eq 'undef') { }
50TFelsif ($ret =~ /^\[/) { }
100TFelsif ($ret =~ /^\{/) { }
100TFelsif ($ret =~ m[                                    # Numeric expressions (heuristic, medium confidence)                                    # Don't match ->                                (?:                                    \+ | -\b | \* | / | %                                  | \+\+ | --                                )                            ]x) { }
50TFelsif ($ret =~ /\|\|\s*\d+\b/) { }
50TFelsif ($ret =~ /^length[\s\(]/) { }
50TFelsif ($ret =~ /^pos[\s\(]/) { }
50TFelsif ($ret =~ /^index[\s\(]/) { }
50TFelsif ($ret =~ /^rindex[\s\(]/) { }
50TFelsif ($ret =~ /^ord[\s\(]/) { }
100TFelsif ($ret =~ /=/ and $ret =~ /\$\w+/) { }
100TFelsif ($ret =~ /\$\w+/) { }
395850TFif ($ret =~ /\b\d+\b/) { }
396750TFif ($ret =~ /\\\@/) { }
50TFelsif ($ret =~ /\\\%/) { }
100TFelsif ($ret =~ /bless/) { }
50TFelsif ($ret =~ /^\{[^}]*\}$/) { }
50TFelsif ($ret =~ /^\[[^\]]*\]$/) { }
3984100TFif (keys %return_types)
3987100TFif ($return_types{'integer'} and not $return_types{'string'})
398850TFif (not $output->{'type'} or $output->{'type'} eq "scalar")
399250TFif (defined $min)
3997100TFunless ($output->{'type'})
4001100TFif ($most_common eq "number")
400350TFif (defined $min)
4013100TFif (@return_statements == 1 and $return_statements[0] eq 1)
401550TFif not $output->{'type'} or $output->{'type'} eq "scalar"
401650TFif $output->{'type'}
4057100TFunless not $output->{'type'} or $output->{'type'} eq "unknown"
4060100TFif ($pod and not $output->{'type'})
406250TFif ($pod =~ /returns?\s+(true|false|true|false|1|0)\s+(?:on|for|upon)\s+(success|failure|error|valid|invalid)/i)
406850TFif ($pod =~ /(?:method|sub)\s+(\w+)/)
40700TFif ($inferred_method_name =~ /^(is_|has_|can_|should_|contains_|exists_)/)
407850TFif ($code)
408350TFif ($true_returns + $false_returns >= 2) { }
100TFelsif ($true_returns + $false_returns == 1) { }
409250TFif ($code =~ /return\s+(?:\w+\s*[!=]=\s*\w+|\w+\s*>\s*\w+|\w+\s*<\s*\w+)\s*\?\s*(?:1|0)\s*:\s*(?:1|0)/)
409850TFif ($code =~ /return\s+[!\$\@\%]/)
410650TFif ($method_name)
4107100TFif ($method_name =~ /^(is_|has_|can_|should_|contains_|exists_|check_|verify_|validate_)/)
411150TFif ($method_name =~ /_ok$/)
4119100TFif ($boolean_score >= $BOOLEAN_SCORE_THRESHOLD)
412050TFif (not $output->{'type'} or $output->{'type'} eq "scalar" or $output->{'type'} eq "array" or $output->{'type'} eq "undef")
415050TFunless $code
4153100TFif ($code =~ /wantarray/)
4158100TFif ($code =~ /(wantarray[^;]+;)/s)
4162100TFif ($code =~ /wantarray\s*\?\s*\(([^)]+)\)\s*:\s*([^;]+)/s) { }
100TFelsif ($code =~ /wantarray\s*\?\s*([^:]+?)\s*:\s*([^;]+)/s) { }
50TFelsif ($code =~ /return[^;]*unless\s+wantarray.*?return\s*\(([^)]+)\)/s) { }
4191100TFif ($code =~ /return\s*\(\s*([^)]+)\s*\)\s*;/)
4197100TFif $char eq "(" or $char eq "[" or $char eq "{"
4198100TFif $char eq ")" or $char eq "]" or $char eq "}"
4199100TFif $char eq "," and $depth == 0
420250TFif ($comma_count > 0 and not $content =~ /\b(?:bless|new)\b/)
420450TFunless ($output->{'type'} and $output->{'type'} eq "boolean")
423750TFunless $code
4251100TFif ($method_name =~ /$void_patterns->{$type}/)
4271100TFif $ret eq ""
4272100TFif $ret =~ /^(if|unless)\s/
4273100TFif $ret eq 1
4274100TFif $ret eq "\$self"
4275100TFif ($ret =~ /\?\s*1\s*:\s*0\b/)
4288100TFif ($no_value_returns > 0 and $no_value_returns == $total_returns) { }
100TFelsif ($true_returns > 0 and $true_returns == $total_returns and $total_returns >= 1) { }
4296100TFunless ($output->{'type'} and $output->{'type'} eq "boolean")
432650TFunless $code
4336100TFif $ret eq "\$self"
4340100TFif ($self_returns > 0 and $total_returns > 0)
4343100TFif ($ratio >= "0.8")
4348100TFif ($self->{'_document'})
435050TF$pkg ? :
438450TFunless $code
4403100TFif ($code =~ /return\s*\(\s*\)\s*(?:if|unless|;)/)
4413100TFif ($1 eq '0') { }
4420100TFif ($zero_returns > 0 and $one_returns > 0)
4426100TFif ($code =~ /eval\s*\{/)
442850TFif ($code =~ /eval\s*\{.*?\}[^}]*(?:if\s*\(\s*\$\@|catch|return\s+undef)/s)
443950TFif ($has_undef and $has_value and scalar @all_returns >= 2)
4445100TFif (scalar keys %error_patterns) { }
4449100TFif ($error_patterns{'undef_on_error'}) { }
100TFelsif ($error_patterns{'implicit_undef'}) { }
100TFelsif ($error_patterns{'empty_list'}) { }
100TFelsif ($error_patterns{'zero_on_error'}) { }
4463100TFif ($error_patterns{'exception_handling'})
4495100TFunless defined $expr
4500100TFif ($expr =~ /,/)
4504100TFif $char =~ /[\(\[\{]/
4505100TFif $char =~ /[\)\]\}]/
4506100TFif $char eq "," and $depth == 0
4509100TFif ($comma_count > 0)
4515100TFif ($expr =~ /^\@\w+/ or $expr =~ /^qw\(/ or $expr =~ /^\@\{/)
4520100TFif ($expr =~ /scalar\s*\(/)
4525100TFif ($expr =~ /^\[/ or $expr =~ /^\\\@/)
4530100TFif ($expr =~ /^\{/ or $expr =~ /^\\\%/)
453550TFif ($expr =~ /^\%\w+/ or $expr =~ /^\%\{/)
4540100TFif ($expr =~ /^['"]/ or $expr =~ /['"]$/)
4546100TFif ($expr =~ /^[01]$/)
4551100TFif ($expr =~ /^-?\d+$/)
4555100TFif ($expr =~ /^-?\d+\.\d+$/)
456050TFif ($expr =~ /bless/)
4564100TFif ($expr =~ /\blength\s*\(/)
4592100TFunless $pod
4595100TFif ($pod =~ /returns?\s+(?:\$)?self\b/i or $pod =~ /chainable/i or $pod =~ /fluent\s+interface/i or $pod =~ /method\s+chaining/i)
4627100TFif (defined $output->{'type'} and $output->{'type'} eq "boolean" and not defined $output->{'value'})
463050TFif ($output->{'value'} and defined $output->{'type'} and $output->{'type'} ne "boolean")
4634100TFif (exists $output->{'type'})
4635100TFif (not $valid_types{$output->{'type'}})
4667100TFif ($constraint =~ /(\d+)\s*-\s*(\d+)/) { }
100TFelsif ($constraint =~ /(\d+)\s*\.\.\s*(\d+)/) { }
100TFelsif ($constraint =~ /(?:min|minimum|at least)\s*(\d+)/i) { }
100TFelsif ($constraint =~ /(?:max|maximum|up to)\s*(\d+)/i) { }
100TFelsif ($constraint =~ /positive/i) { }
100TFelsif ($constraint =~ /non-negative/i) { }
50TFelsif ($constraint =~ /(.+)?\s(.+)/) { }
4686100TFif $param->{'type'} and $param->{'type'} eq "integer"
4687100TFif $param->{'type'} and $param->{'type'} eq "number"
46940TFif (&looks_like_number($val))
46950TFif ($op eq '<') { }
0TFelsif ($op eq '<=') { }
0TFelsif ($op eq '>') { }
0TFelsif ($op eq '>=') { }
4707100TFif (defined $param->{'max'})
4710100TFif (defined $param->{'min'})
4759100TFif ($params{$param}{'_default'} and not $params{$param}{'type'})
4761100TFif (ref $default eq 'HASH') { }
100TFelsif (ref $default eq 'ARRAY') { }
477150TFif ($code =~ /(croak|die)\(.*\)\s+if\s*\(\s*scalar\(\@_\)\s*<\s*(\d+)\s*\)/s) { }
50TFelsif ($code =~ /(croak|die)\(.*\)\s+if\s*\(\s*scalar\(\@_\)\s*==\s*(0)\s*\)/s) { }
478750TFif ($param_count++ > $self->{'max_parameters'})
4800100TFif ($code =~ /defined\s*\(\s*\$$param\s*\)/)
4806100TFif ($code =~ m[\s*\$$param\s*(?://|\|\|)=]) { }
100TFelsif ($code =~ m[\s*\$$param\s*(?:[\+\-\*/%]|(?:\+\+)|(?:--)|(?:[\+\-\*/%]=)|\+\$|\$[+-])]) { }
50TFelsif ($code =~ /\$\b$param\b\s*(?:\+0|\*1)/) { }
482650TFif ($code =~ /if\s*\(\s*!\s*defined\s*\(\s*\$$param\s*\)\s*\)\s*\{([^}]+)\}/s)
48280TFif ($block =~ /\b(croak|die|confess)\b/)
483550TFif ($code =~ /\b(croak|die|confess)\b[^;]*\bunless\s+defined\s*\(\s*\$$param\s*\)/)
484150TFif ($code =~ /exists\s*\(\s*\$$param\s*\)/)
484750TFif ($code =~ /scalar\s*\(\s*\@?\$$param\s*\)/)
4884100TFif ($code =~ /ref\s*\(\s*\$$param\s*\)\s*eq\s*['"](ARRAY|HASH|SCALAR)['"]/gi) { }
100TFelsif ($code =~ /\$$param\s*->\s*isa\s*\(\s*['"]([^'"]+)['"]\s*\)/i) { }
50TFelsif ($code =~ /bless\s+.*\$$param/) { }
488650TF$reftype eq 'hash' ? :
100TF$reftype eq 'array' ? :
4903100TFunless ($p->{'type'})
490450TFif ($code =~ /\@\{\s*\$$param\s*\}/ or $code =~ /push\s*\(\s*\@?\$$param/) { }
100TFelsif ($code =~ /\%\{\s*\$$param\s*\}/ or $code =~ /\$$param\s*->\s*\{/) { }
4912100TFif (not $p->{'type'} and exists $p->{'_default'})
491450TFif (ref $default eq 'HASH') { }
50TFelsif (ref $default eq 'ARRAY') { }
4926100TFif (not $p->{'type'})
4928100TFif ($code =~ m[\$$param\s*[\+\-\*/%]] or $code =~ m[[\+\-\*/%]\s*\$$param] or $code =~ /\bint\s*\(\s*\$$param\s*\)/ or $code =~ /\babs\s*\(\s*\$$param\s*\)/) { }
100TFelsif ($code =~ /\$$param\s*(?:==|!=|<=|>=|<|>)/ or $code =~ /(?:==|!=|<=|>=|<|>)\s*\$$param/) { }
502050TFunless defined $param and $param =~ /^\w+$/
5023100TFif ($code =~ /\$$param\s*->\s*isa\s*\(\s*['"]DateTime['"]\s*\)/i)
5032100TFif ($code =~ /\$$param\s*->\s*(ymd|dmy|mdy|hms|iso8601|epoch|strftime)/)
504150TFif ($code =~ /\$$param\s*->\s*isa\s*\(\s*['"]Time::Piece['"]\s*\)/i or $code =~ /\$$param\s*->\s*(strftime|epoch|year|mon|mday)/)
5051100TFif ($code =~ m[\$$param\s*=~\s*/.*?\\d\{4\}.*?\\d\{2\}.*?\\d\{2\}])
5060100TFif ($code =~ m[\$$param\s*=~\s*/.*?[Tt].*?[Zz].*?/])
506950TFif ($code =~ /\$$param\s*>\s*\d{9,}/ or $code =~ /time\(\s*\)\s*-\s*\$$param/ or $code =~ /\$$param\s*-\s*time\(\s*\)/)
508050TFif ($code =~ /strptime\s*\(\s*\$$param/ or $code =~ /DateTime::Format::\w+\s*->\s*parse_datetime\s*\(\s*\$$param/)
511350TFunless defined $param and $param =~ /^\w+$/
5116100TFif ($code =~ /(?:open|close|read|print|say|sysread|syswrite)\s*\(?\s*\$$param/)
5125100TFif ($code =~ /\$$param\s*->\s*(readline|getline|print|say|close|flush|autoflush)/)
5134100TFif ($code =~ /(?:-[frwxoOeszlpSbctugkTBMAC])\s+\$$param/)
514250TFif ($code =~ /File::(?:Spec|Basename)::\w+\s*\(\s*\$$param/ or $code =~ /(?:basename|dirname|fileparse)\s*\(\s*\$$param/)
515250TFif (defined $p->{'_default'} and $p->{'_default'} =~ m[^([A-Za-z]:\\|/|\./|\.\./)])
516050TFif ($code =~ /\$$param\s*->\s*isa\s*\(\s*['"]IO::File['"]\s*\)/ or $code =~ /IO::File\s*->\s*new\s*\(\s*\$$param/)
519350TFunless defined $param and $param =~ /^\w+$/
5196100TFif ($code =~ /ref\s*\(\s*\$$param\s*\)\s*eq\s*['"]CODE['"]/i)
520450TFif ($code =~ /\$$param\s*->\s*\(/ or $code =~ /\$$param\s*->\s*\(\s*\@_\s*\)/ or $code =~ /&\s*\{\s*\$$param\s*\}/)
5214100TFif ($param =~ /^(?:callback|cb|handler|sub|code|fn|func|on_\w+)$/i)
522250TFif ($code =~ /blessed\s*\(\s*\$$param\s*\)/ and $code =~ /ref\s*\(\s*\$$param\s*\)\s*eq\s*['"]CODE['"]/i)
526150TFunless defined $param and $param =~ /^\w+$/
5265100TFif ($code =~ m[unless\s+\$$param\s*=~\s*/\^?\(([^)]+)\)])
526850TFunless $p->{'type'}
5278100TFif ($code =~ /\%(\w+)\s*=.*?qw\s*[\(\[<{]([^)\]>}]+)[\)\]>}]/)
5281100TFif (defined $values_str and $code =~ /\$$hash_name\s*\{\s*\$$param\s*\}/)
528350TFunless $p->{'type'}
5293100TFif ($code =~ /grep\s*\{[^}]*\$${param}[^}]*\}\s*qw\s*[\(\[<{]([^)\]>}]+)[\)\]>}]/)
529650TFunless $p->{'type'}
530450TFif ($code =~ /given\s*\(\s*\$$param\s*\)/)
53090TFif (@enum_values >= 2)
53100TFunless $p->{'type'}
5327100TFif (@if_values >= 3)
532850TFunless $p->{'type'}
533750TFif ($code =~ /\$$param\s*~~\s*\[([^\]]+)\]/ or $code =~ /\$$param\s*~~\s*qw\s*[\(\[<{]([^)\]>}]+)[\)\]>}]/)
53410TFif ($values_str =~ /['"]/) { }
53460TFif (@enum_values)
53470TFunless $p->{'type'}
5400100TFunless $condition =~ /\$$param\b/
5417100TFif ($condition =~ /\$$param\s*([!<>=]=?|eq|ne|lt|gt|le|ge)\s*(.+)/) { }
100TFelsif ($condition =~ /length\s*\(\s*\$$param\s*\)\s*([<>=!]+)\s*(\d+)/) { }
50TFelsif ($condition =~ /\$$param\s*==\s*0/) { }
5428100TFif $constraint
5429100TFif defined $message
5431100TFdefined $message ? :
5438100TFif ($code =~ /\b\Q$param\E\s*(<=|<|>=|>)\s*(-?\d+)/)
5444100TFif ($op eq '<=') { }
100TFelsif ($op eq '<') { }
100TFelsif ($op eq '>=') { }
50TFelsif ($op eq '>') { }
5498100TFif ($code =~ /sub\s+\w+\s*(?::\w+(?:\([^)]*\))?\s*)*\(((?:[^()]|\([^)]*\))*)\)\s*\{/s)
5502100TFif ($potential_sig =~ /[\$\%\@]/)
5510100TFif ($code =~ /my\s*\(\s*([^)]+)\)\s*=\s*\@_/s) { }
100TFelsif ($code =~ /my\s+\$self\s*=\s*shift/) { }
5517100TFif $name =~ /^(self|class)$/i
552450TFunless exists $params->{$name}{'position'}
553550TFif @shifts and $shifts[0] =~ /^(self|class)$/i
554450TFif ($code =~ /my\s*\(\s*([^)]+)\)\s*=\s*\@_/s)
55490TFif $param =~ /^(self|class)$/i
55570TFif ($seen{$param}++)
559350TFif ($char eq '(' or $char eq '[' or $char eq '{') { }
50TFelsif ($char eq ')' or $char eq ']' or $char eq '}') { }
100TFelsif ($char eq ',' and $depth == 0) { }
560650TFif $current =~ /\S/
561450TFunless $part
561950TFif ($param_info)
5623100TFif ($name =~ /^(self|class)$/i)
5630100TF$param_info->{'optional'} ? :
100TF$param_info->{'_default'} ? :
5675100TFif ($part =~ /^\$(\w+)\s*:\s*(\w+)\s*=\s*(.+)$/s) { }
100TFelsif ($part =~ /^\$(\w+)\s*:\s*(\w+)\s*$/s) { }
100TFelsif ($part =~ /^\$(\w+)\s*=\s*(.+)$/s) { }
100TFelsif ($part =~ /^\$(\w+)$/s) { }
100TFelsif ($part =~ /^\@(\w+)$/s) { }
100TFelsif ($part =~ /^\%(\w+)$/s) { }
5684100TFif ($constraint =~ /^(Int|Integer)$/i) { }
100TFelsif ($constraint =~ /^(Num|Number)$/i) { }
50TFelsif ($constraint =~ /^(Str|String)$/i) { }
0TFelsif ($constraint =~ /^(Bool|Boolean)$/i) { }
0TFelsif ($constraint =~ /^(Array|ArrayRef)$/i) { }
0TFelsif ($constraint =~ /^(Hash|HashRef)$/i) { }
5709100TFif ($constraint =~ /^(Int|Integer)$/i) { }
100TFelsif ($constraint =~ /^(Num|Number)$/i) { }
100TFelsif ($constraint =~ /^(Str|String)$/i) { }
100TFelsif ($constraint =~ /^(Bool|Boolean)$/i) { }
100TFelsif ($constraint =~ /^(Array|ArrayRef)$/i) { }
50TFelsif ($constraint =~ /^(Hash|HashRef)$/i) { }
573550TFif $self->can("_infer_type_from_default")
5789100TFunless defined $default
5791100TFif (ref $default eq 'HASH') { }
100TFelsif (ref $default eq 'ARRAY') { }
100TFelsif ($default =~ /^-?\d+$/) { }
100TFelsif ($default =~ /^-?\d+\.\d+$/) { }
50TFelsif ($default eq '1' or $default eq '0') { }
5838100TFif ($code =~ /sub\s+\w+\s+((?::\w+(?:\([^)]*\))?\s*)+)/s)
5843100TFif ($attr_section)
5847100TFif (defined $value and $value ne '') { }
5858100TFif ($attributes{'Returns'})
586050TFif ($return_type ne 1)
5865100TFif ($attributes{'lvalue'})
5869100TFif ($attributes{'method'})
5903100TFif ($code =~ /\$\w+\s*->\s*\@\*/)
5909100TFif ($code =~ /\$\w+\s*->\s*\%\*/)
5915100TFif ($code =~ /\$\w+\s*->\s*\$\*/)
5921100TFif ($code =~ /\$\w+\s*->\s*\&\*/)
5927100TFif ($code =~ /\$\w+\s*->\s*\@\[/)
5933100TFif ($code =~ /\$\w+\s*->\s*\%\{/)
5982100TFif ($modifiers =~ /:param(?:\(([^)]+)\))?/)
5985100TFif (defined $1) { }
5997100TFif ($modifiers =~ /=\s*([^:;]+)(?::|;|$)/)
600250TFdefined $field_info{'_default'} ? :
6006100TFif ($modifiers =~ /:isa\(([^)]+)\)/)
6053100TFunless $field->{'is_param'}
606250TFunless $p->{'_source'}
6063100TFif $field_name ne $param_name
6065100TFif ($field->{'_default'})
6070100TFif ($field->{'isa'})
6115100TFunless exists $params->{$param}
612550TFunless exists $params->{$param}
613550TFunless exists $params->{$param}
614550TFunless exists $params->{$param}
615550TFunless exists $params->{$param}
6165100TFunless exists $params->{$param}
61900TFunless exists $params->{$param}
620050TFunless exists $params->{$param}
6211100TFif (not keys %{$params;})
6218100TFif ($var eq 'class' and $position == 0 and $method->{'name'} eq 'new') { }
50TFelsif ($var eq 'self' and $position == 0 and $method->{'name'} ne 'new') { }
623450TFif ($var eq 'class' and $position == 0 and $method->{'name'} eq 'new') { }
50TFelsif ($var eq 'self' and $position == 0 and $method->{'name'} ne 'new') { }
62490TFif ($var ne "class" or $position > 0 or $method->{'name'} ne "new")
6277100TFunless defined $default
6278100TFif ref $default
6314100TFif ($code =~ /(die|croak|confess)\b[^{;]*\bif\b[^{;]*\$$param\b/s)
6319100TFif ($code =~ /length\s*\(\s*\$$param\s*\)\s*([<>]=?)\s*(\d+)/)
6322100TFif ($op eq '<') { }
50TFelsif ($op eq '<=') { }
100TFelsif ($op eq '>') { }
50TFelsif ($op eq '>=') { }
6335100TFif (not $guarded and $code =~ /\$$param\s*([<>]=?)\s*([+-]?(?:\d+\.?\d*|\.\d+))/)
63400TF&looks_like_number($val) ? :
6342100TFif ($op eq '<' or $op eq '<=') { }
50TFelsif ($op eq '>' or $op eq '>=') { }
634450TF$op eq '<' ? :
634550TFif not defined $p->{'max'} or $max < $p->{'max'}
6347100TF$op eq '>' ? :
634850TFif not defined $p->{'min'} or $min > $p->{'min'}
6353100TFif ($code =~ m[\$$param\s*=~\s*((?:qr?/[^/]+/|\$[\w:]+|\$\{\w+\}))])
635850TFif ($pattern =~ m[^qr?/([^/]+)/$]) { }
6399100TFif ($code =~ /(?:die|croak|confess)\s+[^;]*unless\s+(?:defined\s+)?\$$param/s)
6405100TFif (defined $default_value and not exists $p->{'_default'})
6410100TFunless ($p->{'type'})
641150TFif (&looks_like_number($default_value)) { }
0TFelsif (ref $default_value eq 'ARRAY') { }
0TFelsif (ref $default_value eq 'HASH') { }
0TFelsif ($default_value eq 'undef') { }
0TFelsif (defined $default_value and not ref $default_value) { }
641250TF$default_value =~ /\./ ? :
642450TFref $default_value ? :
6429100TFif (not $default_value || exists $p->{'_default'} and $code =~ /\$$param\s*=\s*([^;{}]+?)(?:\s*[;}])/s)
643250TFunless ($assignment =~ /\$$param/ or $assignment =~ /^shift/)
6436100TFif (defined $possible_default)
6445100TFif ($is_required)
6447100TFif exists $p->{'_default'}
6499100TFif $pod->{$param} and defined $pod->{$param}{'position'}
650050TFif $sig->{$param} and defined $sig->{$param}{'position'}
6501100TFif $code->{$param} and defined $code->{$param}{'position'}
6504100TFif (@positions)
65070TFunless $pos_count{$b} <=> $pos_count{$a}
650850TFunless exists $p->{'position'}
6512100TFif ($pod->{$param})
6517100TFif ($code->{$param})
6519100TFif $key eq "_source"
6520100TFif $key eq "position"
6524100TFif (not exists $p->{$key} or $key eq "type" and $from_pod and $p->{'type'} eq "string" and $code->{$param}{$key} ne "string")
653350TFif ($sig->{$param})
65350TFif $key eq "_source"
65360TFif $key eq "position"
6549100TFif ($self->{'verbose'})
655550TFdefined $p->{'optional'} ? :
6586100TF$pod_param ? :
6587100TF$code_param ? :
6590100TFif (defined $pod_optional) { }
100TFelsif (defined $code_optional) { }
100TFelsif (keys %$merged_param > 0) { }
6640100TFunless keys %$params
6652100TFif ($p->{'type'}) { }
6653100TFif ($p->{'type'} eq 'string' and $p->{'min'} || $p->{'max'} || $p->{'matches'}) { }
100TFelsif ($p->{'type'} eq 'string') { }
6668100TFif (defined $p->{'min'})
6672100TFif (defined $p->{'max'})
6676100TFif (defined $p->{'optional'})
6680100TFif ($p->{'matches'})
6684100TFif ($p->{'isa'})
6690100TFif (defined $p->{'position'})
6696100TFif (exists $p->{'_default'})
6702100TFif ($p->{'semantic'})
671650TF$count ? :
6719100TF$count == 1 ? :
672550TFif (@sorted_params)
6730100TFif (@sorted_params > 1)
6739100TFif ($avg >= $CONFIDENCE_HIGH_THRESHOLD) { }
100TFelsif ($avg >= $CONFIDENCE_MEDIUM_THRESHOLD) { }
50TFelsif ($avg >= $CONFIDENCE_LOW_THRESHOLD) { }
6788100TFunless keys %$output
6793100TFif ($output->{'type'}) { }
6801100TFif (defined $output->{'value'})
6807100TFif ($output->{'isa'})
6813100TFif ($output->{'_context_aware'})
681750TFif ($output->{'_list_context'})
6820100TFif ($output->{'_scalar_context'})
6826100TFif ($output->{'_error_return'})
6832100TFif ($output->{'_success_failure_pattern'})
6838100TFif ($output->{'_returns_self'})
6844100TFif ($output->{'_void_context'})
6850100TFif ($output->{'_error_handling'} and $output->{'_error_handling'}{'exception_handling'})
6859100TFif ($score >= $CONFIDENCE_HIGH_THRESHOLD) { }
100TFelsif ($score >= $CONFIDENCE_MEDIUM_THRESHOLD) { }
100TFelsif ($score >= $CONFIDENCE_LOW_THRESHOLD) { }
6901100TFunless $schema->{'_analysis'}
691350TFif ($analysis->{'confidence_factors'}{'input'})
692450TFif ($analysis->{'confidence_factors'}{'output'})
693350TFif ($analysis->{'per_parameter_scores'})
6974100TFunless ($p->{'type'})
6978100TFunless (defined $p->{'optional'})
7020100TFunless ref $p eq "HASH"
7021100TFunless ($p->{'type'})
7064100TFif ($code =~ /my\s*\(\s*\$\w+\s*,\s*(.+?)\)\s*=\s*\@_/s)
7069100TFunless @param_names
7117100TFif ($rel->{'type'} eq 'mutually_exclusive') { }
100TFelsif ($rel->{'type'} eq 'required_group') { }
100TFelsif ($rel->{'type'} eq 'conditional_requirement') { }
50TFelsif ($rel->{'type'} eq 'dependency') { }
100TFelsif ($rel->{'type'} eq 'value_constraint') { }
50TFelsif ($rel->{'type'} eq 'value_conditional') { }
7133100TFunless ($seen{$sig}++)
7169100TFif $param1 eq $param2
7172100TFif ($code =~ /(?:die|croak|confess)[^;]*if\s+\$$param1\s+&&\s+\$$param2/ or $code =~ /(?:die|croak|confess)[^;]*if\s+\$$param2\s+&&\s+\$$param1/)
7178100TFif ($rel->{'type'} eq "mutually_exclusive" and ($rel->{'params'}[0] eq $param2 and $rel->{'params'}[1] eq $param1))
7185100TFif $found_reverse
7197100TFif ($code =~ /(?:die|croak|confess)\s+['"](Cannot|Can't)[^'"]*both[^'"]*${param1}[^'"]*$param2/i or $code =~ /(?:die|croak|confess)\s+['"](Cannot|Can't)[^'"]*both[^'"]*${param2}[^'"]*$param1/i)
720250TFif ($rel->{'type'} eq "mutually_exclusive" and ($rel->{'params'}[0] eq $param2 and $rel->{'params'}[1] eq $param1))
720950TFif $found_reverse
7253100TFif $param1 eq $param2
7255100TFif ($code =~ /(?:die|croak|confess)[^;]*unless\s+\$$param1\s+\|\|\s+\$$param2/ or $code =~ /(?:die|croak|confess)[^;]*unless\s+\$$param2\s+\|\|\s+\$$param1/)
726150TFif ($rel->{'type'} eq "required_group" and ($rel->{'params'}[0] eq $param2 and $rel->{'params'}[1] eq $param1))
7268100TFif $found_reverse
7281100TFif ($code =~ /(?:die|croak|confess)\s+['"]Must\s+specify\s+either[^'"]*${param1}[^'"]*or[^'"]*$param2/i or $code =~ /(?:die|croak|confess)\s+['"]Must\s+specify\s+either[^'"]*${param2}[^'"]*or[^'"]*$param1/i)
728650TFif ($rel->{'type'} eq "required_group" and ($rel->{'params'}[0] eq $param2 and $rel->{'params'}[1] eq $param1))
729350TFif $found_reverse
7338100TFif $param1 eq $param2
7341100TFif ($code =~ /(?:die|croak|confess)[^;]*if\s+\$$param1\s+&&\s+!\$$param2/)
735350TFif ($code =~ /(?:die|croak|confess)[^;]*if\s+\$$param1\s+&&\s+!defined\s*\(\s*\$$param2\s*\)/)
7365100TFif ($code =~ /(?:die|croak|confess)\s+['"]\w*${param1}[^'"]*requires[^'"]*$param2/i)
7408100TFif $param1 eq $param2
741250TFif ($code =~ /(?:die|croak|confess)\s+['"]\w*${param1}[^'"]*requires[^'"]*$param2/i and $code =~ /if\s+\$param1\s+&&\s+!\$param2/)
7457100TFif $param1 eq $param2
7460100TFif ($code =~ /(?:die|croak|confess)[^;]*if\s+\$$param1\s+&&\s+\$$param2\s*!=\s*(\d+)/)
747550TFif ($code =~ /(?:die|croak|confess)[^;]*if\s+\$$param1\s+&&\s+\$$param2\s*<\s*(\d+)/)
7490100TFif ($code =~ /(?:die|croak|confess)[^;]*if\s+\$$param1\s+eq\s+['"]([^'"]+)['"]\s+&&\s+!\$$param2/)
752050TFunless defined $self->{'output_dir'}
7522100TFunless -d $self->{'output_dir'}
753150TFif ($self->{'_document'})
7533100TF$package_stmt ? :
7553100TFif ($schema->{'input'})
7554100TFif (scalar keys %{$$schema{'input'};}) { }
7559100TFif ($param->{'name'})
756150TFif ($name ne $param_name)
757550TFif ($schema->{'output'} and scalar keys %{$$schema{"output"};})
7576100TFif (ref $schema->{'output'}{'_error_handling'} eq "HASH" and scalar keys %{$$schema{"output"}{"_error_handling"};} == 0)
758250TFif ($schema->{'output'}{'type'} and $schema->{'output'}{'type'} eq "scalar")
7588100TFif ($schema->{'new'})
759050TFif (ref $schema->{'new'} or $schema->{'new'} eq $package_name) { }
759150TF$schema->{'new'} eq $package_name ? :
7599100TFunless (defined $schema->{'_confidence'}{'input'}{'level'})
760250TFunless (defined $schema->{'_confidence'}{'output'}{'level'})
7607100TFif ($schema->{'relationships'} and @{$schema->{'relationships'};})
761150TFif ($schema->{'accessor'} and scalar keys %{$$schema{"accessor"};})
7621100TF$schema->{'relationships'} ? :
7623100TF$schema->{'new'} ? :
7662100TFif ($schema->{'input'})
7667100TFif ($p->{'semantic'})
7671100TFif ($p->{'enum'})
7675100TFif ($p->{'isa'})
7680100TFif (@param_notes)
7690100TFif ($schema->{'relationships'} and @{$schema->{'relationships'};})
7702100TFif ($schema->{'_notes'} and scalar @{$schema->{'_notes'};})
7710100TFif ($schema->{'_analysis'})
7730100TFif ($schema->{'input'})
7734100TFif ($p->{'type'} and $p->{'type'} eq "coderef")
7738100TFif ($p->{'semantic'} and $p->{'semantic'} eq "filehandle")
7742100TFif ($p->{'isa'} and $p->{'isa'} =~ /DateTime/)
7748100TFif (@warnings)
7795100TFif defined $param->{$field}
7799100TFif (my $semantic = $param->{'semantic'})
7800100TFif ($semantic eq 'datetime_object') { }
50TFelsif ($semantic eq 'timepiece_object') { }
100TFelsif ($semantic eq 'date_string') { }
100TFelsif ($semantic eq 'iso8601_string') { }
100TFelsif ($semantic eq 'unix_timestamp') { }
50TFelsif ($semantic eq 'datetime_parseable') { }
100TFelsif ($semantic eq 'filehandle') { }
100TFelsif ($semantic eq 'filepath') { }
100TFelsif ($semantic eq 'callback') { }
100TFelsif ($semantic eq 'enum') { }
784350TFif ($param->{'enum'} and ref $param->{'enum'} eq "ARRAY")
7851100TFif ($param->{'enum'} and ref $param->{'enum'} eq "ARRAY")
785450TFif ($param->{'memberof'} and ref $param->{'memberof'} eq "ARRAY")
7859100TFif ($param->{'isa'} and not $cleaned{'isa'})
7864100TFif ($param->{'format'})
7895100TFif ($rel->{'type'} eq 'mutually_exclusive') { }
100TFelsif ($rel->{'type'} eq 'required_group') { }
100TFelsif ($rel->{'type'} eq 'conditional_requirement') { }
100TFelsif ($rel->{'type'} eq 'dependency') { }
100TFelsif ($rel->{'type'} eq 'value_constraint') { }
100TFelsif ($rel->{'type'} eq 'value_conditional') { }
794850TFunless $doc
7952100TF$package_stmt ? :
7968100TFif ($method_name eq "new")
797250TFif ($method_name =~ /^(create|build|construct|init|DESTROY)$/i)
7983100TFif ($is_singleton)
7995100TFif ($is_instance_method and $is_instance_method->{'explicit_self'} || $is_instance_method->{'shift_self'} || $is_instance_method->{'accesses_object_data'})
8001100TFif ($is_factory)
801550TFif ($inheritance_info and $inheritance_info->{'use_parent_constructor'})
8027100TFif ($constructor_needs)
804150TFif ($needs_other_object)
80450TFif $needs_other_object->{'package'}
80510TFif $result->{'package'}
8055100TFif ($is_factory and not $skip_object)
806150TFif $is_factory->{'returns_class'}
8097100TFif ($method_name =~ /^(create_|make_|build_|get_)/i)
810250TFif ($method_body)
8104100TFif ($method_body =~ /return\s+bless\s*\{[^}]*\},\s*['"]?(\w+(?:::\w+)*|\$\w+)['"]?/s or $method_body =~ /bless\s*\{[^}]*\},\s*['"]?(\w+(?:::\w+)*|\$\w+)['"]?.*return/s)
8109100TFif ($class_name =~ /^\$(class|self|package)$/) { }
50TFelsif ($class_name =~ /^\$/) { }
8123100TFif ($method_body =~ /return\s+([\$\w:]+)->new\(/s or $method_body =~ /([\$\w:]+)->new\(.*return/s)
812850TFif ($target eq '$self' or $target eq 'shift' or $target =~ /^\$/) { }
100TFelsif ($target =~ /::/) { }
814450TFif ($method_body =~ /return\s+([\$\w:]+)->(create_|make_|build_|get_)/i or $method_body =~ /([\$\w:]+)->(create_|make_|build_|get_).*return/is)
8153100TFif ($method_info and ref $method_info eq "HASH" and $method_info->{'pod'})
815550TFif ($pod =~ /returns?\s+(?:an?\s+)?(object|instance|new\s+\w+)/i)
8195100TFunless $method_name =~ /^(instance|get_instance|singleton|shared_instance)$/i
820250TFif ($method_body)
8204100TFif ($method_body =~ /(?:my\s+)?(?:our\s+)?\$(?:instance|_instance|singleton)\b/s or $method_body =~ /state\s+\$(?:instance|_instance|singleton)\b/s)
8211100TFif ($method_body =~ /return\s+\$instance\s+if\s+(?:defined\s+)?\$instance/ or $method_body =~ /unless\s+\$instance.*?=\s*.*?new/)
8218100TFif ($method_body =~ /\$instance\s*\|\|=\s*.*?new/ or $method_body =~ /\$instance\s*=\s*.*?new\s+unless\s+(?:defined\s+)?\$instance/)
8225100TFif ($method_body =~ /return\s+\$instance;/)
822750TFunless $singleton_info{'confidence'}
823150TFif keys %singleton_info > 0
8266100TFif ($method_body =~ /my\s*\(\s*\$self\s*[,)]/) { }
100TFelsif ($method_body =~ /my\s+\$self\s*=\s*shift/) { }
100TFelsif ($method_body =~ /\$self\s*->\s*(\w+|[\{\[])/) { }
8285100TFif ($method_body =~ /\$self\s*->\s*[\{\[]/)
8287100TFunless $instance_info{'confidence'} eq "high"
8291100TFif ($method_body =~ /\$self\s*->\s*(\w+)\s*\(/s)
829650TFif @{$instance_info{'calls_instance_methods'};}
8300100TFif ($method_name =~ /^_/ and not $method_name =~ /^_new/)
830350TFunless exists $instance_info{'confidence'}
8306100TFif keys %instance_info
833950TFunless $doc
8350100TFif ($content =~ /use\s+(parent|base)\s+['"]?([\w:]+)['"]?/)
835550TFif ($content =~ /use\s+(parent|base)\s+qw?[\(\[]?(.+?)[\)\]]?;/)
836850TFif ($content =~ /(?:our\s+)?\@ISA\s*=\s*qw?[\(\[]?(.+?)[\)\]]?/)
8380100TFif ($content =~ /\@ISA\s*=\s*qw?[\(\[]?(.+?)[\)\]]?/)
8389100TFif ($method_body and $method_body =~ /SUPER::/)
839150TFif ($method_body =~ /SUPER::new/)
8398100TFif $_[1]->isa("PPI::Statement::Sub")
8402100TFif ($has_own_new) { }
50TFelsif (@parent_classes) { }
8410100TFif keys %inheritance_info
844450TFunless $doc
844850TFif ($target_package ne $current_package)
8458100TFif $_[1]->isa("PPI::Statement::Sub")
8462100TFunless $new_method
8470100TFif ($body =~ /my\s*\(\s*\$(self|class)\s*,\s*(.+?)\)\s*=\s*\@_/s)
8474100TFif (@param_names)
848850TFif (@shift_params)
8496100TFif ($body =~ /croak.*unless.*(?:defined\s+)?\$(\w+)/g)
8499100TFif ($body =~ /die.*unless.*(?:defined\s+)?\$(\w+)/g)
8503100TFif (@required_params)
8513100TFif ($requirements{'parameters'})
8516100TFif (defined $default)
8523100TFif (@optional_params)
8528100TFif keys %requirements
855950TFunless $method_body
8568100TFif $class eq "main" or $class eq "__PACKAGE__" or $class =~ /^\$/
8572100TFif ($dependency_info{'creates_objects'})
8580100TFif ($method_body =~ /\$(\w+)->\w+\(/g)
859050TFif ($method_body =~ /my\s+\$$var\s*=\s*(\w+(?:::\w+)+)->(?:new|create)/) { }
0TFelsif ($method_body =~ /my\s+\$$var\s*=\s*(\w+(?:::\w+)+)->/) { }
859750TFif (@object_classes)
859950TFunless $dependency_info{'package'}
8606100TFif keys %dependency_info
862950TFunless $doc
863350TFif $_[1]->isa("PPI::Statement::Include") and $_[1]->type eq "use" and $_[1]->module =~ /^(parent|base)$/
863850TFif ($parent_stmt)
8645100TFif $_[1]->isa("PPI::Statement")
864850TFif ($isa_stmt and $isa_stmt->content =~ /['"](\w+(?:::\w+)*)['"]/)
8682100TFunless $package_stmt
8688100TFif $_[1]->isa("PPI::Statement::Sub")
869150TFif ($has_new)
86970TFif $parent
873350TFunless $param and $code
8743100TFif ($clean_code =~ /\$$param\s*=\s*(?:\$$param|\$[a-zA-Z_]\w*)\s*\|\|\s*([^;]+)/)
874750TFif defined $default
8751100TFif ($clean_code =~ m[\$$param\s*//=\s*([^;]+)])
8755100TFif defined $default
8760100TFif ($clean_code =~ /\$$param\s*=\s*defined\s+(?:\$$param|\$[a-zA-Z_]\w*)\s*\?\s*(?:\$$param|\$[a-zA-Z_]\w*)\s*:\s*([^;]+)/)
876450TFif defined $default
8768100TFif ($clean_code =~ /\$$param\s*=\s*([^;]+?)\s+unless\s+defined\s+(?:\$$param|\$[a-zA-Z_]\w*)/)
877150TFif defined $default
8775100TFif ($clean_code =~ /\$$param\s*\|\|=\s*([^;]+)/)
877950TFif defined $default
8783100TFif ($clean_code =~ m[\$$param\s*=\s*(?:\$$param|\$[a-zA-Z_]\w*)\s*//\s*([^;]+)])
8787100TFif defined $default
8791100TFif ($clean_code =~ /if\s*\(\s*!defined\s+\$$param\s*\)\s*\{[^}]*\$$param\s*=\s*([^;]+)/s)
879550TFif defined $default
8799100TFif ($clean_code =~ /unless\s*\(\s*defined\s+\$$param\s*\)\s*\{[^}]*\$$param\s*=\s*([^;]+)/s)
880350TFif defined $default
8840100TFunless $code
8847100TFunless @{$hints{$k};}
8874100TFif ($code =~ /defined\s*\(\s*\$/)
8879100TFif ($code =~ /\beq\s*''/ or $code =~ /\blength\s*\(/)
8884100TFif ($code =~ /\$\w+\s*<\s*0/)
8912100TFif ($op eq '<') { }
100TFelsif ($op eq '<=') { }
100TFelsif ($op eq '>') { }
50TFelsif ($op eq '>=') { }
8949100TFunless $pod
8954100TFunless $pod =~ /=head2\s+SYNOPSIS\s*(.+?)(?=\n=head|\z)/s
896450TFdefined $3 ? :
100TFdefined $2 ? :
8968100TFif %kv
8976100TFunless (scalar @examples)
898550TFunless @args
899650TFif (scalar @examples)
9041100TFunless defined $value
9051100TFif ($value =~ m[\|\||/{2}])
9061100TFif ($value =~ /^qq?\{(.*?)\}$/s) { }
50TFelsif ($value =~ /^qw\{(.*?)\}$/s) { }
50TFelsif ($value =~ /^q[qwx]?\s*([^a-zA-Z0-9\{\[])(.*?)\1$/s) { }
9070100TFif ($value =~ /^(['"])(.*)\1$/s)
9073100TFif ($from_code)
9084100TFunless ($from_code)
9093100TFunless ($value =~ /^\(/)
9098100TFif ($value =~ /^\{\s*\}$/)
9103100TFif ($value =~ /^\[\s*\]$/)
9108100TFif ($value =~ /^-?\d+(?:\.\d+)?$/)
9109100TFif ($value =~ /\./) { }
9117100TFif ($value =~ /^(true|false)$/i)
9118100TFlc $1 eq 'true' ? :
912250TFif ($value eq '1') { }
50TFelsif ($value eq '0') { }
9129100TFif ($value eq "undef")
9134100TFif ($value eq "__PACKAGE__")
9142100TFif ($value =~ /^\$[a-zA-Z_]/ or $value =~ /\(.*\)/)
9143100TFif $value =~ /^\$|\@|\%/
9193100TFif (exists $pod_params->{$param} and not exists $code_params->{$param})
919850TFif (not exists $pod_params->{$param} and exists $code_params->{$param})
9199100TFif ($method_name eq "new" and $param eq "class")
9203100TFif ($method_name ne "new" and $param eq "self")
9212100TFif ($pod->{'type'} and $code->{'type'} and $pod->{'type'} ne $code->{'type'})
9213100TFif (not $self->_types_are_compatible($pod->{'type'}, $code->{'type'})) { }
922150TFif (exists $pod->{'optional'} and exists $code->{'optional'} and $pod->{'optional'} != $code->{'optional'})
92230TF$pod->{'optional'} ? :
92240TF$code->{'optional'} ? :
92290TFif (defined $pod->{'min'} and defined $code->{'min'} and $pod->{'min'} != $code->{'min'})
92330TFif (defined $pod->{'max'} and defined $code->{'max'} and $pod->{'max'} != $code->{'max'})
92380TFif ($pod->{'matches'} and $code->{'matches'} and $pod->{'matches'} ne $code->{'matches'})
9267100TFunless defined $val
9270100TFif $val =~ /^(0|off|none)$/i
9271100TFif $val =~ /^(1|warn|warning)$/i
9272100TFif $val =~ /^(2|fatal|die|error)$/i
9298100TFif $pod_type eq $code_type
9311100TFif (my $allowed = $compatible_types{$pod_type})
931650TFif (my $allowed = $compatible_types{$code_type})
9381100TFif (my $errors = $schema->{'_pod_validation_errors'})
938350TF$schema->{'_pod_disagreement'} ? :
9390100TFif (@reports) { }
9406100TFif $self->{'verbose'}