find_invalid_types.pl 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 20 September 2014
  5. # Website: https://github.com/trizen
  6. use 5.014;
  7. use strict;
  8. use warnings;
  9. use File::Find qw(find);
  10. use File::Basename qw(basename);
  11. use File::Spec::Functions qw(catfile splitdir);
  12. my $dir = shift() // die "usage: $0 [lib dir]\n";
  13. if (basename($dir) ne 'lib') {
  14. die "error: '$dir' is not a lib directory!";
  15. }
  16. chdir $dir;
  17. sub make_fuzzy_regex {
  18. my ($word) = @_;
  19. my @chars = split(//, $word);
  20. my @typos = map {
  21. join '',
  22. map { $_ . '+' }
  23. @chars[0 .. $_, $_ + 2 .. $#chars]
  24. } 0 .. $#chars;
  25. do { local $" = '|'; qr/@typos/ }
  26. }
  27. my $root_re = make_fuzzy_regex("Sidef");
  28. sub process_file {
  29. my ($file) = @_;
  30. open my $fh, '<', $file or return;
  31. while (defined(my $line = <$fh>)) {
  32. if ( $line =~ /(?<quote>['"])(?<name>$root_re [:;].*?)\g{quote}/xo
  33. || $line =~ /(?<![*&@\$])\b(?<name>$root_re(?>::\w+)+)\b/o) {
  34. my $name = $+{name};
  35. my $module = join('/', split(/::/, $name)) . '.pm';
  36. my $status = eval { require $module };
  37. if ($@) {
  38. if (defined &$name) {
  39. warn "=> Plain usage of function `$name', in file `$file', at line $.\n";
  40. }
  41. else {
  42. warn "=> Invalid type name `$name', in file `$file', at line $.\n";
  43. }
  44. }
  45. elsif ($status ne '1') {
  46. warn "=> Dubious return-value from: ", catfile($dir, $INC{$module}), "\n";
  47. }
  48. }
  49. }
  50. close $fh;
  51. }
  52. find {
  53. no_chdir => 1,
  54. wanted => sub {
  55. my @parts = splitdir($_);
  56. # Ignore the `Sidef::Deparse:Perl` module
  57. @parts >= 3
  58. && $parts[-1] =~ /\.pm\z/
  59. && join("/", @parts[$#parts - 2 .. $#parts]) eq 'Sidef/Deparse/Perl.pm'
  60. && return;
  61. -f and process_file($_);
  62. },
  63. } => $dir;