diff --git a/org.eclipse.jdt.ls.target/org.eclipse.jdt.ls.tp.target b/org.eclipse.jdt.ls.target/org.eclipse.jdt.ls.tp.target
index 563ebf3342..50e2c00282 100644
--- a/org.eclipse.jdt.ls.target/org.eclipse.jdt.ls.tp.target
+++ b/org.eclipse.jdt.ls.target/org.eclipse.jdt.ls.tp.target
@@ -27,7 +27,8 @@
-
+
+
@@ -37,7 +38,7 @@
-
+
diff --git a/org.eclipse.jdt.ls.tests/fakejdk/23/rtstubs.jar b/org.eclipse.jdt.ls.tests/fakejdk/23/rtstubs.jar
new file mode 100644
index 0000000000..fb6cb93825
Binary files /dev/null and b/org.eclipse.jdt.ls.tests/fakejdk/23/rtstubs.jar differ
diff --git a/org.eclipse.jdt.ls.tests/projects/eclipse/java23/.classpath b/org.eclipse.jdt.ls.tests/projects/eclipse/java23/.classpath
new file mode 100644
index 0000000000..374ef565da
--- /dev/null
+++ b/org.eclipse.jdt.ls.tests/projects/eclipse/java23/.classpath
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/org.eclipse.jdt.ls.tests/projects/eclipse/java23/.project b/org.eclipse.jdt.ls.tests/projects/eclipse/java23/.project
new file mode 100644
index 0000000000..91ee42cf05
--- /dev/null
+++ b/org.eclipse.jdt.ls.tests/projects/eclipse/java23/.project
@@ -0,0 +1,17 @@
+
+
+ java23
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/org.eclipse.jdt.ls.tests/projects/eclipse/java23/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jdt.ls.tests/projects/eclipse/java23/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..125a3d3da7
--- /dev/null
+++ b/org.eclipse.jdt.ls.tests/projects/eclipse/java23/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,16 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=23
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=23
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=enabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=23
+
diff --git a/org.eclipse.jdt.ls.tests/projects/eclipse/java23/src/main/java/UnnamedWithString.java b/org.eclipse.jdt.ls.tests/projects/eclipse/java23/src/main/java/UnnamedWithString.java
new file mode 100644
index 0000000000..8f14cf779f
--- /dev/null
+++ b/org.eclipse.jdt.ls.tests/projects/eclipse/java23/src/main/java/UnnamedWithString.java
@@ -0,0 +1,7 @@
+String foo() {
+ return "foo";
+}
+
+void main() {
+ System.out.println(foo());
+}
diff --git a/org.eclipse.jdt.ls.tests/projects/eclipse/java23/src/main/java/foo/bar/Foo.java b/org.eclipse.jdt.ls.tests/projects/eclipse/java23/src/main/java/foo/bar/Foo.java
new file mode 100644
index 0000000000..33940688a9
--- /dev/null
+++ b/org.eclipse.jdt.ls.tests/projects/eclipse/java23/src/main/java/foo/bar/Foo.java
@@ -0,0 +1,11 @@
+package foo.bar;
+
+/**
+ * It's a Foo class
+ */
+public class Foo {
+ public Foo() {
+ System.out.println();
+ super();
+ }
+}
diff --git a/org.eclipse.jdt.ls.tests/projects/eclipse/java23/src/main/java/org/sample/Test.java b/org.eclipse.jdt.ls.tests/projects/eclipse/java23/src/main/java/org/sample/Test.java
new file mode 100644
index 0000000000..aca1a4ec7e
--- /dev/null
+++ b/org.eclipse.jdt.ls.tests/projects/eclipse/java23/src/main/java/org/sample/Test.java
@@ -0,0 +1,4 @@
+package org.sample;
+
+public class Test {
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/.classpath b/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/.classpath
new file mode 100644
index 0000000000..87b28c458e
--- /dev/null
+++ b/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/.classpath
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/.project b/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/.project
new file mode 100644
index 0000000000..d5da50115d
--- /dev/null
+++ b/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/.project
@@ -0,0 +1,23 @@
+
+
+ salut-java23
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..9d3d41e848
--- /dev/null
+++ b/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,17 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=23
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=23
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=enabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=23
+
+
diff --git a/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000000..f897a7f1cb
--- /dev/null
+++ b/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/pom.xml b/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/pom.xml
new file mode 100644
index 0000000000..be98d974e3
--- /dev/null
+++ b/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/pom.xml
@@ -0,0 +1,26 @@
+
+ 4.0.0
+ foo.bar
+ salut-java23
+ 0.0.1-SNAPSHOT
+
+
+
+ maven-compiler-plugin
+ 3.8.1
+
+ 23
+ --enable-preview
+
+
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.5
+
+
+
diff --git a/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/src/main/java/org/sample/Bar.java b/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/src/main/java/org/sample/Bar.java
new file mode 100644
index 0000000000..c8839a8886
--- /dev/null
+++ b/org.eclipse.jdt.ls.tests/projects/maven/salut-java23/src/main/java/org/sample/Bar.java
@@ -0,0 +1,14 @@
+package org.sample;
+
+/**
+ * This is Bar
+ */
+public class Bar {
+
+ public static void main(String[] args) {
+ Object foo = "x";
+ if (foo instanceof String str) {
+ System.out.println(str);
+ }
+ }
+}
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/EclipseProjectImporterTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/EclipseProjectImporterTest.java
index c0b2640df5..62f7c67fa9 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/EclipseProjectImporterTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/EclipseProjectImporterTest.java
@@ -191,7 +191,7 @@ public void testPreviewFeatures16() throws Exception {
@Test
public void testPreviewFeaturesDisabledByDefault() throws Exception {
- String name = "java22";
+ String name = "java23";
importProjects("eclipse/" + name);
IProject project = getProject(name);
assertIsJavaProject(project);
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectImporterTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectImporterTest.java
index f78784f26e..4830f01097 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectImporterTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectImporterTest.java
@@ -204,7 +204,7 @@ public void getPackageName() throws Exception {
public void testPreviewFeaturesEnabledByDefault() throws Exception {
String defaultJVM = JavaRuntime.getDefaultVMInstall().getId();
try {
- TestVMType.setTestJREAsDefault("22");
+ TestVMType.setTestJREAsDefault("23");
IProject invisibleProject = copyAndImportFolder("singlefile/java14", "foo/bar/Foo.java");
assertTrue(invisibleProject.exists());
assertNoErrors(invisibleProject);
diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporterTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporterTest.java
index 2b7b6892f7..d002a00b10 100644
--- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporterTest.java
+++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenProjectImporterTest.java
@@ -370,6 +370,16 @@ public void testJava22Project() throws Exception {
IJavaProject javaProject = JavaCore.create(project);
assertEquals(JavaCore.ENABLED, javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, false));
assertEquals(JavaCore.IGNORE, javaProject.getOption(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, false));
+ assertHasErrors(project, "Preview features enabled at an invalid source release level");
+ }
+
+ public void testJava23Project() throws Exception {
+ IProject project = importMavenProject("salut-java23");
+ assertIsJavaProject(project);
+ assertEquals("23", getJavaSourceLevel(project));
+ IJavaProject javaProject = JavaCore.create(project);
+ assertEquals(JavaCore.ENABLED, javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, false));
+ assertEquals(JavaCore.IGNORE, javaProject.getOption(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, false));
assertNoErrors(project);
}