この記事はなに
JJUG CCC 2019 Springで発表した、今日から始めるカジュアルなソースコード解析という発表の中身で説明したユースケースの詳細版です。
概要
Java 12からSwitch式がプレビュー機能として追加されました。
Switchを式として扱えるので代入文の右辺値などに書くことができます。
詳細はこちらの記事が非常にわかりやすいです。
プログラミング言語に新しい構文が追加された時、私は「で、実際どれぐらい使い道あるの???」とよく思います。
今回はそんな疑問を解消しつつ知的好奇心を満たすため、Switch式に変換できるSwitch文を実際のソースコードから探してみたいと思います。
検索処理の概要
ソースコードの検索にはソースコード解析技術を用います。
具体的には、JavaParserというライブラリを使用して構文解析を行い、生成された抽象構文木に対して検索処理を実行します。
今回は「Switch式に変換できるSwitch文」というのを以下のように考え、条件にマッチするSwitch文を検索しました。
※ この条件は厳密ではありません。あくまで大まかに検索するための条件です。
- 2つの文からなるCASEは必ず
代入文+return
か代入文+break
でなくてはならない。 - 2つの文からなるCASEは少なくとも1つ存在しなければならない。
- 1つの文からなるCASEは必ず
return
かbreak
でなくてはならない。 - 1つも文を持たないCASEはいくら存在してもよい。
- 3つ以上の文をもつCASEは存在してはならない。
- 代入文の左辺の変数はすべて同じ変数でなければならない。
解析に使用したソースコードはこちらです。
検索対象
GitHub上のJavaプロジェクトのうちスターが多い順に100個取得して、それらを対象にしました。
検索クエリは下記のとおりです。
curl -o github_java_top100.json "https://api.github.com/search/repositories?q=stars:>0+language:Java&sort=stars&order=desc&page=1&per_page=100"
調査対象は2019年2月頃取得したので、現在のスター順とは異なる可能性があります。
また、プロジェクトがどういうものか、アーカイブされているのかなどは一切考慮していません。
検索結果
- Javaファイル:120,996 ファイル
- 処理時間:約20分
- 見つかったSwitch文:639 個
検索結果をマークダウン形式でまとめたものはこちらです。
全ての検索結果を確認できてはいませんが、ざっと見ると意図通りに検索ができているように思います。
下記に2つほど、いい感じの検索結果を例示します。
Android-PullToRefreshプロジェクトのPullToRefreshBase.javaより
switch(getPullToRefreshScrollDirection()) {
case HORIZONTAL:
oldScrollValue = getScrollX();
break;
case VERTICAL:
default:
oldScrollValue = getScrollY();
break;
}
jenkinsプロジェクトのRunParameterDefinition.javaより
switch(getFilter()) {
case COMPLETED:
lastBuild = project.getLastCompletedBuild();
break;
case SUCCESSFUL:
lastBuild = project.getLastSuccessfulBuild();
break;
case STABLE:
lastBuild = project.getLastStableBuild();
break;
default:
lastBuild = project.getLastBuild();
break;
}
まとめ
今回はSwitch式に変換できるSwitch文を探すということで、実際にGitHub上のプロジェクトのソースコードに対して検索処理を実行してみました。
個人的には思ったよりたくさん変換できる箇所があるんだなという感触です。
今後はぜひ使えるところでSwitch式を活用していきましょう。