From 51ef99bff2fc32d9ad116fffe38706722c349a1a Mon Sep 17 00:00:00 2001 From: Fred Bricon Date: Wed, 3 Apr 2024 13:50:46 +0200 Subject: [PATCH] WIP: enable javac-based compilation Signed-off-by: Fred Bricon --- package.json | 28 +++++++++++++++++++++++++++- src/javaServerStarter.ts | 33 ++++++++++++++++++++++++++++++++- src/requirements.ts | 2 +- src/settings.ts | 4 +++- 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 4d90419517..3c00366c24 100644 --- a/package.json +++ b/package.json @@ -404,6 +404,17 @@ "scope": "window", "order": 90 }, + "java.jdt.ls.javac.enabled": { + "type": "string", + "enum": [ + "on", + "off" + ], + "default": "off", + "markdownDescription": "[Experimental] Specify whether to enable Javac-based compilation in the language server. Requires running this extension with Java 23", + "scope": "window", + "order": 95 + }, "java.trace.server": { "type": "string", "enum": [ @@ -1003,6 +1014,21 @@ "scope": "window", "order": 10 }, + "java.completion.engine": { + "type": "string", + "default": "ecj", + "description": "[Experimental] Select code completion engine", + "scope": "window", + "enum": [ + "ecj", + "dom" + ], + "markdownEnumDescriptions": [ + "Use ECJ-based code completion engine (default)", + "Use (highly experimental) JDT DOM-based code completion engine (requires `java.jdt.ls.javac.enabled` to be `on`)" + ], + "order": 1000 + }, "java.completion.postfix.enabled": { "type": "boolean", "default": true, @@ -1903,4 +1929,4 @@ }, "segmentWriteKey": "Y7Y5Xk8dKEhVZHTmAkFZkqgdN4d7c4lt", "segmentWriteKeyDebug": "BflPll7uuKOCm3y0g7JpfXLVBVFBivDE" -} +} \ No newline at end of file diff --git a/src/javaServerStarter.ts b/src/javaServerStarter.ts index 6790973792..ed753bc704 100644 --- a/src/javaServerStarter.ts +++ b/src/javaServerStarter.ts @@ -104,7 +104,38 @@ function prepareParams(requirements: RequirementsData, workspacePath, context: E // See https://github.com/redhat-developer/vscode-java/issues/2264 // It requires the internal API sun.nio.fs.WindowsFileAttributes.isDirectoryLink() to check if a Windows directory is symlink. '--add-opens', - 'java.base/sun.nio.fs=ALL-UNNAMED'); + 'java.base/sun.nio.fs=ALL-UNNAMED' + ); + + const javacEnabled = 'on' === getJavaConfiguration().get('jdt.ls.javac.enabled'); + if (javacEnabled) { + // Javac flags + params.push( + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', + '-DICompilationUnitResolver=org.eclipse.jdt.core.dom.JavacCompilationUnitResolver', + '-DCompilationUnit.DOM_BASED_OPERATIONS=true', + '-DAbstractImageBuilder.compilerFactory=org.eclipse.jdt.internal.javac.JavacCompilerFactory' + ); + + if('dom' === getJavaConfiguration().get('java.completion.engine')){ + params.push('-DCompilationUnit.codeComplete.DOM_BASED_OPERATIONS=true'); + }; + } params.push('-Declipse.application=org.eclipse.jdt.ls.core.id1', '-Dosgi.bundles.defaultStartLevel=4', diff --git a/src/requirements.ts b/src/requirements.ts index b753f2200f..51f441dbcc 100644 --- a/src/requirements.ts +++ b/src/requirements.ts @@ -10,7 +10,7 @@ import { logger } from './log'; import { checkJavaPreferences } from './settings'; import { listJdks, sortJdksBySource, sortJdksByVersion } from './jdkUtils'; -const REQUIRED_JDK_VERSION = 17; +const REQUIRED_JDK_VERSION = 23; /* eslint-disable @typescript-eslint/naming-convention */ export interface RequirementsData { tooling_jre: string; diff --git a/src/settings.ts b/src/settings.ts index e7b06c78fc..d187cc6109 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -136,7 +136,9 @@ function hasJavaConfigChanged(oldConfig: WorkspaceConfiguration, newConfig: Work || hasConfigKeyChanged('jdt.ls.vmargs', oldConfig, newConfig) || hasConfigKeyChanged('server.launchMode', oldConfig, newConfig) || hasConfigKeyChanged('sharedIndexes.location', oldConfig, newConfig) - || hasConfigKeyChanged('transport', oldConfig, newConfig); + || hasConfigKeyChanged('transport', oldConfig, newConfig) + || hasConfigKeyChanged('jdt.ls.javac.enabled', oldConfig, newConfig) + || hasConfigKeyChanged('java.completion.engine', oldConfig, newConfig); } function hasConfigKeyChanged(key, oldConfig, newConfig) {