引き続き静的解析ツールの指摘を自動で対処するスクリプトを考える。
今回はswitchにdefaultケースがなければ追加するスクリプトを作成する。
switchブロックを抜き出す
下記の正規表現でマッチできる。以前にブロック単位でパターンマッチングさせる方法を記載したため、そちらをベースに正規表現を考える。
(?<=\n)\s*switch\s*\([^()]*\)\s*(\{(?:[^{}]|(?1))*\})
switchブロック内にdefaultケースがあるか判定する。
下記が完成形のスクリプト。
import regex
def repl_add_default(match):
matchstr = match.group()
# 既にdefaultがある場合は、そのままの文字をreturn
if not regex.search("\s*default\s*:", matchstr, regex.DOTALL):
index = matchstr.rfind("}")
indent = regex.search(r"[\t ]*(?=\bswitch\b)", matchstr, regex.DOTALL).group()
matchstr = matchstr[:index] + "default: /* 処理なし */ break;\n"+ indent + matchstr[index:]
return matchstr
with open("test.c", "r", encoding="utf-8") as file_obj:
codetext = file_obj.read()
ret = regex.sub(r"(?<=\n)\s*switch\s*\([^()]*\)\s*(\{(?:[^{}]|(?1))*\})", repl_add_default, codetext, flags=regex.DOTALL)
print(ret)
regex.sub
でマッチしたswitch
ブロックからdefault
ケースがあるかrepl_add_default
関数でチェックする。default
ケースがあれば、マッチした文字列をそのまま置換対象とする。(つまり置換前後で変化なし)
default
ケースがない場合は、switch
ブロックの末尾の}
の直前にdefault
ケースを追加した文字列を置換対象とする。
まとめ
switch
にdefault
ケースがなくて指摘されるのは、わりといろんな職場で起きてる気がする。このレベルの指摘でも量が多ければ、作業工数が増えるためどんどん自動化したい。ちょっと考えて、以後自動化できるのであれば作業を一度止めてでも自動化した方がいいと思う。