diff --git a/src/commands.ts b/src/commands.ts index 24a2979..f5efb9a 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -27,6 +27,8 @@ export const JAVA_RESOLVE_MAINMETHOD = "vscode.java.resolveMainMethod"; export const JAVA_INFER_LAUNCH_COMMAND_LENGTH = "vscode.java.inferLaunchCommandLength"; +export const JAVA_CHECK_PROJECT_SETTINGS = "vscode.java.checkProjectSettings"; + export function executeJavaLanguageServerCommand(...rest) { // TODO: need to handle error and trace telemetry return vscode.commands.executeCommand(JAVA_EXECUTE_WORKSPACE_COMMAND, ...rest); diff --git a/src/configurationProvider.ts b/src/configurationProvider.ts index 8f9d902..5f1c5c2 100644 --- a/src/configurationProvider.ts +++ b/src/configurationProvider.ts @@ -186,6 +186,10 @@ export class JavaDebugConfigurationProvider implements vscode.DebugConfiguration // Add the default launch options to the config. config.cwd = config.cwd || _.get(folder, "uri.fsPath"); + // 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"; + } } else if (config.request === "attach") { if (!config.hostName || !config.port) { throw new utility.UserError({ diff --git a/src/languageServerPlugin.ts b/src/languageServerPlugin.ts index e3bab2d..cdeb870 100644 --- a/src/languageServerPlugin.ts +++ b/src/languageServerPlugin.ts @@ -61,3 +61,22 @@ export function validateLaunchConfig(workspaceUri: vscode.Uri, mainClass: string export function inferLaunchCommandLength(config: vscode.DebugConfiguration): Promise { return >commands.executeJavaLanguageServerCommand(commands.JAVA_INFER_LAUNCH_COMMAND_LENGTH, JSON.stringify(config)); } + +export function checkProjectSettings(className: string, projectName: string, inheritedOptions: boolean, expectedOptions: {[key: string]: string}): +Promise { + return >commands.executeJavaLanguageServerCommand( + commands.JAVA_CHECK_PROJECT_SETTINGS, JSON.stringify({ + className, + projectName, + inheritedOptions, + expectedOptions, + })); +} + +const COMPILER_PB_ENABLE_PREVIEW_FEATURES: string = "org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures"; +export async function detectPreviewFlag(className: string, projectName: string): Promise { + const expectedOptions = { + [COMPILER_PB_ENABLE_PREVIEW_FEATURES]: "enabled", + }; + return await checkProjectSettings(className, projectName, true, expectedOptions); +}