What's Changed
- JavaScript: cache merge builders in a trie over property names by @knutwannheden in #9237
- JavaScript RPC: send object pages of 5000 messages by @knutwannheden in #9238
- JavaScript: dispatch visitor methods through a map of kinds by @knutwannheden in #9239
- RPC: resolve each received type name to its class once per queue by @knutwannheden in #9236
- Python RPC: dispatch sender and receiver nodes through one type-keyed table by @knutwannheden in #9240
- JavaScript: fixes for visiting delete statements on Java side by @greg-at-moderne in #9243
- Add support for upgrading and changing version catalog plugins in TOML format by @KamilPatora in #8950
- JavaScript: Add missing id to equals/hashCode of JS.ExpressionStateme… by @greg-at-moderne in #9242
- In tests, re-parse converted sources with their new language’s parser by @greg-at-moderne in #9241
- RPC: tell jsonrpc the response type each request expects by @knutwannheden in #9245
- Groovy: Add missing id to equals/hashCode of G.ExpressionStatement, G.GString and G.GString.Value by @knutwannheden in #9250
- Resolve Go modules excluded from a go.work standalone by @sambsnyd in #9203
- Xml: fix a few withers to return the same if no changes by @greg-at-moderne in #9249
- JavaScript: return same FunctionCall from withTypeParameters for an u… by @greg-at-moderne in #9248
- JavaScript: fixing integration tests by @greg-at-moderne in #9244
- Scala: fix type attribution of arrays, now JavaType.Array instead of Parameterized by @greg-at-moderne in #9246
- Python: fix missing type on Py.MatchCase.withGuard by @greg-at-moderne in #9251
- Fix whitespace when RemoveAnnotationVisitor removes several leading annotations by @timtebeek in #9253
- C#: pin MessagePack to 2.5.307 for CVE-2026-92707 by @timtebeek in #9255
- JavaScript: Fix missing visit to FunctionType.modifiers by @greg-at-moderne in #9252
- JavaScript: Fix three wrong-removal bugs in RemoveImport by @greg-at-moderne in #9259
- JavaScript: visit the space before await in for-await-of loops by @greg-at-moderne in #9258
- Lombok check: use tsym.getQualifiedName() instead of Type.toString() by @greg-at-moderne in #9254
- JavaScript: fix passing options from superclass recipe by @greg-at-moderne in #9256
- Silence JDK 8 javac warnings and notes in rewrite-java-8 by @timtebeek in #9264
- Enable Python test harness to assert about source files a recipe generates by @sambsnyd in #9265
- JavaScript: apply changed scalars in padded elements on RPC receive by @greg-at-moderne in #9269
- JSON: match numeric literals in JsonPath filter equality by @greg-at-moderne in #9268
- JavaScript: fix AddImport merging into empty named import by @greg-at-moderne in #9257
- HCL: select blocks by their labels in JsonPathMatcher by @greg-at-moderne in #9273
- JavaScript: fix wrong resolved version for duplicate packages in yarn/pnpm locks by @greg-at-moderne in #9271
- JavaScript: keep markers and type attribution through Prettier format by @greg-at-moderne in #9276
- Fix Xml.Tag.withValue IndexOutOfBoundsException on empty element by @greg-at-moderne in #9274
- HCL: add ChangeValue recipe by @greg-at-moderne in #9279
- HCL: don't re-indent heredoc content in AutoFormat by @greg-at-moderne in #9278
- HCL: add HclValues.stringValue and label/block name helpers by @greg-at-moderne in #9281
- rewrite-test: don't count generated or deleted files as changed again two cycles later by @knutwannheden in #9277
- Make RemoveUnusedProperties and RemoveUnusedImports converge in one cycle by @knutwannheden in #9270
- Hcl:
AddContentrecipe by @greg-at-moderne in #9283 - Honour a composite's causesAnotherCycle for its children's changes by @knutwannheden in #9272
- JavaScript: UpgradeTransitiveDependencyVersion writes no override for… by @greg-at-moderne in #9282
- JavaScript: read multi-document pnpm 11+ locks when refreshing resolved dependencies by @greg-at-moderne in #9285
- HCL: match top-level attributes, nested blocks by recursive descent a… by @greg-at-moderne in #9280
- Python RPC: encode frames with orjson and read received messages in place by @knutwannheden in #9288
- Go: return same CompilationUnit from withImports when imports are unchanged by @greg-at-moderne in #9286
- Python printer: dispatch nodes through accept_python/accept_java by @knutwannheden in #9289
- JavaScript: the RPC server pages at the default batch size by @knutwannheden in #9295
- TOML: decode basic-string escapes in Toml.Literal values by @knutwannheden in #9296
- Python: close wrong-lock paths in native lock regeneration found against the real package managers by @knutwannheden in #9297
- Python: ADR 0014 and uv optional-dependencies bookkeeping in native lock regeneration by @knutwannheden in #9299
- Python: uv.lock bookkeeping the corpus replay ranked: extras, constraints, dependents, stamps by @knutwannheden in #9300
- Python: read lock regeneration fixtures from openrewrite/rewrite-python-lock-fixtures by @knutwannheden in #9301
- Gradle: type-attribute develocity {} settings blocks, keep Develocity 3.19.2 by @timtebeek in #9303
- Scala: type repeated params as
T[]for Java andimmutable.Seqfor Scala by @greg-at-moderne in #9302 - JavaScript: regenerate npm locks as npm 11.21.1 and 12.2.1 by @knutwannheden in #9304
- Python: use X | None instead of Optional[X] in recipes by @timtebeek in #9306
- JavaScript: attribute calls and fields bound by a destructured
require()to the required module by @greg-at-moderne in #9307 - JavaScript: RPC codecs receive and send synchronously by @knutwannheden in #9247
- JavaScript: stream RPC object pages through a worker transport by @knutwannheden in #9293
- Python: fix SDK spots where recipe results disagree with real runs or with a parse by @knutwannheden in #9308
- Python: remove_import leaves the tree a parse of its output gives by @knutwannheden in #9309
- RPC: send comment-free Spaces as refs by @knutwannheden in #9290
- Python: ChangeImport moves members read through dotted and from-imported modules by @knutwannheden in #9310
- Python: port uv-pep508's marker algebra for uv lock regeneration by @knutwannheden in #9305
- Python: uv.lock edits render untouched lines as uv 0.13.4 writes them, and keep a satisfied lock by @knutwannheden in #9311
- Python: uv.lock edits that fork, revise dependents, or use environments and overrides match uv 0.13.4 by @knutwannheden in #9312
- Python: a Pipfile edit locks the packages its new versions require by @knutwannheden in #9313
- Fix provided deps resolution for maven by @BoykoAlex in #8306
- Find transitive targets in Gradle ExcludeDependency after an earlier model change by @steve-aom-elliott in #9298
- Use ListUtils.filter in FilterTagChildrenVisitor by @timtebeek in #9323
- Use
TreeVisitor#reduceinstead of a captured accumulator by @timtebeek in #9328 - Use
ListUtils.filterinstead of mapping elements tonullby @timtebeek in #9327 - Python: a uv.lock specifier records its numerals as PEP 440 writes them by @knutwannheden in #9320
- Python: a uv.lock edit splits the forks of a lock that is already forked by @knutwannheden in #9321
- Python: a changed uv.lock records each index as the manifest configures it by @knutwannheden in #9324
- Python: each uv.lock entry's own forks are recorded in solve order by @knutwannheden in #9325
- ADR 0014: port each Python resolver, and pipenv's install-correct contract by @knutwannheden in #9314
- Python: a uv.lock keeps the marker it recorded, and the upload times an HTML index lists by @knutwannheden in #9330
- Python: the uv reachability pass holds a marker, as uv does by @knutwannheden in #9332
- Python: parse implicit string concatenation into a balanced tree by @timtebeek in #9315
- Python: write synthesized line breaks in the file's own line ending by @timtebeek in #9316
- Python: type a decorated class declaration as the class it declares by @timtebeek in #9317
- Python: keep CRLF line breaks inside multi-line f-strings and t-strings by @timtebeek in #9318
- Scala:
ListBuffer.empty[T]and other parameterless generic factories get their instantiated return type by @greg-at-moderne in #9333 - Python: add an import to its isort section where the imports are grouped by @timtebeek in #9319
- Do not count a static import as a reference when adding a type import by @timtebeek in #9329
- Scala: map extractor patterns (
case Some(v),h :: t) toJ.DeconstructionPatternby @greg-at-moderne in #9338 - Scala: key Java static methods under the Java owner and strip
$only from module classes by @greg-at-moderne in #9337 - Scala: type attribution for annotation names by @greg-at-moderne in #9335
- JavaScript: one resolver for import and require() module bindings by @greg-at-moderne in #9339
- Fix Gradle 9 migration dependency and wrapper compatibility by @jkschneider in #9340
- Upgrade to Gradle 9.8.2 by @jkschneider in #9342
- JavaScript: keep only string-valued
enginesentries in NodeResolutionResult by @knutwannheden in #9345 - JavaScript: keep directories and the pnpm store out of project discovery by @knutwannheden in #9346
- JavaScript: escape lone surrogates in member names of type attribution by @knutwannheden in #9344
- Keep a file parseable when a Javadoc reference's package cannot be listed by @knutwannheden in #9343
- JavaScript: escape lone surrogates in the name of a call on
thisby @knutwannheden in #9347 - Scala: spell lone surrogates in J.Literal values as escapes by @knutwannheden in #9348
- Submit only shipped dependencies of the released commit to the dependency graph by @timtebeek in #9349
- Remove SortDependencies from Maven BestPractices by @steve-aom-elliott in #9350
- Attribute Markup markers to the recipe that added them by @natedanner in #9326
- JavaType equality works for lazily loaded types by @sambsnyd in #9352
- ChangeType updates fully qualified type references in Javadoc by @sambsnyd in #9351
- Give
MavenSettingsobject identity so a build's modules share one copy when serialized by @jkschneider in #9355 - Python: publish options of the recipes that delegate to Java by @knutwannheden in #9336
- Fail tests, not production runs, on a cursor whose parent holds the same element by @jkschneider in #9356
- Scala: fix semicolon (
;) parsing between statements by @greg-at-moderne in #9358 - Scala: type attribution names nested classes by their JVM binary name (
Map$Entry,Outer$Inner) by @greg-at-moderne in #9360 - Python: leave a dependency's own tests out of its exported types, and read its files as ty does by @jkschneider in #9234
- Record file deletions in RPC BatchVisit by @greg-at-moderne in #9364
- Mark test
AssertionsandSourceSpecswith@CheckReturnValueby @timtebeek in #9366 - Fail
rewriteRunwhen aScanningRecipeaccumulator keeps aHeavyweightobject by @jkschneider in #9367 - Java: Key local variable types by declaration position so sibling locals don't share flags, annotations by @greg-at-moderne in #9365
- Mark immutable-result APIs with
@CheckReturnValueby @timtebeek in #9369 - Python: resolve setuptools dependencies without building in the source tree by @knutwannheden in #9370
- Python: share one RPC process across tests, resetting it between them by @knutwannheden in #9374
- Stop discarding
ListUtils.mapresults by @timtebeek in #9368 - rewriteRun runs a verification cycle after declared expected cycles by @knutwannheden in #9359
- rewriteRun fails a test whose recipe leaves an import unused by @knutwannheden in #9375
- RemoveRedundantProperties: only remove properties older than the parent's value by @timtebeek in #9372
- AddOrUpdateAnnotationAttribute types the enum constants it writes by @knutwannheden in #9379
- RemoveImport unfolds a star import only into named types and keeps a written alias by @knutwannheden in #9377
- RemoveAnnotationAttribute removes the imports the removed value used by @knutwannheden in #9378
- Resolve the Tooling API plugin through MAVEN_CENTRAL_MIRROR_URL when it is set by @jkschneider in #9380
- Use MAVEN_CENTRAL_MIRROR_URL in place of Maven Central in model builds by @jkschneider in #9383
- Give rewrite-maven's tests that set up their own context the Maven Central mirror (tests only) by @jkschneider in #9384
- Send the Gradle plugin portal to MAVEN_CENTRAL_MIRROR_URL in model builds too by @jkschneider in #9385
- Probe local servers in repositoryOrder, since oss.sonatype.org now redirects to Maven Central by @jkschneider in #9386
- Let one test at a time use withLocalRepository, and take customInitScript's plugin from the mirror by @jkschneider in #9387
- Send Sonatype's snapshot repositories to MAVEN_CENTRAL_MIRROR_URL in model builds too by @jkschneider in #9389
- Keep MavenPomDownloaderTest and ResolvedPomTest off Maven Central and Sonatype (tests only) by @jkschneider in #9388
- Preserve primitive parameter types in FindSymbols signatures by @jkschneider in #9390
- Python: provision the dependency environment from the manifest the markers read by @knutwannheden in #9373
- Handle Maven RELEASE and LATEST dependency selectors by @jkschneider in #9391
- Install each RPC engine version once when several test forks start it at once by @jkschneider in #9396
- Compute rewrite-python's engine version from its commit in every build, rather than read back the file an earlier build left by @jkschneider in #9395
- Expect the mirror's URL in MavenDependencyFailuresTest as the downloader normalizes it, http when only http answers by @jkschneider in #9397
- Declare a shared BOM property override once, and settle upgrades of plugin-managed versions by @knutwannheden in #9371
- JavaScript: fix deleted trees in BatchVisit and RecipeSpec support for generated and deleted files by @greg-at-moderne in #9361
- Scala: key objects by their binary name (
Foo$) so classes and companions don't mix up by @greg-at-moderne in #9398 - JavaScript: flag async callbacks in sync array methods only on array receivers by @knutwannheden in #9401
- Add Gradle RemoveExclusion recipe by @timtebeek in #9376
- Scala: a union type is a MultiCatch of its alternatives by @greg-at-moderne in #9334
- C#: keep global.json msbuild-sdks while parsing instead of deleting the file by @macsux in #9382
- Add UpdateProjectUrlFromGitOrigin by @steve-aom-elliott in #9322
- Remove the benchmarks that load rewrite-spring's recipes, which made rewrite depend on rewrite-spring by @jkschneider in #9404
- Run rewrite-python's install and tests after pythonUpdateVersion, which rewrites the pyproject.toml they read by @jkschneider in #9405
- Set only pyproject.toml's own version in pythonUpdateVersion, not ruff's target-version and ty's python-version too by @jkschneider in #9407
Full Changelog: v8.93.10...v8.94.0