hiragram no blog

iOSとか

registという単語が含まれていたらビルドエラーにするやつ作った

iOS その3 Advent Calendarの9日目の記事です。

最近、NGワード一覧みたいなのを定義しておいたらコンパイル時にそれがコード中に含まれていないかチェックして含まれてたらビルド落ちるように出来ないかな〜とか思って試してみた。

XcodeのBuild phaseの中でSwiftLintを使うと、warning/errorのある行をXcodeが黄色とか赤にハイライトしてくれるやつ、どうやってるのかなーと思っていろいろ見てみると

/path/to/file:line:何文字目か(?): error: ほげほげ

このフォーマットでエラー出力にprintして、非0なexit statusを返せばXcodeがハイライトしてくれるらしいということがわかった。

"register"を"regist"と間違えて書いてある奴を許せないので、registという単語を使っている行をビルドエラーにするツールをPerlでさくっと書いた。

#!/usr/bin/perl

use strict;
use warnings;

my $current = `pwd`;
chomp($current);
my $root = ".";

my $filelist = &get_files($root);

my $status = 0;
foreach my $file (@$filelist) {
  my @lines = split("\n", `cat $file`);
  my $i = 1;
  foreach my $line (@lines) {
    if ($line =~ /[rR]egist[^e]/) {
      print STDERR "$current/$file:$i:1: error: Registという英単語はない💢😡\n";
      $status = 2;
    }
    $i++;
  }
}

exit($status);

sub get_files {
  my $dir = shift;
  my $filelist = shift;
  opendir(DIR, "$dir");
  my @list = grep /^[^\.]/, readdir DIR;
  foreach my $file (@list) {
    if (-d "$dir/$file") {
      $filelist = &get_files("$dir/$file", $filelist);
    } else {
      if ($file =~ /.swift$/) {
        push @$filelist, "$dir/$file";
      }
    }
  }
  return $filelist;
}

XcodeのRun script phaseに

perl regist.pl

と追加してやると、コード中にあるregistの行で

f:id:hiragram:20161209010504p:plain

エラーとしてハイライトしてくれるようになった。

今後はもっと汎用的なNG単語フィルターツールとしてもうちょっと拡張したい。

iOSアドベントカレンダーなのにPerlしか書いて無くてすみませんでした。