随分前ですが、Visual Studio Code(以降VSCode)のJava Extension PackがJDK 13に対応しました。
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 https://t.co/kYv133rfTT
— VSCode Java (@VSCodeJava) October 1, 2019
Is this the best release ever or what? pic.twitter.com/Qlv1cHnK4A
JEP 355: Text Blocks (Preview)を試してみたところ「Text Blocks is a preview feature and disabled by default. Use --enable-preview to enable」というエラーがでました。
そうだ、--enable-previewを付けないといけないんだったと思いつつ、あれVSCodeの場合どう指定するんだろう?と一瞬手が止まったので調べてみました。
上記のエラーがでたのはMavenを使ったプロジェクトだったので、VSCode関係なくMavenのCompiler Pluginに以下の記述を追記して解決できました。
<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に含まれるJDT(Java Development Tool)の設定でも解決できました。
参考: 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」を追記するのみです。
Mavenを使わない場合はどうなるのか試したところ、特にエラーは出ずに実行できました。よくみると--enable-previewが付いた状態で実行されていました。
Java Extension Packの中のDebugger for Javaで指定されているっぽい?のかな。
Githubのコードを探したところ、以下にありました。
// 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のようです。(あってるのかな?
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 報告会で@bitter_foxさんのデモをみて「おぉ」と思ったのが、Text Blocksの先頭行にある空白は末尾の閉じ位置で決まるというものでした。試してみたところ無事にできました。地味だけどなんか印象的でした。