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
This commit is contained in:
Bartek Pacia
2025-12-19 17:21:25 +00:00
committed by intellij-monorepo-bot
parent 1d07bcc7ac
commit 7cdd6b1cbe
@@ -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) {