From 17f0de2e3ca36799f790e22c50009ac3aadb89a8 Mon Sep 17 00:00:00 2001 From: UNV Date: Sat, 29 Nov 2025 18:28:45 +0300 Subject: [PATCH] Fixing ClassCastException in Java15APIUsageInspection while casting IncreaseLanguageLevelFix to LocalQuickFix. --- .../analysis/IncreaseLanguageLevelFix.java | 131 ++++++++++-------- 1 file changed, 74 insertions(+), 57 deletions(-) diff --git a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/analysis/IncreaseLanguageLevelFix.java b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/analysis/IncreaseLanguageLevelFix.java index 9415e3dc2..04397be3a 100644 --- a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/analysis/IncreaseLanguageLevelFix.java +++ b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/analysis/IncreaseLanguageLevelFix.java @@ -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; @@ -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; + } }