Goal
Migrate scala-commons from Scala 2.13 to Scala 3 only.
Strategy: big bang + iterative restoration
Two-stage approach:
-
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. -
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 fromMIGRATION.mdbacklog.
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 baseline1561d8dc). - Source layout: single source dir per module (
src/main/scala,src/test/scala). - Cherry-picking: halotukozak's fork
masteris reference only — itsscala-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
- title prefix
- Code quality (carried from prior plans):
- no
@nowarn/-Wconfintroduced — fix at source - no porting of
@deprecatedsymbols when a stdlib replacement exists
- no
madedependency: 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
@deprecatedwith a pointer to the replacement. Includessince
version andreplaceWithwhere 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.
List view
0 issues of 22 selected
- Status: Open (in progress).AVSystem/scala-commonsnumber 861#861 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 862#862 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 863#863 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 865#865 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 867#867 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 866#866 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 821#821 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 868#868 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 869#869 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 870#870 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 871#871 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 872#872 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 873#873 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 874#874 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 875#875 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 877#877 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 878#878 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 879#879 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 880#880 In AVSystem/scala-commons;
- Status: Open (in progress).AVSystem/scala-commonsnumber 881#881 In AVSystem/scala-commons;
- Status: Draft (not ready).AVSystem/scala-commonsnumber 882#882 In AVSystem/scala-commons;
- Status: Draft (not ready).AVSystem/scala-commonsnumber 883#883 In AVSystem/scala-commons;