Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@
import com.intellij.java.language.LanguageLevel;
import com.intellij.java.language.impl.projectRoots.JavaSdkVersionUtil;
import com.intellij.java.language.projectRoots.JavaSdkVersion;
import consulo.annotation.access.RequiredReadAction;
import consulo.codeEditor.Editor;
import consulo.content.bundle.Sdk;
import consulo.java.language.module.extension.JavaModuleExtension;
import consulo.java.language.module.extension.JavaMutableModuleExtension;
import consulo.language.editor.inspection.LocalQuickFix;
import consulo.language.editor.inspection.ProblemDescriptor;
import consulo.language.editor.intention.SyntheticIntentionAction;
import consulo.language.editor.localize.CodeInsightLocalize;
import consulo.language.psi.PsiElement;
import consulo.language.psi.PsiFile;
import consulo.language.util.IncorrectOperationException;
import consulo.language.util.ModuleUtilCore;
Expand All @@ -42,70 +44,85 @@
/**
* @author cdr
*/
public class IncreaseLanguageLevelFix implements SyntheticIntentionAction {
private static final Logger LOG = Logger.getInstance(IncreaseLanguageLevelFix.class);

private final LanguageLevel myLevel;

public IncreaseLanguageLevelFix(LanguageLevel targetLevel) {
myLevel = targetLevel;
}

@Override
@Nonnull
public LocalizeValue getText() {
return CodeInsightLocalize.setLanguageLevelTo0(myLevel.getDescription().get());
}

private static boolean isJdkSupportsLevel(@Nullable final Sdk jdk, final LanguageLevel level) {
if (jdk == null) return true;
JavaSdkVersion version = JavaSdkVersionUtil.getJavaSdkVersion(jdk);
JavaSdkVersion required = JavaSdkVersion.fromLanguageLevel(level);
return version != null && (level.isPreview() ? version.equals(required) : version.isAtLeast(required));
}

@Override
public boolean isAvailable(@Nonnull final Project project, final Editor editor, final PsiFile file) {
final VirtualFile virtualFile = file.getVirtualFile();
if (virtualFile == null) {
return false;
public class IncreaseLanguageLevelFix implements SyntheticIntentionAction, LocalQuickFix {
private static final Logger LOG = Logger.getInstance(IncreaseLanguageLevelFix.class);

private final LanguageLevel myLevel;

public IncreaseLanguageLevelFix(LanguageLevel targetLevel) {
myLevel = targetLevel;
}

@Nonnull
@Override
public LocalizeValue getText() {
return CodeInsightLocalize.setLanguageLevelTo0(myLevel.getDescription().get());
}

final Module module = ModuleUtilCore.findModuleForFile(virtualFile, project);
return module != null && isLanguageLevelAcceptable(module, myLevel);
}

public static boolean isLanguageLevelAcceptable(Module module, final LanguageLevel level) {
return isJdkSupportsLevel(ModuleUtilCore.getSdk(module, JavaModuleExtension.class), level);
}

@Override
@RequiredUIAccess
public void invoke(@Nonnull final Project project, final Editor editor, final PsiFile file) throws IncorrectOperationException {
final VirtualFile virtualFile = file.getVirtualFile();
LOG.assertTrue(virtualFile != null);
final Module module = ModuleUtilCore.findModuleForFile(virtualFile, project);
if (module == null) {
return;
@Nonnull
@Override
public LocalizeValue getName() {
return getText();
}

JavaModuleExtension extension = ModuleUtilCore.getExtension(module, JavaModuleExtension.class);
if (extension == null) {
return;
@Override
@RequiredUIAccess
public void applyFix(@Nonnull Project project, @Nonnull ProblemDescriptor descriptor) {
PsiElement element = descriptor.getPsiElement();
invoke(project, null, element.getContainingFile());
}

final ModifiableRootModel rootModel = ModuleRootManager.getInstance(module).getModifiableModel();
JavaMutableModuleExtension mutableModuleExtension = rootModel.getExtension(JavaMutableModuleExtension.class);
private static boolean isJdkSupportsLevel(@Nullable Sdk jdk, LanguageLevel level) {
if (jdk == null) {
return true;
}
JavaSdkVersion version = JavaSdkVersionUtil.getJavaSdkVersion(jdk);
JavaSdkVersion required = JavaSdkVersion.fromLanguageLevel(level);
return version != null && (level.isPreview() ? version.equals(required) : version.isAtLeast(required));
}

@Override
public boolean isAvailable(@Nonnull Project project, Editor editor, PsiFile file) {
VirtualFile virtualFile = file.getVirtualFile();
if (virtualFile == null) {
return false;
}

assert mutableModuleExtension != null;
Module module = ModuleUtilCore.findModuleForFile(virtualFile, project);
return module != null && isLanguageLevelAcceptable(module, myLevel);
}

mutableModuleExtension.getInheritableLanguageLevel().set(null, myLevel.getName());
public static boolean isLanguageLevelAcceptable(Module module, LanguageLevel level) {
return isJdkSupportsLevel(ModuleUtilCore.getSdk(module, JavaModuleExtension.class), level);
}

project.getApplication().runWriteAction(rootModel::commit);
}
@Override
@RequiredUIAccess
public void invoke(@Nonnull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
VirtualFile virtualFile = file.getVirtualFile();
LOG.assertTrue(virtualFile != null);
Module module = ModuleUtilCore.findModuleForFile(virtualFile, project);
if (module == null) {
return;
}

@Override
public boolean startInWriteAction() {
return false;
}
JavaModuleExtension extension = ModuleUtilCore.getExtension(module, JavaModuleExtension.class);
if (extension == null) {
return;
}

ModifiableRootModel rootModel = ModuleRootManager.getInstance(module).getModifiableModel();
JavaMutableModuleExtension mutableModuleExtension = rootModel.getExtension(JavaMutableModuleExtension.class);

assert mutableModuleExtension != null;

mutableModuleExtension.getInheritableLanguageLevel().set(null, myLevel.getName());

project.getApplication().runWriteAction(rootModel::commit);
}

@Override
public boolean startInWriteAction() {
return false;
}
}
Loading