1 // 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.
2 package com.intellij.codeInsight.daemon.impl.analysis;
4 import com.intellij.codeInsight.intention.HighPriorityAction;
5 import com.intellij.codeInsight.intention.IntentionAction;
6 import com.intellij.codeInspection.LocalQuickFix;
7 import com.intellij.codeInspection.ProblemDescriptor;
8 import com.intellij.java.JavaBundle;
9 import com.intellij.openapi.command.undo.BasicUndoableAction;
10 import com.intellij.openapi.command.undo.UndoManager;
11 import com.intellij.openapi.editor.Editor;
12 import com.intellij.openapi.module.Module;
13 import com.intellij.openapi.module.ModuleUtilCore;
14 import com.intellij.openapi.project.Project;
15 import com.intellij.openapi.projectRoots.ex.JavaSdkUtil;
16 import com.intellij.openapi.roots.JavaProjectModelModificationService;
17 import com.intellij.openapi.roots.LanguageLevelModuleExtensionImpl;
18 import com.intellij.openapi.vfs.VirtualFile;
19 import com.intellij.pom.java.AcceptedLanguageLevelsSettings;
20 import com.intellij.pom.java.LanguageLevel;
21 import com.intellij.psi.PsiElement;
22 import com.intellij.psi.PsiFile;
23 import com.intellij.util.IncorrectOperationException;
24 import org.jetbrains.annotations.Nls;
25 import org.jetbrains.annotations.NotNull;
26 import org.jetbrains.annotations.Nullable;
28 public class IncreaseLanguageLevelFix implements IntentionAction, LocalQuickFix, HighPriorityAction {
29 private final LanguageLevel myLevel;
31 public IncreaseLanguageLevelFix(@NotNull LanguageLevel targetLevel) {
32 myLevel = targetLevel;
37 public String getText() {
38 return JavaBundle.message("set.language.level.to.0", myLevel.getPresentableText());
44 public String getName() {
50 public String getFamilyName() {
51 return JavaBundle.message("set.language.level");
55 public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
56 PsiElement element = descriptor.getPsiElement();
57 invoke(project, null, element.getContainingFile());
61 public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
62 Module module = ModuleUtilCore.findModuleForFile(file);
63 return module != null &&
64 JavaSdkUtil.isLanguageLevelAcceptable(project, module, myLevel) &&
65 AcceptedLanguageLevelsSettings.isLanguageLevelAccepted(myLevel);
69 public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
70 Module module = ModuleUtilCore.findModuleForPsiElement(file);
71 LanguageLevel oldLevel = LanguageLevelModuleExtensionImpl.getInstance(module).getLanguageLevel();
73 JavaProjectModelModificationService.getInstance(project).changeLanguageLevel(module, myLevel);
74 VirtualFile vFile = file.getVirtualFile();
75 if (oldLevel != null) {
76 UndoManager.getInstance(project).undoableActionPerformed(new BasicUndoableAction(vFile) {
79 JavaProjectModelModificationService.getInstance(project).changeLanguageLevel(module, oldLevel);
84 JavaProjectModelModificationService.getInstance(project).changeLanguageLevel(module, myLevel);
93 public PsiElement getElementToMakeWritable(@NotNull PsiFile file) {
98 public boolean startInWriteAction() {