Visual Studio CodeのJavaで--enable-previewオプションを付ける

随分前ですが、Visual Studio Code(以降VSCode)の[Java Extension Pack](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)がJDK 13に対応しました。
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Hey! Looks like we have another release already! vscode-java 0.50.0 brings support for Java 13 (Eclipse/Maven only for the moment), diagnostic tags, finer progress report on imports, moar code actions... See <a href="https://t.co/kYv133rfTT">https://t.co/kYv133rfTT</a><br><br>Is this the best release ever or what? <a href="https://t.co/Qlv1cHnK4A">pic.twitter.com/Qlv1cHnK4A</a></p>&mdash; VSCode Java (@VSCodeJava) <a href="https://twitter.com/VSCodeJava/status/1179095489301635072?ref_src=twsrc%5Etfw">October 1, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[JEP 355: Text Blocks (Preview)](https://openjdk.java.net/jeps/355)を試してみたところ「Text Blocks is a preview feature and disabled by default. Use --enable-preview to enable」というエラーがでました。
![2019-11-07_22h30_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/55212a1b-cf08-47c1-7e53-81de5a206a74.png)

そうだ、--enable-previewを付けないといけないんだったと思いつつ、あれVSCodeの場合どう指定するんだろう？と一瞬手が止まったので調べてみました。

上記のエラーがでたのはMavenを使ったプロジェクトだったので、VSCode関係なくMavenのCompiler Pluginに以下の記述を追記して解決できました。

```xml
<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <compilerArgs>--enable-preview</compilerArgs>
    </configuration>
</plugin>
```

他に、Java Extension Packの[Language Support for Java](https://marketplace.visualstudio.com/items?itemName=redhat.java)に含まれる[JDT(Java Development Tool)](https://www.eclipse.org/jdt/)の設定でも解決できました。
参考： https://github.com/redhat-developer/vscode-java/issues/671#issuecomment-477379761

Javaプロジェクトに.settingsフォルダができているので、その中のorg.eclipse.jdt.core.prefsファイルを開いて「org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=enabled」を追記するのみです。
![2019-11-08_00h05_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/06962f90-fdd0-c688-290e-63a2a6dbe66b.png)

Mavenを使わない場合はどうなるのか試したところ、特にエラーは出ずに実行できました。よくみると--enable-previewが付いた状態で実行されていました。
![2019-11-08_00h46_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/f88d0176-89fb-8f16-0c23-2ad8128f4d50.png)

Java Extension Packの中の[Debugger for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-debug)で指定されているっぽい？のかな。

Githubのコードを探したところ、以下にありました。

https://github.com/microsoft/vscode-java-debug/blob/master/src/configurationProvider.ts#L220

```typescript
 // Auto add '--enable-preview' vmArgs if the java project enables COMPILER_PB_ENABLE_PREVIEW_FEATURES flag.
if (await lsPlugin.detectPreviewFlag(config.mainClass, config.projectName)) {
    config.vmArgs = (config.vmArgs || "") + " --enable-preview";
}
```

COMPILER_PB_ENABLE_PREVIEW_FEATURESフラグによって制御されるようで、フラグは以下のとおりでした。デフォルトがenabledのようです。（あってるのかな？

https://github.com/microsoft/vscode-java-debug/blob/master/src/languageServerPlugin.ts#L76

```typescript
const COMPILER_PB_ENABLE_PREVIEW_FEATURES: string = "org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures";
export async function detectPreviewFlag(className: string, projectName: string): Promise<boolean> {
    const expectedOptions = {
        [COMPILER_PB_ENABLE_PREVIEW_FEATURES]: "enabled",
    };
    return checkProjectSettings(className, projectName, true, expectedOptions);
}
```

最後に余談ですが、先日参加した[Oracle Code One 2019 報告会](https://jjug.doorkeeper.jp/events/98354)で@bitter_foxさんのデモをみて「おぉ」と思ったのが、Text Blocksの先頭行にある空白は末尾の閉じ位置で決まるというものでした。試してみたところ無事にできました。地味だけどなんか印象的でした。

![2019-11-08_00h55_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/aa0f2464-153f-f8f3-2cd0-2b1dc99def9d.png)