Eclipseのコード補完で「えっ？」となったとき　～部分一致型コード補完(substring code completion)でつまづいたら～

# 概要
- Eclipseのコード補完機能で、あるクラスのメソッド名を補完させるときに**意図しない補完になってしまう！**とおもった場合の対策です  
(Eclipse NEONで追加された[**部分一致でのコード補完**(Substring code completion)機能](https://www.eclipse.org/eclipse/news/4.6/jdt.php)の副作用の抑え方です)

## 環境

- Eclipse IDE 2019‑06

# 「意図しない補完」とは↓のような場合（見たほうが早い）

**Arrays**でドット(**.**)を打つと、コード補完がはしる続いて**tostring**と入力してエンターを押すと**deepToString**が選ばれてしまう現象発生。

![substring_miss_before_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/4a73e605-6104-2073-4648-e0e201c9ec63.gif)


## コード補完するときの部分一致(substring)は便利だが

以下のように**string**だけ入力しても、メソッド名の一部に**string**が含まれるものを候補としてあげてくれる

![substring_ok.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/731b8d1d-2513-0898-18dd-94ea309b8b51.gif)

# 修正方法その１：メソッド名の部分一致をオフする

メソッド名の部分一致が悪さをしている面もあるので、この機能を設定からオフしてみる。

Eclipseのメインウィンドウから**Window>Preference>Java>Editor>Content Assist** の順で選択していくと**Show substring matches**という項目![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/ec003ceb-52de-271a-9cbd-83873e730029.png)があるので、それを**オフ**![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/9a19cb9f-b238-e47a-79b4-e62be45a958b.png)する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/2902f2b0-17a6-ee7b-c77d-8216768ec1d8.png)

## 部分一致(substring)をオフでつかってみる

なかなか良い感じ。
さっきみたいに意図せず**deepToString**が選択されることはなくなった。

![off_substring.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/67d8801b-b59e-72d0-54e7-e1d0905f5e4d.gif)

## あたりまえだけど、部分一致(substring)がオフだと、部分一致で補完できない

ためしに、**Arrays.**の後に**string**と打ってみると、候補が何もでてこなくなった。

![off_substring_miss.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/b52be34e-0ade-edab-bc01-224daa9d054f.gif)

# 修正方法その２

まず、さきほどと同じように**Window>Preference>Java>Editor>Content Assist**で設定画面ひらいて![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/df96a4ec-3fbb-3a5d-4e11-47f5a1e2722a.png)はチェックを入れる。

これで部分一致をひとまず有効にする。

次に、**Content Assist**の[+]マークをおして設定を展開して**Advanced**を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/f1919d60-d644-9c43-b327-b0974630dedd.png)

次に↓のように**Java Proposals**にチェックを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/2fc4eb7a-8d0c-aef9-e783-d835f4ada068.png)

これでOK

## コード補完を試す

さて、この設定で再度、コード補完を試す。

意図した動作で動いている模様

![proposals_fullmatch.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/85bd1c14-50d1-67d3-d92a-6c77bff26eae.gif)

## 部分一致でコード補完を試す

部分一致のほうもちゃんと動作している。

![proposals_partmatch.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/85f588ca-7683-2eb0-6a3c-1921d4dc1157.gif)

修正方法２のほうが、より意図した動作（部分一致もつかえて、コード補完も意図どおり）となるようだ。

# まとめ

- Eclipseのコード補完で「意図しない補完になってしまう」と思ったときの現象と対策について説明しました
- 部分一致でのコード補完(Substring code completion)機能はEclipse NEONで追加された機能ですが、その副作用で意図しない補完になってしまう場合に**substring code completion**をオフにしたり、**Java Proposals**を有効にする対策を打つことで副作用を抑えられることがわかりました。
- コード補完については**Intellij IDEA**（やAndroid Studio）のほうがだいぶ先行して**substring code completion**に対応しており、こうした副作用も無いよう予めチューニングされているようです。  
（Eclipseで遭遇するまであたり前で気づかなかったが、こういうUI工夫・使用感のチューニングで生まれる微差が生産性や品質に影響を与えるんだよなぁ、っと。）