diff --git a/java/compiler/impl/src/com/intellij/compiler/options/TargetOptionsComponent.java b/java/compiler/impl/src/com/intellij/compiler/options/TargetOptionsComponent.java index 3b1f203ca8ee..7156632fcfad 100644 --- a/java/compiler/impl/src/com/intellij/compiler/options/TargetOptionsComponent.java +++ b/java/compiler/impl/src/com/intellij/compiler/options/TargetOptionsComponent.java @@ -38,7 +38,9 @@ public class TargetOptionsComponent extends JPanel { targets.add("1.1"); targets.add("1.2"); for (LanguageLevel level : LanguageLevel.values()) { - targets.add(JpsJavaSdkType.complianceOption(level.toJavaVersion())); + if (level != LanguageLevel.JDK_X && !level.isPreview()) { + targets.add(JpsJavaSdkType.complianceOption(level.toJavaVersion())); + } } Collections.reverse(targets); KNOWN_TARGETS = ArrayUtil.toStringArray(targets); diff --git a/java/compiler/openapi/src/com/intellij/compiler/ant/ModuleChunk.java b/java/compiler/openapi/src/com/intellij/compiler/ant/ModuleChunk.java index 37cea56bf38b..728a2f2cd93f 100644 --- a/java/compiler/openapi/src/com/intellij/compiler/ant/ModuleChunk.java +++ b/java/compiler/openapi/src/com/intellij/compiler/ant/ModuleChunk.java @@ -119,6 +119,10 @@ public class ModuleChunk { options.add("-source"); options.add(sourceVersion); + if (languageLevel.isPreview()) { + options.add("--enable-preview"); + } + String bytecodeTarget = CompilerConfiguration.getInstance(getProject()).getBytecodeTargetLevel(myMainModule); if (StringUtil.isEmpty(bytecodeTarget)) { // according to IDEA rule: if not specified explicitly, set target to be the same as source language level diff --git a/java/execution/impl/src/com/intellij/execution/scratch/JavaScratchCompilationSupport.java b/java/execution/impl/src/com/intellij/execution/scratch/JavaScratchCompilationSupport.java index 22fe0ba21888..29467c6cddcf 100644 --- a/java/execution/impl/src/com/intellij/execution/scratch/JavaScratchCompilationSupport.java +++ b/java/execution/impl/src/com/intellij/execution/scratch/JavaScratchCompilationSupport.java @@ -153,6 +153,9 @@ public class JavaScratchCompilationSupport implements CompileTask { options.add(langLevel); options.add("-target"); options.add(langLevel); + if (sdkVersion.isAtLeast(JavaSdkVersion.JDK_11)) { + options.add("--enable-preview"); + } } options.add("-proc:none"); // disable annotation processing diff --git a/java/java-psi-api/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java b/java/java-psi-api/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java index f679d273344e..52fc09272b57 100644 --- a/java/java-psi-api/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java +++ b/java/java-psi-api/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java @@ -26,11 +26,11 @@ public enum JavaSdkVersion { JDK_1_8(LanguageLevel.JDK_1_8), JDK_1_9(LanguageLevel.JDK_1_9), JDK_10(LanguageLevel.JDK_10), - JDK_11(LanguageLevel.JDK_11_PREVIEW); + JDK_11(LanguageLevel.JDK_11); private final LanguageLevel myMaxLanguageLevel; - JavaSdkVersion(@NotNull LanguageLevel maxLanguageLevel) { + JavaSdkVersion(LanguageLevel maxLanguageLevel) { myMaxLanguageLevel = maxLanguageLevel; } @@ -51,17 +51,13 @@ public enum JavaSdkVersion { @NotNull public static JavaSdkVersion fromLanguageLevel(@NotNull LanguageLevel languageLevel) throws IllegalArgumentException { - if (languageLevel == LanguageLevel.JDK_1_3) { - return JDK_1_3; - } JavaSdkVersion[] values = values(); if (languageLevel == LanguageLevel.JDK_X) { return values[values.length - 1]; } - for (JavaSdkVersion version : values) { - if (version.getMaxLanguageLevel().isAtLeast(languageLevel)) { - return version; - } + int feature = languageLevel.toJavaVersion().feature; + if (feature < values.length) { + return values[feature]; } throw new IllegalArgumentException("Can't map " + languageLevel + " to any of " + Arrays.toString(values)); } diff --git a/java/java-psi-api/src/com/intellij/pom/java/LanguageLevel.java b/java/java-psi-api/src/com/intellij/pom/java/LanguageLevel.java index 592e16bd3e94..7eeea8fd7742 100644 --- a/java/java-psi-api/src/com/intellij/pom/java/LanguageLevel.java +++ b/java/java-psi-api/src/com/intellij/pom/java/LanguageLevel.java @@ -21,25 +21,27 @@ import org.jetbrains.annotations.Nullable; * @see JavaSdkVersion */ public enum LanguageLevel { - JDK_1_3(JavaCoreBundle.message("jdk.1.3.language.level.description")), - JDK_1_4(JavaCoreBundle.message("jdk.1.4.language.level.description")), - JDK_1_5(JavaCoreBundle.message("jdk.1.5.language.level.description")), - JDK_1_6(JavaCoreBundle.message("jdk.1.6.language.level.description")), - JDK_1_7(JavaCoreBundle.message("jdk.1.7.language.level.description")), - JDK_1_8(JavaCoreBundle.message("jdk.1.8.language.level.description")), - JDK_1_9(JavaCoreBundle.message("jdk.1.9.language.level.description")), - JDK_10(JavaCoreBundle.message("jdk.10.language.level.description")), - JDK_11(JavaCoreBundle.message("jdk.11.language.level.description")), - JDK_11_PREVIEW(JavaCoreBundle.message("jdk.11.preview.language.level.description")), - JDK_X(JavaCoreBundle.message("jdk.X.language.level.description")); + JDK_1_3(JavaCoreBundle.message("jdk.1.3.language.level.description"), 3), + JDK_1_4(JavaCoreBundle.message("jdk.1.4.language.level.description"), 4), + JDK_1_5(JavaCoreBundle.message("jdk.1.5.language.level.description"), 5), + JDK_1_6(JavaCoreBundle.message("jdk.1.6.language.level.description"), 6), + JDK_1_7(JavaCoreBundle.message("jdk.1.7.language.level.description"), 7), + JDK_1_8(JavaCoreBundle.message("jdk.1.8.language.level.description"), 8), + JDK_1_9(JavaCoreBundle.message("jdk.1.9.language.level.description"), 9), + JDK_10(JavaCoreBundle.message("jdk.10.language.level.description"), 10), + JDK_11(JavaCoreBundle.message("jdk.11.language.level.description"), 11), + JDK_11_PREVIEW(JavaCoreBundle.message("jdk.11.preview.language.level.description"), 11), + JDK_X(JavaCoreBundle.message("jdk.X.language.level.description"), 12); public static final LanguageLevel HIGHEST = JDK_10; public static final Key KEY = Key.create("LANGUAGE_LEVEL"); private final String myPresentableText; + private final JavaVersion myVersion; - LanguageLevel(@Nls String presentableText) { + LanguageLevel(@Nls String presentableText, int major) { myPresentableText = presentableText; + myVersion = JavaVersion.compose(major); } public boolean isPreview() { @@ -67,13 +69,12 @@ public enum LanguageLevel { @NotNull public JavaVersion toJavaVersion() { - return JavaVersion.compose(ordinal() + 3); + return myVersion; } /** @deprecated use {@code org.jetbrains.jps.model.java.JpsJavaSdkType.complianceOption()} (to be removed in IDEA 2019) */ public String getCompilerComplianceDefaultOption() { - int major = toJavaVersion().feature; - return major <= 8 ? "1." + major : String.valueOf(major); + return myVersion.feature <= 8 ? "1." + myVersion.feature : String.valueOf(myVersion.feature); } /** See {@link JavaVersion#parse(String)} for supported formats. */ diff --git a/java/java-tests/testSrc/com/intellij/java/openapi/projectRoots/JavaSdkVersionTest.java b/java/java-tests/testSrc/com/intellij/java/openapi/projectRoots/JavaSdkVersionTest.java index b2241d186a26..29fe25e7e3fc 100644 --- a/java/java-tests/testSrc/com/intellij/java/openapi/projectRoots/JavaSdkVersionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/openapi/projectRoots/JavaSdkVersionTest.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.java.openapi.projectRoots; import com.intellij.openapi.projectRoots.JavaSdkVersion; @@ -20,6 +6,7 @@ import com.intellij.pom.java.LanguageLevel; import org.junit.Test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; public class JavaSdkVersionTest { @Test @@ -27,6 +14,15 @@ public class JavaSdkVersionTest { assertEquals(JavaSdkVersion.JDK_1_3, JavaSdkVersion.fromLanguageLevel(LanguageLevel.JDK_1_3)); assertEquals(JavaSdkVersion.JDK_1_6, JavaSdkVersion.fromLanguageLevel(LanguageLevel.JDK_1_6)); assertEquals(JavaSdkVersion.JDK_1_8, JavaSdkVersion.fromLanguageLevel(LanguageLevel.JDK_1_8)); + assertEquals(JavaSdkVersion.JDK_11, JavaSdkVersion.fromLanguageLevel(LanguageLevel.JDK_11)); + assertEquals(JavaSdkVersion.JDK_11, JavaSdkVersion.fromLanguageLevel(LanguageLevel.JDK_11_PREVIEW)); + } + + @Test + public void maxLanguageLevelSanity() { + for (JavaSdkVersion version : JavaSdkVersion.values()) { + assertFalse("Fails for " + version.toString(), version.getMaxLanguageLevel().isPreview()); + } } @Test diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index fbcbae6057eb..e7e4ae2c8e57 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -847,6 +847,13 @@ public class JavaBuilder extends ModuleLevelBuilder { addCrossCompilationOptions(compilerSdkVersion, options, context, chunk); + if (!options.contains("--enable-preview")) { + LanguageLevel level = JpsJavaExtensionService.getInstance().getLanguageLevel(chunk.representativeTarget().getModule()); + if (level != null && level.isPreview()) { + options.add("--enable-preview"); + } + } + if (addAnnotationProcessingOptions(options, profile)) { final File srcOutput = ProjectPaths.getAnnotationProcessorGeneratedSourcesOutputDir( chunk.getModules().iterator().next(), chunk.containsTests(), profile diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/LanguageLevel.java b/jps/model-api/src/org/jetbrains/jps/model/java/LanguageLevel.java index 44f5868f178b..64458b4d4c5b 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/LanguageLevel.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/LanguageLevel.java @@ -10,11 +10,21 @@ import org.jetbrains.annotations.NotNull; * @author nik */ public enum LanguageLevel { - JDK_1_3, JDK_1_4, JDK_1_5, JDK_1_6, JDK_1_7, JDK_1_8, JDK_1_9, JDK_10, JDK_11, JDK_11_PREVIEW, JDK_X; + JDK_1_3(3), JDK_1_4(4), JDK_1_5(5), JDK_1_6(6), JDK_1_7(7), JDK_1_8(8), JDK_1_9(9), JDK_10(10), JDK_11(11), JDK_11_PREVIEW(11), JDK_X(12); + + private final JavaVersion myVersion; + + LanguageLevel(int major) { + myVersion = JavaVersion.compose(major); + } @NotNull public JavaVersion toJavaVersion() { - return JavaVersion.compose(ordinal() + 3); + return myVersion; + } + + public boolean isPreview() { + return name().endsWith("_PREVIEW"); } /** @deprecated use {@link JpsJavaSdkType#complianceOption} (to be removed in IDEA 2019) */