Skip to content

ChainStringBuilderAppendCalls should not flatten a single argument#823

Merged
timtebeek merged 2 commits intoopenrewrite:mainfrom
motlin:space-only-change
Feb 27, 2026
Merged

ChainStringBuilderAppendCalls should not flatten a single argument#823
timtebeek merged 2 commits intoopenrewrite:mainfrom
motlin:space-only-change

Conversation

@motlin
Copy link
Copy Markdown
Contributor

@motlin motlin commented Feb 26, 2026

What's changed?

Added a failing test demonstrating that ChainStringBuilderAppendCalls reformats append() arguments even when no chaining is needed. When append() contains a single non-literal expression (e.g. String.format(...)), flatAdditiveExpressions strips the argument's whitespace prefix, causing the recipe to produce a whitespace-only diff on every cycle.

What's your motivation?

A multiline sb.append(String.format(...)) call is being silently reformatted each cycle, collapsing the newline after append( into a single line. The recipe should be a no-op when there is nothing to chain.

Anything in particular you'd like reviewers to focus on?

This is just a failing test, so we'll need to implement a fix before landing this. I believe the fix is an early return when flattenExpressions.size() <= 1, since a single expression means there is no + concatenation to split into chained calls. This short-circuits before the grouping logic, which also prevents the prefix-stripping side effect from flatAdditiveExpressions. Is this the right fix, and should we squash that fix into the same pull request?

Checklist

  • I've added unit tests to cover both positive and negative cases
  • I've read and applied the recipe conventions and best practices
  • I've used the IntelliJ IDEA auto-formatter on affected files

@timtebeek timtebeek marked this pull request as draft February 27, 2026 09:26
@timtebeek
Copy link
Copy Markdown
Member

Yes that proposed fix makes sense to me! Thanks for reporting in detail & coming up with a solution.

@timtebeek timtebeek added bug Something isn't working recipe labels Feb 27, 2026
@github-project-automation github-project-automation bot moved this from In Progress to Ready to Review in OpenRewrite Feb 27, 2026
@timtebeek timtebeek marked this pull request as ready for review February 27, 2026 14:18
@timtebeek timtebeek changed the title Add failing test for spacing of single method invocation argument in append(). ChainStringBuilderAppendCalls should not flatten a single argument Feb 27, 2026
@timtebeek timtebeek merged commit 63586c0 into openrewrite:main Feb 27, 2026
1 check passed
@github-project-automation github-project-automation bot moved this from Ready to Review to Done in OpenRewrite Feb 27, 2026
mergify bot added a commit to robfrank/linklift that referenced this pull request Mar 10, 2026
… 2.28.0 to 2.29.0 [skip ci]

Bumps [org.openrewrite.recipe:rewrite-static-analysis](https://github.com/openrewrite/rewrite-static-analysis) from 2.28.0 to 2.29.0.
Release notes

*Sourced from [org.openrewrite.recipe:rewrite-static-analysis's releases](https://github.com/openrewrite/rewrite-static-analysis/releases).*

> 2.29.0
> ------
>
> What's Changed
> --------------
>
> * Remove mutable static field in ChainStringBuilderAppendCalls by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#822](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/822)
> * `ChainStringBuilderAppendCalls` should not flatten a single argument by [`@​motlin`](https://github.com/motlin) in [openrewrite/rewrite-static-analysis#823](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/823)
>
> New Contributors
> ----------------
>
> * [`@​motlin`](https://github.com/motlin) made their first contribution in [openrewrite/rewrite-static-analysis#823](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/823)
>
> **Full Changelog**: <openrewrite/rewrite-static-analysis@v2.28.0...v2.29.0>


Commits

* [`63586c0`](openrewrite/rewrite-static-analysis@63586c0) Add failing test for spacing of single method invocation argument in append()...
* [`017d753`](openrewrite/rewrite-static-analysis@017d753) Remove mutable static field in ChainStringBuilderAppendCalls ([#822](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/822))
* See full diff in [compare view](openrewrite/rewrite-static-analysis@v2.28.0...v2.29.0)
  
[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility\_score?dependency-name=org.openrewrite.recipe:rewrite-static-analysis&package-manager=maven&previous-version=2.28.0&new-version=2.29.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
  
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot show  ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working recipe

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

2 participants