Skip to content

Regression test for ReplaceStackWithDeque crash on this argument#864

Merged
knutwannheden merged 1 commit into
mainfrom
fix-replacestackwithdeque-dataflownode-crash
Apr 21, 2026
Merged

Regression test for ReplaceStackWithDeque crash on this argument#864
knutwannheden merged 1 commit into
mainfrom
fix-replacestackwithdeque-dataflownode-crash

Conversation

@knutwannheden
Copy link
Copy Markdown
Contributor

@knutwannheden knutwannheden commented Apr 21, 2026

Motivation

The flagship Java best practices recipe run failed on finos/messageml-utils and finos/tracdap today with:

java.lang.RuntimeException: Unable to create DataFlowNode for Cursor{Identifier->MethodInvocation->...}
  org.openrewrite.analysis.dataflow.DataFlowNode.ofOrThrow(DataFlowNode.java:76)
  org.openrewrite.analysis.dataflow.analysis.ForwardFlow.computeVariableAssignment(ForwardFlow.java:466)
  org.openrewrite.analysis.dataflow.analysis.ForwardFlow$Analysis.visitIdentifier(ForwardFlow.java:302)

Both files used this as an argument to a method invocation (result.add(this), validator.apply(target, arg, this)) in code that ReplaceStackWithDeque traced dataflow through. Root cause was a one-character typo in rewrite-analysis where ThisAccess.Factory.viewOf checked for "super" instead of "this", so DataFlowNode.of returned none for every this identifier.

Summary

  • Add ReplaceStackWithDequeTest.thisAsArgumentInMethodInvocation — a minimal reproducer of the production crash: a Stack variable in the same method as result.add(this)

Test plan

  • Test fails with the old rewrite-analysis (same stack trace as production)
  • Test passes with rewrite-analysis#95 merged (verified locally against a Maven Local snapshot)
  • ./gradlew test --tests ReplaceStackWithDequeTest passes

Note: CI needs the rewrite-analysis snapshot that includes the fix. Rerun CI once the next rewrite-analysis SNAPSHOT is published.

Covers the dataflow crash fixed in openrewrite/rewrite-analysis#95,
where the recipe threw `Unable to create DataFlowNode` when a `Stack`
variable shared a method with a call that passed `this` as an argument.
@github-project-automation github-project-automation Bot moved this to In Progress in OpenRewrite Apr 21, 2026
@knutwannheden knutwannheden merged commit 9ba38b4 into main Apr 21, 2026
1 check passed
@knutwannheden knutwannheden deleted the fix-replacestackwithdeque-dataflownode-crash branch April 21, 2026 06:48
@github-project-automation github-project-automation Bot moved this from In Progress to Done in OpenRewrite Apr 21, 2026
mergify Bot added a commit to robfrank/linklift that referenced this pull request May 3, 2026
… 2.30.0 to 2.34.0 [skip ci]

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

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

> 2.34.0
> ------
>
> What's Changed
> --------------
>
> * bugfix: false positive in AnnotateNullableParameters when parameter … by [`@​stefanodallapalma`](https://github.com/stefanodallapalma) in [openrewrite/rewrite-static-analysis#865](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/865)
>
> **Full Changelog**: <openrewrite/rewrite-static-analysis@v2.33.0...v2.34.0>
>
> 2.33.1
> ------
>
> **Full Changelog**: <openrewrite/rewrite-static-analysis@v2.33.0...v2.33.1>
>
> 2.33.0
> ------
>
> What's Changed
> --------------
>
> * A new test case for `SimplifyBooleanExpression` by [`@​greg-at-moderne`](https://github.com/greg-at-moderne) in [openrewrite/rewrite-static-analysis#848](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/848)
> * `InstanceOfPatternMatch` to avoid providing invalid variable definitions pointing to itself by [`@​greg-at-moderne`](https://github.com/greg-at-moderne) in [openrewrite/rewrite-static-analysis#849](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/849)
> * Enrich recipe descriptions with rationale by [`@​jkschneider`](https://github.com/jkschneider) in [openrewrite/rewrite-static-analysis#850](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/850)
> * Fix EmptyBlock, FinalClass, HideUtilityClassConstructor; add regression tests by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#851](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/851)
> * Fix switch-related recipe bugs ([#6](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/6), [#9](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/9), [#14](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/14), [#687](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/687)) by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#852](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/852)
> * Add space after // in single-line comments by [`@​AVIMTA`](https://github.com/AVIMTA) in [openrewrite/rewrite-static-analysis#854](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/854)
> * Fix InstanceOfPatternMatch duplicate pattern variable names with flow scoping by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#855](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/855)
> * Fix RenameExceptionInEmptyCatch crash on Kotlin/Groovy files by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#856](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/856)
> * Fix FinalizeLocalVariables crash on Kotlin/Groovy top-level variables by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#857](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/857)
> * Fix UnnecessaryExplicitTypeArguments within lambda return statements by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#858](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/858)
> * Add SillyEqualsCheck recipe (RSPEC-S2159) by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#834](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/834)
> * Add RemoveUnusedLabels recipe (RSPEC-S1065) by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#835](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/835)
> * Add S2209/S3252 recipe: Static members via class name by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#836](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/836)
> * Add S1185 recipe: Remove methods that only call super by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#837](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/837)
> * NeedBraces: add test for if-else, fix do-while by [`@​greg-at-moderne`](https://github.com/greg-at-moderne) in [openrewrite/rewrite-static-analysis#859](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/859)
> * Add tests confirming [#20](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/20) is fixed by [`@​greg-at-moderne`](https://github.com/greg-at-moderne) in [openrewrite/rewrite-static-analysis#860](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/860)
> * Handle chained addition in PreferIncrementOperator by [`@​greg-at-moderne`](https://github.com/greg-at-moderne) in [openrewrite/rewrite-static-analysis#816](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/816)
> * Fix UnnecessaryCatch for nested try-with-resources close() by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#863](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/863)
> * Fix FinalizePrivateFields breaking code with lambda reads in field initializers by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#862](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/862)
> * Regression test for `ReplaceStackWithDeque` crash on `this` argument by [`@​knutwannheden`](https://github.com/knutwannheden) in [openrewrite/rewrite-static-analysis#864](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/864)
>
> New Contributors
> ----------------
>
> * [`@​AVIMTA`](https://github.com/AVIMTA) made their first contribution in [openrewrite/rewrite-static-analysis#854](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/854)
>
> **Full Changelog**: <openrewrite/rewrite-static-analysis@v2.32.0...v2.33.0>
>
> 2.32.0
> ------
>
> What's Changed
> --------------
>
> * Remove [`@​Disabled`](https://github.com/Disabled) tests in `ReplaceStackWithDequeTest` by [`@​greg-at-moderne`](https://github.com/greg-at-moderne) in [openrewrite/rewrite-static-analysis#840](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/840)
> * A couple of test cases in `RemoveExtraSemicolonsTest`  are no longer expected to fail by [`@​greg-at-moderne`](https://github.com/greg-at-moderne) in [openrewrite/rewrite-static-analysis#841](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/841)
> * Fix compilation after new args added to Cs.CompilationUnit by [`@​greg-at-moderne`](https://github.com/greg-at-moderne) in [openrewrite/rewrite-static-analysis#842](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/842)
> * Improve AnnotateNullableParameters to avoid duplicate annotations and annotation placement issues by [`@​stefanodallapalma`](https://github.com/stefanodallapalma) in [openrewrite/rewrite-static-analysis#843](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/843)
> * Inline JavaTemplate fields at call sites by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#844](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/844)
> * Use `JavaTemplate.apply()` static method by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#846](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/846)
> * Improve AnnotateNullableMethods to avoid duplicate annotations and annotation placement issues by [`@​stefanodallapalma`](https://github.com/stefanodallapalma) in [openrewrite/rewrite-static-analysis#845](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/845)
> * Skip `InstanceOfPatternMatch` for try-with-resources casts by [`@​timtebeek`](https://github.com/timtebeek) in [openrewrite/rewrite-static-analysis#847](https://redirect.github.com/openrewrite/rewrite-static-analysis/pull/847)

... (truncated)


Commits

* [`90e4a60`](openrewrite/rewrite-static-analysis@90e4a60) bugfix: false positive in AnnotateNullableParameters when parameter … ([#865](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/865))
* [`b315bbc`](openrewrite/rewrite-static-analysis@b315bbc) Extract documentation examples from tests
* [`9ba38b4`](openrewrite/rewrite-static-analysis@9ba38b4) Add regression test for `ReplaceStackWithDeque` crash on `this` argument ([#864](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/864))
* [`78afc25`](openrewrite/rewrite-static-analysis@78afc25) Fix FinalizePrivateFields breaking compilation when field is read in a lambda...
* [`3b2d847`](openrewrite/rewrite-static-analysis@3b2d847) OpenRewrite recipe best practices
* [`2a0baac`](openrewrite/rewrite-static-analysis@2a0baac) Fix UnnecessaryCatch removing IOException for nested try-with-resources close...
* [`47094c2`](openrewrite/rewrite-static-analysis@47094c2) Handle chained addition in PreferIncrementOperator ([#816](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/816))
* [`e097fab`](openrewrite/rewrite-static-analysis@e097fab) Add tests confirming [#20](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/20) is fixed ([#860](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/860))
* [`3710118`](openrewrite/rewrite-static-analysis@3710118) Test for if-else, fix do-while NeedBraces ([#859](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/859))
* [`c6ebfd4`](openrewrite/rewrite-static-analysis@c6ebfd4) Add S1185 recipe: Remove methods that only call super ([#837](https://redirect.github.com/openrewrite/rewrite-static-analysis/issues/837))
* Additional commits viewable in [compare view](openrewrite/rewrite-static-analysis@v2.30.0...v2.34.0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

1 participant