mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-130669 Language level should match JDK version for new projects
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+50
-1
@@ -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
|
||||
|
||||
+3
-5
@@ -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>
|
||||
|
||||
+5
-5
@@ -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) {
|
||||
|
||||
+12
-3
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user