Hi there,
For the last month I was actively working on migrating Apache Kafka to
Scala 3. For what I could see, Apache Kafka is the biggest mixed Java-Scala
project to attempt a migration to Scala 3. This means, a lot of regressions
in regards to Java and Scala interoperability at bytecode were found within
this task. You can take a look at the PR here:
https://github.com/apache/kafka/pull/11350
Currently, the status of the migration is as follows:

   - All tests pass in Scala 3 except one (
   
KafkaApis#getAllTopicMetadataShouldNotCreateTopicOrReturnUnknownTopicPartition).
   Root cause for this is this bug with no easy workaround: Type erased for
   by-name parameters lampepfl/dotty#13638
   <https://github.com/lampepfl/dotty/issues/13638>
   - All tests pass in Scala 2
   - It still uses a snapshot build of Gradle with support for Scala 3
   - Spotbugs detected some new errors when the code was compiled with
   Scala 3. Some are simply false positives, but a small subset seem like they
   might be legit bugs in Scala 3. I still need to come up with a minimized
   reproducer for those cases.

As one can see, most of the changes are arguably low-level and no big
rewrite was needed. The biggest refactoring was splitting several classes
into their own file.

Changes made in this PR could be categorized in 3 different groups:
a) Needed changes because of changes in syntax or compiler being currently
more strict
b) Changes where a workaround is present but they are (or will be) fixed in
upcoming Scala versions
c) Changes in the build file

In order to have a smooth and manageable migration to Scala 3, I propose
perform the migration in several steps:

   - Firstly apply all changes that would fall into category *a)*
   - Once a new Scala version that incorporates the mentioned fixes is
   released, revisit point changes in point *b)*
   - Once Type erased for by-name parameters lampepfl/dotty#13638
   <https://github.com/lampepfl/dotty/issues/13638> is resolved or a
   workaround is found and Gradle with Scala 3 support is released we could
   tackle the final step and incorporate changes mentioned in point *c)*
   - After this, we would run the Scala Migration Tool to automatically
   rewrite the code that uses removed syntax or language constructs. (See
   
https://docs.scala-lang.org/scala3/guides/migration/tooling-migration-mode.html
   )


What do you think about this approach? Please feel free to share your
opinion on the proposed plan.
Also, I'm not sure if this should be written in a KIP form or not, no
public interfaces needed to be modified.


For extra information, these are the bugs reported to Scala 3 so far:

   - https://github.com/lampepfl/dotty/issues/13549
   - https://github.com/lampepfl/dotty/issues/13572
   - https://github.com/lampepfl/dotty/issues/13630
   - https://github.com/lampepfl/dotty/issues/13638
   - https://github.com/lampepfl/dotty/issues/13645


Thank you in advance!
-- 

Josep Prat

*Aiven Deutschland GmbH*

Immanuelkirchstraße 26, 10405 Berlin

Amtsgericht Charlottenburg, HRB 209739 B

Geschäftsführer: Oskari Saarenmaa & Hannu Valtonen

*m:* +491715557497

*w:* aiven.io

*e:* josep.p...@aiven.io

Reply via email to