From 9c8a98224278b6de0b8aa1cdf1fc850271a15ea4 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 24 Nov 2025 13:56:23 +0100 Subject: [PATCH] IDEA-382503 [java-formatter] Remove java.formatter.chained.calls.pre212.compatibility GitOrigin-RevId: 99cf272d7071700fff5f216c7584a75c78976db0 --- .../resource/intellij.java.frontback.impl.xml | 4 - .../psi/formatter/java/AbstractJavaBlock.java | 5 - .../java/JavaSpacePropertyProcessor.java | 3 - .../java/LegacyCallChunkBlockBuilder.java | 62 ------- .../LegacyChainedMethodCallsBlockBuilder.java | 155 ------------------ .../java/JavaFormatterIndentationTest.java | 38 ----- 6 files changed, 267 deletions(-) delete mode 100644 java/java-frontback-impl/src/com/intellij/psi/formatter/java/LegacyCallChunkBlockBuilder.java delete mode 100644 java/java-frontback-impl/src/com/intellij/psi/formatter/java/LegacyChainedMethodCallsBlockBuilder.java diff --git a/java/java-frontback-impl/resource/intellij.java.frontback.impl.xml b/java/java-frontback-impl/resource/intellij.java.frontback.impl.xml index 1a0adb147c44..381ea18d28e5 100644 --- a/java/java-frontback-impl/resource/intellij.java.frontback.impl.xml +++ b/java/java-frontback-impl/resource/intellij.java.frontback.impl.xml @@ -75,10 +75,6 @@ - - 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 7b07059764db..83d4306f37fc 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 @@ -6,7 +6,6 @@ import com.intellij.formatting.alignment.AlignmentStrategy; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; @@ -835,10 +834,6 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo if (nodes.isEmpty()) { return new LeafBlock(node, blockWrap, alignment, indent); } - if (Registry.is(LegacyChainedMethodCallsBlockBuilder.COMPATIBILITY_KEY)) { - return - new LegacyChainedMethodCallsBlockBuilder(alignment, blockWrap, indent, mySettings, myJavaSettings, myFormattingMode).build(nodes); - } return new ChainMethodCallsBlockBuilder(alignment, blockWrap, indent, mySettings, myJavaSettings, myFormattingMode, JavaFormatterConditionalExpressionUtil.isInsideConditionalExpression(node)).build(nodes); } diff --git a/java/java-frontback-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java b/java/java-frontback-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java index e601595ef762..e1c60563690a 100644 --- a/java/java-frontback-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java +++ b/java/java-frontback-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java @@ -11,7 +11,6 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; @@ -2049,8 +2048,6 @@ public final class JavaSpacePropertyProcessor extends JavaElementVisitor { private boolean isAllowedToMoveSemicolonInLongCallChain() { if (!myJavaSettings.WRAP_SEMICOLON_AFTER_CALL_CHAIN) return false; - if (Registry.is(LegacyChainedMethodCallsBlockBuilder.COMPATIBILITY_KEY)) return false; - if(!(myChild1 instanceof PsiMethodCallExpression) || myType1 != JavaElementType.METHOD_CALL_EXPRESSION) return false; if (isInsidePsiForStatement()) return false; diff --git a/java/java-frontback-impl/src/com/intellij/psi/formatter/java/LegacyCallChunkBlockBuilder.java b/java/java-frontback-impl/src/com/intellij/psi/formatter/java/LegacyCallChunkBlockBuilder.java deleted file mode 100644 index 663a344f00c3..000000000000 --- a/java/java-frontback-impl/src/com/intellij/psi/formatter/java/LegacyCallChunkBlockBuilder.java +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.intellij.psi.formatter.java; - -import com.intellij.formatting.*; -import com.intellij.formatting.alignment.AlignmentStrategy; -import com.intellij.lang.ASTNode; -import com.intellij.psi.JavaTokenType; -import com.intellij.psi.codeStyle.CommonCodeStyleSettings; -import com.intellij.psi.codeStyle.JavaCodeStyleSettings; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; - -import static com.intellij.psi.formatter.java.AbstractJavaBlock.newJavaBlock; - -/** - * The previous version of {@link CallChunkBlockBuilder} for compatibility with releases prior to 2021.2, - * see IDEA-274778. - */ -public class LegacyCallChunkBlockBuilder { - - private final CommonCodeStyleSettings mySettings; - private final CommonCodeStyleSettings.IndentOptions myIndentSettings; - private final JavaCodeStyleSettings myJavaSettings; - private final FormattingMode myFormattingMode; - - public LegacyCallChunkBlockBuilder(@NotNull CommonCodeStyleSettings settings, @NotNull JavaCodeStyleSettings javaSettings, - @NotNull FormattingMode formattingMode) { - mySettings = settings; - myIndentSettings = settings.getIndentOptions(); - myJavaSettings = javaSettings; - myFormattingMode = formattingMode; - } - - public @NotNull Block create(final @NotNull List subNodes, final Wrap wrap, final @Nullable Alignment alignment) { - final ArrayList subBlocks = new ArrayList<>(); - final ASTNode firstNode = subNodes.get(0); - if (firstNode.getElementType() == JavaTokenType.DOT) { - AlignmentStrategy strategy = AlignmentStrategy.getNullStrategy(); - Block block = newJavaBlock(firstNode, mySettings, myJavaSettings, Indent.getNoneIndent(), null, strategy, myFormattingMode); - subBlocks.add(block); - subNodes.remove(0); - if (!subNodes.isEmpty()) { - subBlocks.add(create(subNodes, wrap, null)); - } - return new SyntheticCodeBlock(subBlocks, alignment, mySettings, myJavaSettings, Indent.getContinuationIndent(myIndentSettings.USE_RELATIVE_INDENTS), wrap); - } - return new SyntheticCodeBlock(createJavaBlocks(subNodes), alignment, mySettings, myJavaSettings, Indent.getContinuationWithoutFirstIndent(myIndentSettings.USE_RELATIVE_INDENTS), null); - } - - private @NotNull List createJavaBlocks(final @NotNull List subNodes) { - final ArrayList result = new ArrayList<>(); - for (ASTNode node : subNodes) { - Indent indent = Indent.getContinuationWithoutFirstIndent(myIndentSettings.USE_RELATIVE_INDENTS); - result.add(newJavaBlock(node, mySettings, myJavaSettings, indent, null, AlignmentStrategy.getNullStrategy(), myFormattingMode)); - } - return result; - } - -} diff --git a/java/java-frontback-impl/src/com/intellij/psi/formatter/java/LegacyChainedMethodCallsBlockBuilder.java b/java/java-frontback-impl/src/com/intellij/psi/formatter/java/LegacyChainedMethodCallsBlockBuilder.java deleted file mode 100644 index d0df999cd1d3..000000000000 --- a/java/java-frontback-impl/src/com/intellij/psi/formatter/java/LegacyChainedMethodCallsBlockBuilder.java +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.intellij.psi.formatter.java; - -import com.intellij.formatting.*; -import com.intellij.lang.ASTNode; -import com.intellij.psi.JavaTokenType; -import com.intellij.psi.PsiComment; -import com.intellij.psi.codeStyle.CommonCodeStyleSettings; -import com.intellij.psi.codeStyle.JavaCodeStyleSettings; -import com.intellij.psi.impl.source.tree.JavaElementType; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -import static com.intellij.psi.formatter.java.JavaFormatterUtil.getWrapType; - -/** - * The previous version of {@link ChainMethodCallsBlockBuilder} for compatibility with releases prior to 2021.2, - * see IDEA-274778 - */ -public class LegacyChainedMethodCallsBlockBuilder { - public static final String COMPATIBILITY_KEY = "java.formatter.chained.calls.pre212.compatibility"; - - private final CommonCodeStyleSettings mySettings; - private final CommonCodeStyleSettings.IndentOptions myIndentSettings; - private final JavaCodeStyleSettings myJavaSettings; - - private final Wrap myBlockWrap; - private final Alignment myBlockAlignment; - private final Indent myBlockIndent; - - private final FormattingMode myFormattingMode; - - LegacyChainedMethodCallsBlockBuilder(Alignment alignment, - Wrap wrap, - Indent indent, - CommonCodeStyleSettings settings, - JavaCodeStyleSettings javaSettings, - @NotNull FormattingMode formattingMode) { - myBlockWrap = wrap; - myBlockAlignment = alignment; - myBlockIndent = indent; - mySettings = settings; - myIndentSettings = settings.getIndentOptions(); - myJavaSettings = javaSettings; - myFormattingMode = formattingMode; - } - - public Block build(List nodes) { - List blocks = buildBlocksFrom(nodes); - - Indent indent = myBlockIndent != null ? myBlockIndent : Indent.getContinuationWithoutFirstIndent(myIndentSettings.USE_RELATIVE_INDENTS); - return new SyntheticCodeBlock(blocks, myBlockAlignment, mySettings, myJavaSettings, indent, myBlockWrap); - } - - private List buildBlocksFrom(List nodes) { - List methodCall = splitMethodCallOnChunksByDots(nodes); - - Wrap wrap = null; - Alignment chainedCallsAlignment = null; - - List blocks = new ArrayList<>(); - - for (int i = 0; i < methodCall.size(); i++) { - ChainedCallChunk currentCallChunk = methodCall.get(i); - if (isMethodCall(currentCallChunk) || isComment(currentCallChunk)) { - if (wrap == null) { - wrap = createCallChunkWrap(i, methodCall); - } - if (chainedCallsAlignment == null) { - chainedCallsAlignment = createCallChunkAlignment(i, methodCall); - } - } - else { - wrap = null; - chainedCallsAlignment = null; - } - - LegacyCallChunkBlockBuilder builder = new LegacyCallChunkBlockBuilder(mySettings, myJavaSettings, myFormattingMode); - blocks.add(builder.create(currentCallChunk.nodes, wrap, chainedCallsAlignment)); - } - - return blocks; - } - - private static boolean isComment(ChainedCallChunk chunk) { - List nodes = chunk.nodes; - if (nodes.size() == 1) { - return nodes.get(0).getPsi() instanceof PsiComment; - } - return false; - } - - private Wrap createCallChunkWrap(int chunkIndex, @NotNull List methodCall) { - if (mySettings.WRAP_FIRST_METHOD_IN_CALL_CHAIN) { - ChainedCallChunk next = chunkIndex + 1 < methodCall.size() ? methodCall.get(chunkIndex + 1) : null; - if (next != null && isMethodCall(next)) { - return Wrap.createWrap(getWrapType(mySettings.METHOD_CALL_CHAIN_WRAP), true); - } - } - - return Wrap.createWrap(getWrapType(mySettings.METHOD_CALL_CHAIN_WRAP), false); - } - - private boolean shouldAlignMethod(ChainedCallChunk currentMethodChunk, List methodCall) { - return mySettings.ALIGN_MULTILINE_CHAINED_METHODS - && !currentMethodChunk.isEmpty() - && !chunkIsFirstInChainMethodCall(currentMethodChunk, methodCall); - } - - private static boolean chunkIsFirstInChainMethodCall(@NotNull ChainedCallChunk callChunk, @NotNull List methodCall) { - return !methodCall.isEmpty() && callChunk == methodCall.get(0); - } - - private static @NotNull List splitMethodCallOnChunksByDots(@NotNull List nodes) { - List result = new ArrayList<>(); - - List current = new ArrayList<>(); - for (ASTNode node : nodes) { - if (node.getElementType() == JavaTokenType.DOT || node.getPsi() instanceof PsiComment) { - if (!current.isEmpty()) { - result.add(new ChainedCallChunk(current)); - } - current = new ArrayList<>(); - } - current.add(node); - } - - if (!current.isEmpty()) { - result.add(new ChainedCallChunk(current)); - } - - return result; - } - - private Alignment createCallChunkAlignment(int chunkIndex, @NotNull List methodCall) { - ChainedCallChunk current = methodCall.get(chunkIndex); - return shouldAlignMethod(current, methodCall) - ? AbstractJavaBlock.createAlignment(mySettings.ALIGN_MULTILINE_CHAINED_METHODS, null) - : null; - } - - private static boolean isMethodCall(@NotNull ChainedCallChunk callChunk) { - List nodes = callChunk.nodes; - return nodes.size() >= 3 && nodes.get(2).getElementType() == JavaElementType.EXPRESSION_LIST; - } - - private record ChainedCallChunk(@NotNull List nodes) { - boolean isEmpty() { - return nodes.isEmpty(); - } - } -} - diff --git a/java/java-tests/testSrc/com/intellij/java/psi/formatter/java/JavaFormatterIndentationTest.java b/java/java-tests/testSrc/com/intellij/java/psi/formatter/java/JavaFormatterIndentationTest.java index dc699dc947bc..32a27e624340 100644 --- a/java/java-tests/testSrc/com/intellij/java/psi/formatter/java/JavaFormatterIndentationTest.java +++ b/java/java-tests/testSrc/com/intellij/java/psi/formatter/java/JavaFormatterIndentationTest.java @@ -16,10 +16,7 @@ package com.intellij.java.psi.formatter.java; import com.intellij.ide.highlighter.JavaFileType; -import com.intellij.openapi.util.registry.Registry; -import com.intellij.openapi.util.registry.RegistryValue; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; -import com.intellij.psi.formatter.java.LegacyChainedMethodCallsBlockBuilder; import com.intellij.util.IncorrectOperationException; /** @@ -839,39 +836,4 @@ public class JavaFormatterIndentationTest extends AbstractJavaFormatterTest { }""" ); } - - public void testIdea274778() { - CommonCodeStyleSettings.IndentOptions indentOptions = getSettings().getIndentOptions(); - indentOptions.INDENT_SIZE = 3; - indentOptions.CONTINUATION_INDENT_SIZE = 3; - getSettings().ALIGN_MULTILINE_CHAINED_METHODS = true; - RegistryValue pre212compat = Registry.get(LegacyChainedMethodCallsBlockBuilder.COMPATIBILITY_KEY); - try { - pre212compat.setValue(true); - doTextTest( - """ - class Foo { - void foo() { - LOG.error(DetailsMessage.of( - "TITLE", - "LONG MESSAGE TEXT...") - .with("value", value)); - } - }""", - - """ - class Foo { - void foo() { - LOG.error(DetailsMessage.of( - "TITLE", - "LONG MESSAGE TEXT...") - .with("value", value)); - } - }""" - ); - } - finally { - pre212compat.setValue(false); - } - } }