From 7cdd6b1cbe4527fd353666b8baeb355083eb05e8 Mon Sep 17 00:00:00 2001 From: Bartek Pacia Date: Fri, 19 Dec 2025 13:18:31 +0100 Subject: [PATCH] LSP-345 fix ClassCastException when formatting a Java file with comments The formatting code (AbstractJavaBlock#createJavaBlock) was using the deprecated InjectedLanguageUtil#hasInjections, which internally cast InjectedLanguageManager to InjectedLanguageManagerImpl. This failed in environments using CoreInjectedLanguageManager instead of InjectedLanguageManagerImpl, like the LSP. I replaced the usage of InjectedLanguageUtil#hasInjections with `injectedLanguageManager.getInjectedPsiFiles() != null` (just like the Javadoc of InjectedLanguageUtil#hasInjections suggests). The root issue is that InjectedLanguageUtilBase#probeElementsUpInner calls InjectedLanguageManagerImpl#getInstanceImpl, which in an antipattern: dependency on a specific implementation instead of the public interface. GitOrigin-RevId: 1474f0d2a26800e8d49e0ea2bcd7b8da6d5cd83c --- .../psi/formatter/java/AbstractJavaBlock.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/java/java-frontback-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java b/java/java-frontback-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java index 83d4306f37fc..267932578055 100644 --- a/java/java-frontback-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java +++ b/java/java-frontback-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java @@ -4,6 +4,7 @@ package com.intellij.psi.formatter.java; import com.intellij.formatting.*; import com.intellij.formatting.alignment.AlignmentStrategy; import com.intellij.lang.ASTNode; +import com.intellij.lang.injection.InjectedLanguageManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; @@ -16,7 +17,6 @@ import com.intellij.psi.formatter.java.wrap.ReservedWrapsProvider; import com.intellij.psi.impl.source.SourceTreeToPsiMap; import com.intellij.psi.impl.source.codeStyle.ShiftIndentInsideHelper; import com.intellij.psi.impl.source.tree.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.impl.source.tree.java.ClassElement; import com.intellij.psi.javadoc.PsiMarkdownCodeBlock; import com.intellij.psi.jsp.JspClassLevelDeclarationStatementType; @@ -198,11 +198,11 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo if (isStatement(child, child.getTreeParent())) { return new CodeBlockBlock(child, wrap, alignment, actualIndent, settings, javaSettings, myFormattingMode); } - if (!isBuildIndentsOnly() && - child instanceof PsiComment && - child instanceof PsiLanguageInjectionHost && - InjectedLanguageUtil.hasInjections((PsiLanguageInjectionHost)child)) { - return new CommentWithInjectionBlock(child, wrap, alignment, indent, settings, javaSettings, formattingMode); + if (!isBuildIndentsOnly() && child instanceof PsiComment && child instanceof PsiLanguageInjectionHost psiLanguageInjectionHost) { + InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(childPsi.getProject()); + if (injectedLanguageManager.getInjectedPsiFiles(psiLanguageInjectionHost) != null) { + return new CommentWithInjectionBlock(child, wrap, alignment, indent, settings, javaSettings, formattingMode); + } } if (child instanceof LeafElement || child instanceof PsiMarkdownCodeBlock) { if (child.getElementType() == JavaTokenType.C_STYLE_COMMENT) {