4c1033d684204686b3f91b85f05cc8862dc33964
[idea/community.git] / java / java-impl / src / com / intellij / codeInsight / daemon / impl / analysis / IncreaseLanguageLevelFix.java
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;
3
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;
27
28 public class IncreaseLanguageLevelFix implements IntentionAction, LocalQuickFix, HighPriorityAction {
29   private final LanguageLevel myLevel;
30
31   public IncreaseLanguageLevelFix(@NotNull LanguageLevel targetLevel) {
32     myLevel = targetLevel;
33   }
34
35   @NotNull
36   @Override
37   public String getText() {
38     return JavaBundle.message("set.language.level.to.0", myLevel.getPresentableText());
39   }
40
41   @Nls
42   @NotNull
43   @Override
44   public String getName() {
45     return getText();
46   }
47
48   @NotNull
49   @Override
50   public String getFamilyName() {
51     return JavaBundle.message("set.language.level");
52   }
53
54   @Override
55   public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
56     PsiElement element = descriptor.getPsiElement();
57     invoke(project, null, element.getContainingFile());
58   }
59
60   @Override
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);
66   }
67
68   @Override
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();
72     if (module != null) {
73       JavaProjectModelModificationService.getInstance(project).changeLanguageLevel(module, myLevel);
74       VirtualFile vFile = file.getVirtualFile();
75       if (oldLevel != null) {
76         UndoManager.getInstance(project).undoableActionPerformed(new BasicUndoableAction(vFile) {
77           @Override
78           public void undo() {
79             JavaProjectModelModificationService.getInstance(project).changeLanguageLevel(module, oldLevel);
80           }
81
82           @Override
83           public void redo() {
84             JavaProjectModelModificationService.getInstance(project).changeLanguageLevel(module, myLevel);
85           }
86         });
87       }
88     }
89   }
90
91   @Nullable
92   @Override
93   public PsiElement getElementToMakeWritable(@NotNull PsiFile file) {
94     return null;
95   }
96
97   @Override
98   public boolean startInWriteAction() {
99     return true;
100   }
101 }