2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Switch式に変換できるSwitch文を探す

Last updated at Posted at 2019-05-18

この記事はなに

JJUG CCC 2019 Springで発表した、今日から始めるカジュアルなソースコード解析という発表の中身で説明したユースケースの詳細版です。

概要

Java 12からSwitch式がプレビュー機能として追加されました。
Switchを式として扱えるので代入文の右辺値などに書くことができます。

詳細はこちらの記事が非常にわかりやすいです。

プログラミング言語に新しい構文が追加された時、私は「で、実際どれぐらい使い道あるの???」とよく思います。

今回はそんな疑問を解消しつつ知的好奇心を満たすため、Switch式に変換できるSwitch文を実際のソースコードから探してみたいと思います。

検索処理の概要

ソースコードの検索にはソースコード解析技術を用います。

具体的には、JavaParserというライブラリを使用して構文解析を行い、生成された抽象構文木に対して検索処理を実行します。

今回は「Switch式に変換できるSwitch文」というのを以下のように考え、条件にマッチするSwitch文を検索しました。
※ この条件は厳密ではありません。あくまで大まかに検索するための条件です。

  • 2つの文からなるCASEは必ず代入文+return代入文+breakでなくてはならない。
  • 2つの文からなるCASEは少なくとも1つ存在しなければならない。
  • 1つの文からなるCASEは必ずreturnbreakでなくてはならない。
  • 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式を活用していきましょう。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?