IDEA-130669 Language level should match JDK version for new projects

This commit is contained in:
Dmitry Avdeev
2015-02-03 13:29:34 +03:00
parent 8259274d3d
commit fe7b66a649
9 changed files with 107 additions and 20 deletions
@@ -223,10 +223,12 @@ public class NewProjectUtil {
JavaSdkVersion version = JavaSdk.getInstance().getVersion(jdk);
if (version != null) {
LanguageLevel level = version.getMaxLanguageLevel();
LanguageLevel maxLevel = version.getMaxLanguageLevel();
LanguageLevelProjectExtension extension = LanguageLevelProjectExtension.getInstance(ProjectManager.getInstance().getDefaultProject());
Boolean aDefault = extension.isDefault();
LanguageLevelProjectExtension ext = LanguageLevelProjectExtension.getInstance(project);
if (level.compareTo(ext.getLanguageLevel()) < 0) {
ext.setLanguageLevel(level);
if (aDefault != null && aDefault || maxLevel.compareTo(ext.getLanguageLevel()) < 0) {
ext.setLanguageLevel(maxLevel);
}
}
}
@@ -15,12 +15,18 @@
*/
package com.intellij.openapi.roots.ui.configuration;
import com.intellij.core.JavaCoreBundle;
import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.JavaSdkVersion;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ex.ProjectRootManagerEx;
import com.intellij.ui.ListCellRendererWrapper;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.pom.java.LanguageLevel;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -28,7 +34,10 @@ import javax.swing.*;
* @author ven
*/
public class LanguageLevelCombo extends ComboBox {
public static final String USE_PROJECT_LANGUAGE_LEVEL = ProjectBundle.message("project.language.level.combo.item");
@Nullable
private LanguageLevel myDefaultLevel;
public LanguageLevelCombo() {
for (LanguageLevel level : LanguageLevel.values()) {
@@ -48,7 +57,47 @@ public class LanguageLevelCombo extends ComboBox {
}
public void reset(Project project) {
setSelectedItem(LanguageLevelProjectExtension.getInstance(project).getLanguageLevel());
removeAllItems();
for (LanguageLevel level : LanguageLevel.values()) {
addItem(level);
}
myDefaultLevel = null;
Sdk sdk = ProjectRootManagerEx.getInstanceEx(project).getProjectSdk();
if (sdk != null) {
JavaSdkVersion version = JavaSdk.getInstance().getVersion(sdk);
if (version != null) {
myDefaultLevel = version.getMaxLanguageLevel();
}
}
String item = null;
if (myDefaultLevel != null) {
item = JavaCoreBundle.message("default.jdk.level.description", myDefaultLevel.getPresentableText());
addItem(item);
}
else if (project.isDefault()) {
item = JavaCoreBundle.message("default.language.level.description");
addItem(item);
myDefaultLevel = LanguageLevelProjectExtension.getInstance(project).getLanguageLevel();
}
LanguageLevelProjectExtension extension = LanguageLevelProjectExtension.getInstance(project);
Boolean aDefault = extension.isDefault();
if (item != null && aDefault != null && aDefault) {
setSelectedItem(item);
}
else {
setSelectedItem(extension.getLanguageLevel());
}
}
@Nullable
public LanguageLevel getSelectedLevel() {
Object item = getSelectedItem();
return item instanceof LanguageLevel ? (LanguageLevel)item : myDefaultLevel;
}
public boolean isDefault() {
return !(getSelectedItem() instanceof LanguageLevel);
}
@Override
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.openapi.roots.ui.configuration.ProjectConfigurable">
<grid id="27dc6" binding="myWholePanel" layout-manager="GridLayoutManager" row-count="5" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="10">
<grid id="27dc6" binding="myWholePanel" layout-manager="GridLayoutManager" row-count="5" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="5">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="907" height="288"/>
@@ -34,7 +34,7 @@
<component id="1f983" class="com.intellij.openapi.roots.ui.configuration.LanguageLevelCombo" binding="myLanguageLevelCombo" custom-create="true">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="7" anchor="8" fill="0" indent="0" use-parent-layout="false">
<minimum-size width="-1" height="26"/>
<minimum-size width="310" height="28"/>
</grid>
</constraints>
<properties/>
@@ -59,9 +59,7 @@
<children>
<component id="60d6f" class="com.intellij.ui.FieldPanel" binding="myProjectCompilerOutput" custom-create="true">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false">
<minimum-size width="215" height="-1"/>
</grid>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
@@ -42,7 +42,6 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.FieldPanel;
import com.intellij.ui.InsertPathAction;
@@ -139,7 +138,7 @@ public class ProjectConfigurable extends ProjectStructureElementConfigurable<Pro
nameFieldPanel.add(myProjectName);
namePanel.add(nameFieldPanel, BorderLayout.CENTER);
final JPanel wrapper = new JPanel(new FlowLayout(FlowLayout.LEFT));
final JPanel wrapper = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
wrapper.add(namePanel);
wrapper.setAlignmentX(0);
myPanel.add(wrapper, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0,
@@ -150,7 +149,7 @@ public class ProjectConfigurable extends ProjectStructureElementConfigurable<Pro
myProjectJdkConfigurable = new ProjectJdkConfigurable(myProject, model);
myPanel.add(myProjectJdkConfigurable.createComponent(), new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
new Insets(4, 4, 0, 0), 0, 0));
new Insets(4, 0, 0, 0), 0, 0));
myPanel.add(myWholePanel, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST,
GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0));
@@ -224,8 +223,9 @@ public class ProjectConfigurable extends ProjectStructureElementConfigurable<Pro
compilerProjectExtension.setCompilerOutputPointer(null);
}
final LanguageLevel newLevel = (LanguageLevel)myLanguageLevelCombo.getSelectedItem();
LanguageLevelProjectExtension.getInstance(myProject).setLanguageLevel(newLevel);
LanguageLevelProjectExtension extension = LanguageLevelProjectExtension.getInstance(myProject);
extension.setLanguageLevel(myLanguageLevelCombo.getSelectedLevel());
extension.setDefault(myLanguageLevelCombo.isDefault());
myProjectJdkConfigurable.apply();
if (myProjectName != null) {
@@ -31,28 +31,33 @@ import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
public class LanguageLevelProjectExtensionImpl extends LanguageLevelProjectExtension {
public class LanguageLevelProjectExtensionImpl extends LanguageLevelProjectExtension {
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.roots.impl.LanguageLevelProjectExtensionImpl");
@Deprecated
@NonNls private static final String ASSERT_KEYWORD_ATTR = "assert-keyword";
@Deprecated
@NonNls private static final String JDK_15_ATTR = "jdk-15";
private static final String LANGUAGE_LEVEL = "languageLevel";
private static final String DEFAULT_ATTRIBUTE = "default";
private LanguageLevel myLanguageLevel = LanguageLevel.JDK_1_6;
private final Project myProject;
public LanguageLevelProjectExtensionImpl(final Project project) {
myProject = project;
setDefault(project.isDefault() ? true : null);
}
private void readExternal(final Element element) {
String level = element.getAttributeValue("languageLevel");
String level = element.getAttributeValue(LANGUAGE_LEVEL);
if (level == null) {
myLanguageLevel = migrateFromIdea7(element);
}
else {
myLanguageLevel = LanguageLevel.valueOf(level);
}
String aDefault = element.getAttributeValue(DEFAULT_ATTRIBUTE);
setDefault(aDefault == null ? null : Boolean.parseBoolean(aDefault));
}
private static LanguageLevel migrateFromIdea7(Element element) {
@@ -70,7 +75,11 @@ public class LanguageLevelProjectExtensionImpl extends LanguageLevelProjectExten
}
private void writeExternal(final Element element) {
element.setAttribute("languageLevel", myLanguageLevel.name());
element.setAttribute(LANGUAGE_LEVEL, myLanguageLevel.name());
Boolean aBoolean = isDefault();
if (aBoolean != null) {
element.setAttribute(DEFAULT_ATTRIBUTE, Boolean.toString(aBoolean));
}
writeAttributesForIdea7(element);
}
@@ -19,6 +19,7 @@ import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project;
import com.intellij.pom.java.LanguageLevel;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Dmitry Avdeev
@@ -34,6 +35,21 @@ public abstract class LanguageLevelProjectExtension {
public abstract void setLanguageLevel(@NotNull LanguageLevel languageLevel);
private Boolean myDefault;
/**
* Auto-detect language level from project JDK maximum possible level.
* @return null if the property is not set yet (e.g. after migration).
*/
@Nullable
public Boolean isDefault() {
return myDefault;
}
public void setDefault(@Nullable Boolean value) {
myDefault = value;
}
public abstract void languageLevelsChanged();
/**
@@ -16,6 +16,8 @@
package com.intellij.pom.java;
import com.intellij.core.JavaCoreBundle;
import com.intellij.openapi.roots.LanguageLevelModuleExtension;
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
import com.intellij.openapi.util.Key;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NonNls;
@@ -24,6 +26,8 @@ import org.jetbrains.annotations.Nullable;
/**
* @author dsl
* @see LanguageLevelProjectExtension
* @see LanguageLevelModuleExtension
*/
public enum LanguageLevel {
JDK_1_3("Java 1.3", JavaCoreBundle.message("jdk.1.3.language.level.description")),
@@ -1,5 +1,7 @@
psi.error.attempt.to.edit.class.file=Cannot modify compiled element
default.language.level.description=JDK default
default.jdk.level.description=JDK default ({0})
jdk.1.3.language.level.description=1.3 - Plain old Java
jdk.1.4.language.level.description=1.4 - 'assert' keyword
jdk.1.5.language.level.description=5.0 - 'enum' keyword, generics, autoboxing etc.
@@ -35,7 +35,6 @@ import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.LanguageLevel;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -155,8 +154,16 @@ public class JavaModuleBuilder extends ModuleBuilder implements SourcePathsBuild
@Nullable
@Override
public List<Module> commit(@NotNull Project project, ModifiableModuleModel model, ModulesProvider modulesProvider) {
LanguageLevel defaultLevel = LanguageLevelProjectExtension.getInstance(ProjectManager.getInstance().getDefaultProject()).getLanguageLevel();
LanguageLevelProjectExtension.getInstance(project).setLanguageLevel(defaultLevel);
LanguageLevelProjectExtension extension = LanguageLevelProjectExtension.getInstance(ProjectManager.getInstance().getDefaultProject());
Boolean aDefault = extension.isDefault();
LanguageLevelProjectExtension instance = LanguageLevelProjectExtension.getInstance(project);
if (aDefault != null && !aDefault) {
instance.setLanguageLevel(extension.getLanguageLevel());
instance.setDefault(false);
}
else {
instance.setDefault(true);
}
return super.commit(project, model, modulesProvider);
}