Skip to content
Open
No due date
Last updated Jun 2, 2026

Goal

Migrate scala-commons from Scala 2.13 to Scala 3 only.

Strategy: big bang + iterative restoration

Two-stage approach:

  1. Phase 1 — single "comment-and-green" PR. Cut over the build to Scala 3 only. Anything that doesn't compile is
    wrapped in /* ... */ and tagged // TODO[scala3-port]: <feature>. CI ends green. Codebase is
    intentionally feature-poor; this PR is the cut-over, not a feature-complete port.

  2. Phase 2+ — one PR per feature area. Each subsequent PR un-comments one block of TODO-tagged code, ships a Scala 3
    implementation, restores affected tests, and removes the entry from MIGRATION.md backlog.
    PRs stack on top of each other (base = prior phase's branch).

Why this shape

Previous attempt (closed PRs #856, #859; merged-but-not-on-scala-3: #857, #858) used a cross-build cherry-pick model —
scala/ + scala-2.13/ + scala-3/ source dirs and crossScalaVersions := Seq(scala3Version, scala2Version). The cross-axis was carrying ~70-80 files of dead 2.13 weight that the v2 release
won't ship anyway. Pivoting to Scala 3 only removes the maintenance cost and clarifies the
diff: every PR after Phase 1 is "implement feature X on Scala 3", not "keep both axes building".

Locked decisions

  • Target branch: AVSystem/scala-commons:scala-3 (unchanged baseline 1561d8dc).
  • Source layout: single source dir per module (src/main/scala, src/test/scala).
  • Cherry-picking: halotukozak's fork master is reference only — its scala-3/ files are read for inspiration during restoration
    PRs.
  • PR conventions:
    • title prefix [Scala 3]
    • assigned to this milestone
    • opened as draft (promoted to ready-for-review manually)
    • stacked chain — Phase 2 base = Phase 1 branch, Phase 3 base = Phase 2 branch, …
    • maintainer merges manually; CI must be green
  • Code quality (carried from prior plans):
    • no @nowarn / -Wconf introduced — fix at source
    • no porting of @deprecated symbols when a stdlib replacement exists
  • made dependency: added
  • CI matrix single Scala 3 axis × Temurin 17 / 21 / 25 = 3 shards.
  • MIGRATION.md: fresh start at repo root. Living backlog — entries added when commented, removed when
    restored.

Documentation deliverables

Every PR in this milestone updates MIGRATION.md so the doc captures the full Scala-3 transition contract for
downstream users:

  • Will not migrate — symbols, modules, or features explicitly dropped. Listed with rationale (no longer needed,
    replaced by stdlib, replaced by external lib, obsolete API).
  • Deprecated on Scala 3 — what we keep behind @deprecated with a pointer to the replacement. Includes since
    version and replaceWith where it makes sense.
  • Source-compat breaks — every place a downstream import / call site needs to change to compile under Scala 3.
    Per-module list. Includes old → new pairings where the rename/move is non-obvious.
  • Binary-compat breaks — separate section, picked up by MiMa once a Scala 3 baseline ships.
  • Disabled tests / modules — anything intentionally not running, with a reason and a "restore in PR #N" pointer if
    known.

This doc is the public contract. Reviewers should be able to read MIGRATION.md and understand exactly what changes for
a consumer of the library.

Out of scope (this milestone)

  • Keeping any Scala 2.13 artifact published. Last 2.13 release is whatever sits on master;
  • Tasty-MiMa enforcement. Activated only once an initial Scala 3 release ships.
  • jetty, analyzer, spring, RPC: Phase 1 disables; formal retirement decision deferred to a follow-up PR.
29% complete

List view