[java] '--enable-preview' flag in compiler options (IDEA-187805)

This commit is contained in:
Roman Shevchenko
2018-04-09 19:14:02 +02:00
parent 81eda4d34e
commit 002338c073
8 changed files with 61 additions and 42 deletions
@@ -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);
@@ -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
@@ -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
@@ -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));
}
@@ -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<LanguageLevel> 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. */
@@ -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
@@ -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
@@ -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) */