diff --git a/java/compiler/impl/src/com/intellij/compiler/PsiClassWriter.java b/java/compiler/impl/src/com/intellij/compiler/PsiClassWriter.java index 0b9150d63086..af32fffb67bb 100644 --- a/java/compiler/impl/src/com/intellij/compiler/PsiClassWriter.java +++ b/java/compiler/impl/src/com/intellij/compiler/PsiClassWriter.java @@ -18,6 +18,8 @@ package com.intellij.compiler; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.util.Computable; @@ -45,8 +47,7 @@ public class PsiClassWriter extends ClassWriter { private static boolean isJdk6(final Module module) { final Sdk projectJdk = ModuleRootManager.getInstance(module).getSdk(); if (projectJdk == null) return false; - String versionString = projectJdk.getVersionString(); - return versionString.contains("1.6") || versionString.contains("6.0") || versionString.contains("1.7") || versionString.contains("7.0"); + return JavaSdk.getInstance().isOfVersionOrHigher(projectJdk, JavaSdkVersion.JDK_1_6); } protected String getCommonSuperClass(final String type1, final String type2) { diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompilerErrorTreeView.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompilerErrorTreeView.java index aaa3061bb4fc..47bdc721e794 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompilerErrorTreeView.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompilerErrorTreeView.java @@ -37,6 +37,7 @@ import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.util.IconLoader; @@ -199,7 +200,7 @@ public class CompilerErrorTreeView extends NewErrorTreeViewPanel { if (module == null) return; final Sdk jdk = ModuleRootManager.getInstance(module).getSdk(); if (jdk == null) return; - final boolean is_1_5 = JavaSdk.getInstance().compareTo(jdk.getVersionString(), "1.5") >= 0; + final boolean is_1_5 = JavaSdk.getInstance().isOfVersionOrHigher(jdk, JavaSdkVersion.JDK_1_5); if (!is_1_5) return; final PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile); if (psiFile == null) return; diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompilerUtil.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompilerUtil.java index 56a7958e4c5a..6176e0fee201 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompilerUtil.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompilerUtil.java @@ -177,6 +177,7 @@ public class CompilerUtil { } } + //todo[nik] rewrite using JavaSdkVersion#getMaxLanguageLevel @NotNull public static LanguageLevel getApplicableLanguageLevel(String versionString, @NotNull LanguageLevel languageLevel) { final boolean is8OrNewer = isOfVersion(versionString, "1.8") || isOfVersion(versionString, "8.0"); diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/BackendCompilerWrapper.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/BackendCompilerWrapper.java index 05f4f39dde9b..e6a90dc9ab92 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/BackendCompilerWrapper.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/BackendCompilerWrapper.java @@ -43,7 +43,9 @@ import com.intellij.openapi.module.JavaModuleType; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.JavaSdk; import com.intellij.openapi.projectRoots.JavaSdkType; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.*; import com.intellij.openapi.util.Computable; @@ -944,14 +946,7 @@ public class BackendCompilerWrapper { } private static boolean isJdk6(final Sdk jdk) { - boolean isJDK16 = false; - if (jdk != null) { - final String versionString = jdk.getVersionString(); - if (versionString != null) { - isJDK16 = versionString.contains("1.6") || versionString.contains("6.0") || versionString.contains("1.7") || versionString.contains("7.0"); - } - } - return isJDK16; + return jdk != null && JavaSdk.getInstance().isOfVersionOrHigher(jdk, JavaSdkVersion.JDK_1_6); } private static final class CompileStatistics { diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/CompilerAPICompiler.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/CompilerAPICompiler.java index 3bc297e6da7e..63c3186a5db1 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/CompilerAPICompiler.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/CompilerAPICompiler.java @@ -30,6 +30,7 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NonNls; @@ -108,7 +109,7 @@ public class CompilerAPICompiler implements BackendCompiler { List commandLine = new ArrayList(); JavacSettings javacSettings = CompilerAPIConfiguration.getSettings(myProject, CompilerAPIConfiguration.class); final List additionalOptions = - JavacCompiler.addAdditionalSettings(commandLine, javacSettings, false, 6, myProject, compileContext.isAnnotationProcessorsEnabled()); + JavacCompiler.addAdditionalSettings(commandLine, javacSettings, false, JavaSdkVersion.JDK_1_6, myProject, compileContext.isAnnotationProcessorsEnabled()); JavacCompiler.addCommandLineOptions(chunk, commandLine, outputDir, chunk.getJdk(), false,false, null, false, false, false); commandLine.addAll(additionalOptions); diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacCompiler.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacCompiler.java index 70876a533fa3..5a66b0f9c6a3 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacCompiler.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacCompiler.java @@ -31,9 +31,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; -import com.intellij.openapi.projectRoots.JavaSdkType; -import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.projectRoots.SdkType; +import com.intellij.openapi.projectRoots.*; import com.intellij.openapi.projectRoots.ex.JavaSdkUtil; import com.intellij.openapi.projectRoots.impl.MockJdkWrapper; import com.intellij.openapi.roots.ModuleRootManager; @@ -189,17 +187,12 @@ public class JavacCompiler extends ExternalCompiler { JavacSettings javacSettings, final boolean annotationProcessorsEnabled) throws IOException { final Sdk jdk = getJdkForStartupCommand(chunk); final String versionString = jdk.getVersionString(); - if (versionString == null || "".equals(versionString) || !(jdk.getSdkType() instanceof JavaSdkType)) { + JavaSdkVersion version = JavaSdk.getInstance().getVersion(jdk); + if (versionString == null || version == null || !(jdk.getSdkType() instanceof JavaSdkType)) { throw new IllegalArgumentException(CompilerBundle.message("javac.error.unknown.jdk.version", jdk.getName())); } - final boolean isVersion1_0 = CompilerUtil.isOfVersion(versionString, "1.0"); - final boolean isVersion1_1 = CompilerUtil.isOfVersion(versionString, "1.1"); - final boolean isVersion1_2 = CompilerUtil.isOfVersion(versionString, "1.2"); - final boolean isVersion1_3 = CompilerUtil.isOfVersion(versionString, "1.3"); - final boolean isVersion1_4 = CompilerUtil.isOfVersion(versionString, "1.4"); - final boolean isVersion1_5 = CompilerUtil.isOfVersion(versionString, "1.5") || CompilerUtil.isOfVersion(versionString, "5.0"); - final boolean isVersion1_5_or_higher = isVersion1_5 || !(isVersion1_0 || isVersion1_1 || isVersion1_2 || isVersion1_3 || isVersion1_4); - final int versionIndex = isVersion1_0? 0 : isVersion1_1? 1 : isVersion1_2? 2 : isVersion1_3? 3 : isVersion1_4? 4 : isVersion1_5? 5 : 6; + final boolean isVersion1_0 = version == JavaSdkVersion.JDK_1_0; + final boolean isVersion1_1 = version == JavaSdkVersion.JDK_1_1; JavaSdkType sdkType = (JavaSdkType)jdk.getSdkType(); @@ -212,15 +205,15 @@ public class JavacCompiler extends ExternalCompiler { commandLine.add(vmExePath); - if (isVersion1_1 || isVersion1_0) { - commandLine.add("-mx" + javacSettings.MAXIMUM_HEAP_SIZE + "m"); + if (version.isAtLeast(JavaSdkVersion.JDK_1_2)) { + commandLine.add("-Xmx" + javacSettings.MAXIMUM_HEAP_SIZE + "m"); } else { - commandLine.add("-Xmx" + javacSettings.MAXIMUM_HEAP_SIZE + "m"); + commandLine.add("-mx" + javacSettings.MAXIMUM_HEAP_SIZE + "m"); } final List additionalOptions = - addAdditionalSettings(commandLine, javacSettings, myAnnotationProcessorMode, versionIndex, myProject, annotationProcessorsEnabled); + addAdditionalSettings(commandLine, javacSettings, myAnnotationProcessorMode, version, myProject, annotationProcessorsEnabled); CompilerUtil.addLocaleOptions(commandLine, false); @@ -235,11 +228,11 @@ public class JavacCompiler extends ExternalCompiler { commandLine.add("\"" + versionString + "\""); } - if (isVersion1_2 || isVersion1_1 || isVersion1_0) { - commandLine.add(JAVAC_MAIN_CLASS_OLD); + if (version.isAtLeast(JavaSdkVersion.JDK_1_3)) { + commandLine.add(JAVAC_MAIN_CLASS); } else { - commandLine.add(JAVAC_MAIN_CLASS); + commandLine.add(JAVAC_MAIN_CLASS_OLD); } addCommandLineOptions(chunk, commandLine, outputPath, jdk, isVersion1_0, isVersion1_1, myTempFiles, true, true, myAnnotationProcessorMode); @@ -266,7 +259,7 @@ public class JavacCompiler extends ExternalCompiler { for (final VirtualFile file : files) { // Important: should use "/" slashes! // but not for JDK 1.5 - see SCR 36673 - final String path = isVersion1_5_or_higher ? file.getPath().replace('/', File.separatorChar) : file.getPath(); + final String path = version.isAtLeast(JavaSdkVersion.JDK_1_5) ? file.getPath().replace('/', File.separatorChar) : file.getPath(); if (LOG.isDebugEnabled()) { LOG.debug("Adding path for compilation " + path); } @@ -281,10 +274,10 @@ public class JavacCompiler extends ExternalCompiler { } public static List addAdditionalSettings(List commandLine, JavacSettings javacSettings, boolean isAnnotationProcessing, - int versionIndex, Project project, final boolean annotationProcessorsEnabled) { + JavaSdkVersion version, Project project, final boolean annotationProcessorsEnabled) { final List additionalOptions = new ArrayList(); StringTokenizer tokenizer = new StringTokenizer(javacSettings.getOptionsString(project), " "); - if (versionIndex < 6) { + if (!version.isAtLeast(JavaSdkVersion.JDK_1_6)) { isAnnotationProcessing = false; // makes no sense for these versions } if (isAnnotationProcessing) { @@ -318,26 +311,20 @@ public class JavacCompiler extends ExternalCompiler { } } else { - if (versionIndex > 5) { - if (annotationProcessorsEnabled) { - // Unless explicitly specified by user, disable annotation processing by default for 'java compilation' mode - // This is needed to suppress unwanted side-effects from auto-discovered processors from compilation classpath - additionalOptions.add("-proc:none"); - } + if (version.isAtLeast(JavaSdkVersion.JDK_1_6) && annotationProcessorsEnabled) { + // Unless explicitly specified by user, disable annotation processing by default for 'java compilation' mode + // This is needed to suppress unwanted side-effects from auto-discovered processors from compilation classpath + additionalOptions.add("-proc:none"); } } while (tokenizer.hasMoreTokens()) { @NonNls String token = tokenizer.nextToken(); - if (versionIndex == 0) { - if ("-deprecation".equals(token)) { - continue; // not supported for this version - } + if (version == JavaSdkVersion.JDK_1_0 && "-deprecation".equals(token)) { + continue; // not supported for this version } - if (versionIndex <= 4) { - if ("-Xlint".equals(token)) { - continue; // not supported in these versions - } + if (!version.isAtLeast(JavaSdkVersion.JDK_1_5) && "-Xlint".equals(token)) { + continue; // not supported in these versions } if (token.startsWith("-proc:")) { continue; diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerManagerImpl.java index 2da2f7f70b1a..047ca94375a5 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerManagerImpl.java @@ -42,6 +42,8 @@ import com.intellij.openapi.editor.colors.EditorColorsListener; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.JdkUtil; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.ex.JavaSdkUtil; @@ -337,11 +339,12 @@ public class DebuggerManagerImpl extends DebuggerManagerEx { if (jdk == null) { throw new ExecutionException(DebuggerBundle.message("error.jdk.not.specified")); } - final String versionString = jdk.getVersionString(); - if (versionString.contains("1.0") || versionString.contains("1.1")) { + final JavaSdkVersion version = JavaSdk.getInstance().getVersion(jdk); + String versionString = jdk.getVersionString(); + if (version == JavaSdkVersion.JDK_1_0 || version == JavaSdkVersion.JDK_1_1) { throw new ExecutionException(DebuggerBundle.message("error.unsupported.jdk.version", versionString)); } - if (SystemInfo.isWindows && versionString.contains("1.2")) { + if (SystemInfo.isWindows && version == JavaSdkVersion.JDK_1_2) { final VirtualFile homeDirectory = jdk.getHomeDirectory(); if (homeDirectory == null || !homeDirectory.isValid()) { throw new ExecutionException(DebuggerBundle.message("error.invalid.jdk.home", versionString)); diff --git a/java/execution/impl/src/com/intellij/execution/util/JreVersionDetector.java b/java/execution/impl/src/com/intellij/execution/util/JreVersionDetector.java index 317200900afa..d6ff9723653d 100644 --- a/java/execution/impl/src/com/intellij/execution/util/JreVersionDetector.java +++ b/java/execution/impl/src/com/intellij/execution/util/JreVersionDetector.java @@ -25,10 +25,12 @@ package com.intellij.execution.util; import com.intellij.execution.CommonJavaRunConfigurationParameters; import com.intellij.execution.configurations.ModuleBasedConfiguration; import com.intellij.openapi.module.Module; +import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectRootManager; +import org.jetbrains.annotations.Nullable; public class JreVersionDetector { private String myLastAlternativeJrePath = null; //awful hack @@ -51,7 +53,7 @@ public class JreVersionDetector { if (configuration.isAlternativeJrePathEnabled()) { if (configuration.getAlternativeJrePath().equals(myLastAlternativeJrePath)) return myLastIsJre50; myLastAlternativeJrePath = configuration.getAlternativeJrePath(); - final String versionString = JavaSdkImpl.getJdkVersion(myLastAlternativeJrePath); + final String versionString = JavaSdk.getJdkVersion(myLastAlternativeJrePath); myLastIsJre50 = versionString != null && isJre50(versionString); return myLastIsJre50; } @@ -60,11 +62,12 @@ public class JreVersionDetector { private static boolean isJre50(final Sdk jdk) { if (jdk == null) return false; - final String versionString = jdk.getVersionString(); - return versionString != null && isJre50(versionString); + return JavaSdk.getInstance().isOfVersionOrHigher(jdk, JavaSdkVersion.JDK_1_5); } - private static boolean isJre50(final String versionString) { - return versionString.contains("5.0") || versionString.contains("1.5") || versionString.contains("1.6") || versionString.contains("1.7"); + private static boolean isJre50(final @Nullable String versionString) { + if (versionString == null) return false; + JavaSdkVersion version = JavaSdk.getInstance().getVersion(versionString); + return version != null && version.isAtLeast(JavaSdkVersion.JDK_1_5); } } \ No newline at end of file diff --git a/java/idea-ui/src/com/intellij/ide/impl/NewProjectUtil.java b/java/idea-ui/src/com/intellij/ide/impl/NewProjectUtil.java index 46b163c9c780..c7bd6361e97c 100644 --- a/java/idea-ui/src/com/intellij/ide/impl/NewProjectUtil.java +++ b/java/idea-ui/src/com/intellij/ide/impl/NewProjectUtil.java @@ -27,12 +27,13 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.components.StorageScheme; -import com.intellij.openapi.module.LanguageLevelUtil; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.project.ex.ProjectManagerEx; +import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.CompilerProjectExtension; import com.intellij.openapi.roots.LanguageLevelProjectExtension; @@ -174,12 +175,12 @@ public class NewProjectUtil { } public static void applyJdkToProject(@NotNull Project project, @NotNull Sdk jdk) { - String versionString = jdk.getVersionString(); - if (versionString == null) return; + JavaSdkVersion version = JavaSdk.getInstance().getVersion(jdk); + if (version == null) return; ProjectRootManagerEx rootManager = ProjectRootManagerEx.getInstanceEx(project); rootManager.setProjectSdk(jdk); - LanguageLevel level = LanguageLevelUtil.getDefaultLanguageLevel(versionString); + LanguageLevel level = version.getMaxLanguageLevel(); LanguageLevelProjectExtension ext = LanguageLevelProjectExtension.getInstance(project); if (level.compareTo(ext.getLanguageLevel()) < 0) { ext.setLanguageLevel(level); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/JavadocOrderRootTypeUIFactory.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/JavadocOrderRootTypeUIFactory.java index b1d5134b30a8..b8bb50cf7fa7 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/JavadocOrderRootTypeUIFactory.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/JavadocOrderRootTypeUIFactory.java @@ -21,16 +21,16 @@ package com.intellij.openapi.roots.ui.configuration.libraryEditor; import com.intellij.openapi.fileChooser.FileChooserDescriptor; -import com.intellij.openapi.module.LanguageLevelUtil; import com.intellij.openapi.project.ProjectBundle; +import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.ui.PathEditor; -import com.intellij.openapi.roots.ui.OrderRootTypeUIFactory; import com.intellij.openapi.projectRoots.ui.Util; import com.intellij.openapi.roots.JavadocOrderRootType; +import com.intellij.openapi.roots.ui.OrderRootTypeUIFactory; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.pom.java.LanguageLevel; import javax.swing.*; @@ -80,16 +80,15 @@ public class JavadocOrderRootTypeUIFactory implements OrderRootTypeUIFactory { private String getInitialValue() { if (mySdk != null) { - final String versionString = mySdk.getVersionString(); - if (versionString != null) { - final LanguageLevel level = LanguageLevelUtil.getDefaultLanguageLevel(versionString); - if (level == LanguageLevel.JDK_1_5) { - return "http://download.oracle.com/javase/1.5.0/docs/api/"; - } else if (level == LanguageLevel.JDK_1_6) { - return "http://download.oracle.com/javase/6/docs/api/"; - } else if (level == LanguageLevel.JDK_1_7) { - return "http://download.oracle.com/javase/7/docs/api/"; - } + final JavaSdkVersion version = JavaSdk.getInstance().getVersion(mySdk); + if (version == JavaSdkVersion.JDK_1_5) { + return "http://download.oracle.com/javase/1.5.0/docs/api/"; + } + else if (version == JavaSdkVersion.JDK_1_6) { + return "http://download.oracle.com/javase/6/docs/api/"; + } + else if (version == JavaSdkVersion.JDK_1_7) { + return "http://download.oracle.com/javase/7/docs/api/"; } } return ""; diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/IncreaseLanguageLevelFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/IncreaseLanguageLevelFix.java index 62d1cf4b8c30..7ccc5449e42e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/IncreaseLanguageLevelFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/IncreaseLanguageLevelFix.java @@ -24,6 +24,7 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.*; import com.intellij.openapi.vfs.VirtualFile; @@ -33,9 +34,6 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Map; -import java.util.EnumMap; - /** * @author cdr */ @@ -43,16 +41,6 @@ public class IncreaseLanguageLevelFix implements IntentionAction { private static final Logger LOG = Logger.getInstance("#" + IncreaseLanguageLevelFix.class.getName()); private final LanguageLevel myLevel; - private static final Map acceptableJDKVersions = new EnumMap(LanguageLevel.class); - - static { - acceptableJDKVersions.put(LanguageLevel.JDK_1_3, new String[]{"1.3"}); - acceptableJDKVersions.put(LanguageLevel.JDK_1_4, new String[]{"1.4"}); - acceptableJDKVersions.put(LanguageLevel.JDK_1_5, new String[]{"1.5", "5.0"}); - acceptableJDKVersions.put(LanguageLevel.JDK_1_6, new String[]{"1.6", "6.0"}); - acceptableJDKVersions.put(LanguageLevel.JDK_1_7, new String[]{"1.7", "7.0"}); - acceptableJDKVersions.put(LanguageLevel.JDK_1_8, new String[]{"1.8", "8.0"}); - } public IncreaseLanguageLevelFix(LanguageLevel targetLevel) { myLevel = targetLevel; @@ -71,13 +59,8 @@ public class IncreaseLanguageLevelFix implements IntentionAction { private static boolean isJdkSupportsLevel(@Nullable final Sdk jdk, final LanguageLevel level) { if (jdk == null) return true; final JavaSdk sdk = JavaSdk.getInstance(); - final String versionString = jdk.getVersionString(); - if (versionString == null) return false; - final String[] acceptableVersionNumbers = acceptableJDKVersions.get(level); - for (String number : acceptableVersionNumbers) { - if (sdk.compareTo(versionString, number) >= 0) return true; - } - return false; + final JavaSdkVersion version = sdk.getVersion(jdk); + return version != null && version.getMaxLanguageLevel().isAtLeast(level); } public boolean isAvailable(@NotNull final Project project, final Editor editor, final PsiFile file) { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceAddAllArrayToCollectionFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceAddAllArrayToCollectionFix.java index 009754d48537..fc801cd0e480 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceAddAllArrayToCollectionFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceAddAllArrayToCollectionFix.java @@ -27,6 +27,7 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.util.Comparing; @@ -61,9 +62,7 @@ public class ReplaceAddAllArrayToCollectionFix implements IntentionAction { final Module module = ModuleUtil.findModuleForPsiElement(file); if (module == null) return false; final Sdk jdk = ModuleRootManager.getInstance(module).getSdk(); - if (jdk == null) return false; - final String versionString = jdk.getVersionString(); - if (versionString == null || JavaSdk.getInstance().compareTo(versionString, "1.5") < 0) return false; + if (jdk == null || !JavaSdk.getInstance().isOfVersionOrHigher(jdk, JavaSdkVersion.JDK_1_5)) return false; final PsiReferenceExpression expression = myMethodCall.getMethodExpression(); final PsiElement element = expression.resolve(); diff --git a/java/java-impl/src/com/intellij/codeInspection/SuppressManagerImpl.java b/java/java-impl/src/com/intellij/codeInspection/SuppressManagerImpl.java index 07b4cd6b14f4..8f879a679306 100644 --- a/java/java-impl/src/com/intellij/codeInspection/SuppressManagerImpl.java +++ b/java/java-impl/src/com/intellij/codeInspection/SuppressManagerImpl.java @@ -31,6 +31,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.util.Computable; @@ -256,9 +257,7 @@ public class SuppressManagerImpl extends SuppressManager { if (module == null) return false; final Sdk jdk = ModuleRootManager.getInstance(module).getSdk(); if (jdk == null) return false; - final String jdkVersion = jdk.getVersionString(); - if (jdkVersion == null) return false; - final boolean is_1_5 = JavaSdk.getInstance().compareTo(jdkVersion, "1.5") >= 0; + final boolean is_1_5 = JavaSdk.getInstance().isOfVersionOrHigher(jdk, JavaSdkVersion.JDK_1_5); return DaemonCodeAnalyzerSettings.getInstance().SUPPRESS_WARNINGS && is_1_5 && PsiUtil.isLanguageLevel5OrHigher(file); } diff --git a/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java b/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java index 0e97cec3698d..8b6b91e6673d 100644 --- a/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java +++ b/java/java-impl/src/com/intellij/javadoc/JavadocConfiguration.java @@ -36,6 +36,7 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.JavaSdk; import com.intellij.openapi.projectRoots.JavaSdkType; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.ex.PathUtilEx; import com.intellij.openapi.roots.ContentEntry; @@ -158,13 +159,13 @@ public class JavadocConfiguration implements ModuleRunProfile, JDOMExternalizabl if (jdkPath == null) { throw new CantRunException(JavadocBundle.message("javadoc.generate.no.jdk.path")); } - String versionString = jdk.getVersionString(); + JavaSdkVersion version = JavaSdk.getInstance().getVersion(jdk); if (HEAP_SIZE != null && HEAP_SIZE.trim().length() != 0) { - if (versionString.indexOf("1.1") > -1) { - cmdLine.getParametersList().prepend("-J-mx" + HEAP_SIZE + "m"); + if (version == null || version.isAtLeast(JavaSdkVersion.JDK_1_2)) { + cmdLine.getParametersList().prepend("-J-Xmx" + HEAP_SIZE + "m"); } else { - cmdLine.getParametersList().prepend("-J-Xmx" + HEAP_SIZE + "m"); + cmdLine.getParametersList().prepend("-J-mx" + HEAP_SIZE + "m"); } } cmdLine.setWorkingDirectory(null); diff --git a/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java b/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java index 964ef742c369..b8940530e70a 100644 --- a/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java +++ b/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java @@ -48,6 +48,19 @@ public class JavaSdkImpl extends JavaSdk { private static final Icon JDK_ICON_EXPANDED = IconLoader.getIcon("/nodes/ppJdkOpen.png"); private static final Icon ADD_ICON = IconLoader.getIcon("/general/addJdk.png"); @NonNls private static final String JAVA_VERSION_PREFIX = "java version "; + private static final Map VERSION_STRINGS = new EnumMap(JavaSdkVersion.class); + + static { + VERSION_STRINGS.put(JavaSdkVersion.JDK_1_0, new String[]{"1.0"}); + VERSION_STRINGS.put(JavaSdkVersion.JDK_1_1, new String[]{"1.1"}); + VERSION_STRINGS.put(JavaSdkVersion.JDK_1_2, new String[]{"1.2"}); + VERSION_STRINGS.put(JavaSdkVersion.JDK_1_3, new String[]{"1.3"}); + VERSION_STRINGS.put(JavaSdkVersion.JDK_1_4, new String[]{"1.4"}); + VERSION_STRINGS.put(JavaSdkVersion.JDK_1_5, new String[]{"1.5", "5.0"}); + VERSION_STRINGS.put(JavaSdkVersion.JDK_1_6, new String[]{"1.6", "6.0"}); + VERSION_STRINGS.put(JavaSdkVersion.JDK_1_7, new String[]{"1.7", "7.0"}); + VERSION_STRINGS.put(JavaSdkVersion.JDK_1_8, new String[]{"1.8", "8.0"}); + } public JavaSdkImpl() { super("JavaSDK"); @@ -185,7 +198,8 @@ public class JavaSdkImpl extends JavaSdk { return suggestedName; } - private static String getVersionNumber(String versionString) { + @NotNull + private static String getVersionNumber(@NotNull String versionString) { if (versionString.startsWith(JAVA_VERSION_PREFIX)) { versionString = versionString.substring(JAVA_VERSION_PREFIX.length()); if (versionString.startsWith("\"") && versionString.endsWith("\"")) { @@ -303,6 +317,32 @@ public class JavaSdkImpl extends JavaSdk { return jdk; } + @Override + public JavaSdkVersion getVersion(@NotNull Sdk sdk) { + String version = sdk.getVersionString(); + if (version == null) return null; + return getVersion(version); + } + + @Override + @Nullable + public JavaSdkVersion getVersion(@NotNull String versionString) { + for (Map.Entry entry : VERSION_STRINGS.entrySet()) { + for (String s : entry.getValue()) { + if (versionString.contains(s)) { + return entry.getKey(); + } + } + } + return null; + } + + @Override + public boolean isOfVersionOrHigher(@NotNull Sdk sdk, @NotNull JavaSdkVersion version) { + JavaSdkVersion sdkVersion = getVersion(sdk); + return sdkVersion != null && sdkVersion.isAtLeast(version); + } + private static File getPathForJdkNamed(String name) { File mockJdkCEPath = new File(PathManager.getHomePath(), "java/" + name); if (mockJdkCEPath.exists()) { diff --git a/java/openapi/src/com/intellij/openapi/module/LanguageLevelUtil.java b/java/openapi/src/com/intellij/openapi/module/LanguageLevelUtil.java index 0e15a04a0cec..0ee53974ef11 100644 --- a/java/openapi/src/com/intellij/openapi/module/LanguageLevelUtil.java +++ b/java/openapi/src/com/intellij/openapi/module/LanguageLevelUtil.java @@ -17,6 +17,7 @@ package com.intellij.openapi.module; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.roots.LanguageLevelModuleExtension; import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.openapi.vfs.VirtualFile; @@ -50,25 +51,17 @@ public class LanguageLevelUtil { return getLanguageLevelForFile(file.getParent()); } + /** + * @deprecated use {@link com.intellij.openapi.projectRoots.JavaSdkVersion#getMaxLanguageLevel()} instead + */ public static LanguageLevel getDefaultLanguageLevel(@NotNull String versionString) { - if (isOfVersionOrHigher(versionString, "1.8") || isOfVersionOrHigher(versionString, "8.0")) { - return LanguageLevel.JDK_1_8; - } - if (isOfVersionOrHigher(versionString, "1.7") || isOfVersionOrHigher(versionString, "7.0")) { - return LanguageLevel.JDK_1_7; - } - if (isOfVersionOrHigher(versionString, "1.6") || isOfVersionOrHigher(versionString, "6.0")) { - return LanguageLevel.JDK_1_6; - } - if (isOfVersionOrHigher(versionString, "1.5") || isOfVersionOrHigher(versionString, "5.0")) { - return LanguageLevel.JDK_1_5; - } - if (isOfVersionOrHigher(versionString, "1.4")) { - return LanguageLevel.JDK_1_4; - } - return LanguageLevel.JDK_1_3; + JavaSdkVersion version = JavaSdk.getInstance().getVersion(versionString); + return version != null ? version.getMaxLanguageLevel() : LanguageLevel.JDK_1_3; } + /** + * @deprecated use {@link com.intellij.openapi.projectRoots.JavaSdkVersion#isAtLeast(com.intellij.openapi.projectRoots.JavaSdkVersion)} instead + */ public static boolean isOfVersionOrHigher(@NotNull String versionString, String checkedVersion) { return JavaSdk.getInstance().compareTo(versionString, checkedVersion) >= 0; } diff --git a/java/openapi/src/com/intellij/openapi/projectRoots/JavaSdk.java b/java/openapi/src/com/intellij/openapi/projectRoots/JavaSdk.java index 527ab07ce9e8..5e7d644cc79d 100644 --- a/java/openapi/src/com/intellij/openapi/projectRoots/JavaSdk.java +++ b/java/openapi/src/com/intellij/openapi/projectRoots/JavaSdk.java @@ -37,10 +37,21 @@ public abstract class JavaSdk extends SdkType implements JavaSdkType, Applicatio return createJdk(jdkName, jreHome, true); } + /** + * @deprecated use {@link #isOfVersionOrHigher(Sdk, JavaSdkVersion)} instead + */ public abstract int compareTo(@NotNull String versionString, @NotNull String versionNumber); public abstract Sdk createJdk(@NonNls String jdkName, String home, boolean isJre); + @Nullable + public abstract JavaSdkVersion getVersion(@NotNull Sdk sdk); + + @Nullable + public abstract JavaSdkVersion getVersion(@NotNull String versionString); + + public abstract boolean isOfVersionOrHigher(@NotNull Sdk sdk, @NotNull JavaSdkVersion version); + public static boolean checkForJdk(File file) { return JdkUtil.checkForJdk(file); } diff --git a/java/openapi/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java b/java/openapi/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java new file mode 100644 index 000000000000..23a53de54f60 --- /dev/null +++ b/java/openapi/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java @@ -0,0 +1,47 @@ +/* + * Copyright 2000-2011 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. + */ +package com.intellij.openapi.projectRoots; + +import com.intellij.pom.java.LanguageLevel; +import org.jetbrains.annotations.NotNull; + +/** + * Represents version of Java SDK. Use {@link JavaSdk#getVersion(Sdk)} method to obtain version of an {@link Sdk} + * + * @author nik + */ +public enum JavaSdkVersion { + JDK_1_0(LanguageLevel.JDK_1_3), JDK_1_1(LanguageLevel.JDK_1_3), JDK_1_2(LanguageLevel.JDK_1_3), JDK_1_3(LanguageLevel.JDK_1_3), + JDK_1_4(LanguageLevel.JDK_1_4), + JDK_1_5(LanguageLevel.JDK_1_5), + JDK_1_6(LanguageLevel.JDK_1_6), + JDK_1_7(LanguageLevel.JDK_1_7), + JDK_1_8(LanguageLevel.JDK_1_8); + private final LanguageLevel myMaxLanguageLevel; + + JavaSdkVersion(@NotNull LanguageLevel maxLanguageLevel) { + myMaxLanguageLevel = maxLanguageLevel; + } + + @NotNull + public LanguageLevel getMaxLanguageLevel() { + return myMaxLanguageLevel; + } + + public boolean isAtLeast(@NotNull JavaSdkVersion version) { + return compareTo(version) >= 0; + } +} diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/pattern/compiler/AnnotationBasedInstrumentingCompiler.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/pattern/compiler/AnnotationBasedInstrumentingCompiler.java index 7dd93dbd53d9..3479f56803fc 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/pattern/compiler/AnnotationBasedInstrumentingCompiler.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/pattern/compiler/AnnotationBasedInstrumentingCompiler.java @@ -25,6 +25,8 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.CompilerModuleExtension; import com.intellij.openapi.roots.ModuleRootManager; @@ -105,14 +107,7 @@ public abstract class AnnotationBasedInstrumentingCompiler implements ClassInstr final Module module = index.getModuleForFile(sourceFile); if (module != null) { final Sdk jdk = ModuleRootManager.getInstance(module).getSdk(); - final boolean jdk6; - if (jdk != null) { - final String versionString = jdk.getVersionString(); - jdk6 = versionString != null && (versionString.contains("1.6") || versionString.contains("6.0") || versionString.contains("1.7") || versionString.contains("7.0")); - } - else { - jdk6 = false; - } + final boolean jdk6 = jdk != null && JavaSdk.getInstance().isOfVersionOrHigher(jdk, JavaSdkVersion.JDK_1_6); final CompilerModuleExtension extension = CompilerModuleExtension.getInstance(module); final VirtualFile compilerOutputPath = extension != null ? extension.getCompilerOutputPath() : null; diff --git a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkUtils.java b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkUtils.java index a65fbd3f5201..d1db2e54a6dc 100644 --- a/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkUtils.java +++ b/plugins/android/src/org/jetbrains/android/sdk/AndroidSdkUtils.java @@ -232,7 +232,7 @@ public class AndroidSdkUtils { if (!(jdk.getSdkType() instanceof JavaSdk)) { return false; } - String versionString = jdk.getVersionString(); - return versionString != null && (versionString.contains("1.5") || versionString.contains("1.6")); + JavaSdkVersion version = JavaSdk.getInstance().getVersion(jdk); + return version == JavaSdkVersion.JDK_1_5 || version == JavaSdkVersion.JDK_1_6; } } diff --git a/plugins/devkit/src/projectRoots/IdeaJdk.java b/plugins/devkit/src/projectRoots/IdeaJdk.java index 454b02ce02c5..eefb4479811f 100644 --- a/plugins/devkit/src/projectRoots/IdeaJdk.java +++ b/plugins/devkit/src/projectRoots/IdeaJdk.java @@ -214,9 +214,9 @@ public class IdeaJdk extends SdkType implements JavaSdkType { } } if (javaSdks.isEmpty()){ - JDKVersion requiredVer = getRequiredJdkVersion(sdk); - if (requiredVer != null) { - Messages.showErrorDialog(DevKitBundle.message("no.java.sdk.for.idea.sdk.found", requiredVer), "No Java SDK found"); + JavaSdkVersion requiredVersion = getRequiredJdkVersion(sdk); + if (requiredVersion != null) { + Messages.showErrorDialog(DevKitBundle.message("no.java.sdk.for.idea.sdk.found", requiredVersion), "No Java SDK found"); } else { Messages.showErrorDialog(DevKitBundle.message("no.idea.sdk.version.found"), "No Java SDK found"); @@ -243,15 +243,10 @@ public class IdeaJdk extends SdkType implements JavaSdkType { public static boolean isValidInternalJdk(Sdk ideaSdk, Sdk sdk) { final SdkType sdkType = sdk.getSdkType(); if (sdkType instanceof JavaSdk) { - final String versionString = sdkType.getVersionString(sdk); - JDKVersion requiredJdkVersion = getRequiredJdkVersion(ideaSdk); - if (versionString != null && requiredJdkVersion != null) { - for (JDKVersion version : JDKVersion.values()) { - if (versionString.contains(version.getPresentation())) { - return requiredJdkVersion.compareTo(version) <= 0; - } - } - return true; + final JavaSdkVersion version = JavaSdk.getInstance().getVersion(sdk); + JavaSdkVersion requiredVersion = getRequiredJdkVersion(ideaSdk); + if (version != null && requiredVersion != null) { + return version.isAtLeast(requiredVersion); } } return false; @@ -279,15 +274,15 @@ public class IdeaJdk extends SdkType implements JavaSdkType { return result; } - private static JDKVersion getRequiredJdkVersion(final Sdk ideaSdk) { + @Nullable + private static JavaSdkVersion getRequiredJdkVersion(final Sdk ideaSdk) { int classFileVersion = getIdeaClassFileVersion(ideaSdk); - JDKVersion requiredJdkVersion = null; switch(classFileVersion) { - case 48: requiredJdkVersion = JDKVersion.V1_4; break; - case 49: requiredJdkVersion = JDKVersion.V1_5; break; - case 50: requiredJdkVersion = JDKVersion.V1_6; break; + case 48: return JavaSdkVersion.JDK_1_4; + case 49: return JavaSdkVersion.JDK_1_5; + case 50: return JavaSdkVersion.JDK_1_6; } - return requiredJdkVersion; + return null; } public static void setupSdkPaths(final SdkModificator sdkModificator, final String sdkHome, final Sdk internalJava) { @@ -518,19 +513,4 @@ public class IdeaJdk extends SdkType implements JavaSdkType { type == JavadocOrderRootType.getInstance() || type == AnnotationOrderRootType.getInstance(); } - - enum JDKVersion { - - V1_4("1.4"), V1_5("1.5"), V1_6("1.6"); - - private final String myPresentation; - - JDKVersion(String presentation) { - myPresentation = presentation; - } - - public String getPresentation() { - return myPresentation; - } - } }