[iOS][Xcode] Xcodeで簡易フォーマットチェック

前回の OCLintでXcode5プロジェクトのObjective-Cソースコードを静的解析 で、コマンドの出力を整形すればソースコード上に警告表示できることを知ったので、簡単なフォーマットチェックができないか試してみました。

作業はXcode 5.0.2で行なっています。

まず、Targetを追加します。
iOS > Other > Aggregateで作成します。

このTargetに、メニューのEditor > Add Build Phase > Add Run Script Build PhaseでScriptを追加します。
Scriptには以下のようなものを記述します。
ここでは、elseと括弧の間にスペースを入れる、という簡単なチェックをしてみます。

export PATH=/usr/bin:/usr/local/bin:$PATH

cd ${SRCROOT}

# フォーマット違反パターン
pattern=("}else"  "else{")
# エラーメッセージ
desc=("}の後にスペースを入れてください" "elseの後にスペースを入れてください")
# 修正例
example=("} else" "else {")

has_error=0
# mで終わるファイルを対象にチェック
for i in $(find ${PROJECT_NAME} -regex ".*\.m*"); do
  n=0
  for p in ${pattern[@]}; do
    if output=$(grep -nH "$p" $i); then
      has_error=1
      echo $output | sed "s/^\([^:]*:[^:]*\).*$/\1:1: warning: フォーマット違反: ${desc[n]}: ${example[n]}/"
    fi
    let n++
  done
done

exit $has_error

画面イメージです。

上記のチェック内容でビルドすると、

}else{

と書いた箇所に以下のように警告が表示されます。
警告が出たら「Build Failed」、出なければ「Build Succeeded」となります。

チェックのパターンは、上記ではシェルスクリプト内に直接書いていますが、別のファイルにして読み込むようにすれば、スクリプト自体のメンテナンスもしやすくなりそうです。

© 2010 ksoichiro