Hello! We are happy to announce Scala 3.0.1-RC1 – the first release candidate in the post-3.0.0 era. With this release, we continue the work on making the compiler even more stable.
Research and experimentation has always been an integral part of the Scala community's culture. That's what made Scala the language it is right now. Like many things in engineering, however, it's a part of a trade-off between experimentation and stability. Experimenting is fun and insightful, but when stakes on your project are high, stability becomes a priority.
Therefore, to ensure wide adoption of the language and its reliability in wide range of applications, we need to balance the two. We would like to have the room for trying new things out – but while doing so, we would like to keep in mind an ordinary Scala user who may not necessarily be interested in the bleeding edge and who would like their Scala dependencies and code to simply work. In the post-3.0.0 era, we must prioritize stability.
With this release, we are introducing a restriction on features marked as experimental. Now, it is not possible to use them from stable or
RC releases. If you would like to experiment with them, you need to use a
NIGHTLY version of the compiler. Nightlies are published every 24 hours, and you can find them on Maven.
The spirit of this policy is to make sure that effectively, no library published for Scala 3 contain experimental features. This way, what is experimental can be easily changed and is not subject to the guarantees of the wider language. And, most importantly, the changes to such features would not affect the community in practice – the guarantee not achievable if we just announced the policy without implementing a mechanism to enforce it.
Having said that, we still encourage people to play with the experimental features from the
NIGHTLY compiler versions and discuss their findings. Without the curious and adventurous part of the community playing with the new features, there is no way of knowing what they are good for, and no way to decide whether they should be dropped or promoted to a stable feature.
More about this change you can read in the PR #12102.
This release also brings extra features for the Kind Projector migration support. First, PR #12378 allows
_ as type lambda placeholder. Second, PR #12341 brings support for the variance annotations on the placeholder. This work enhances the ability to cross-compile Scala 2 code that uses the Kind Projector plugin to Scala 3.
Down the error reporting lane, match type reduction errors were improved. When using a match type, it may or may not reduce to one of its cases. If it doesn't match type is used as specified, e.g. if
M[T] is a match type and it didn't reduce for
M[Int] will be used. This behavior, however, is frequently not what you want: there is a lot of cases where you would expect a match type to reduce but it doesn't. In such cases, it would be nice to have some diagnostic regarding why it didn't reduce. PR #12053 adds just such a diagnostic. E.g. the following code:
trait A trait B type M[X] = X match case A => Int case B => String val x: String = ??? : M[B] // error
will report the following error:
6 |val x: String = ??? : M[B] // error | ^^^^^^^^^^ | Found: M[B] | Required: String | | Note: a match type could not be fully reduced: | | trying to reduce M[B] | failed since selector B | does not match case A => Int | and cannot be shown to be disjoint from it either. | Therefore, reduction cannot advance to the remaining case | | case B => String
We have updated the documentation for Scaladoc making it easier for you to get started. Also, PR #11582 has added the snippet compiler to ensure the snippets in your scaladoc documentation comments aren't broken. You can read more about this feature on the mailing list.
A lot of metaprogramming work was focused on improving the performance. Some of the notable PRs include:
Otherwise, we are making an effort to reduce our issue tracker. Among others, the following are some of the PRs dedicated to issue fixing:
- IArray.toArray: Deprecate broken method #12598
- Fix comparison of dependent function types #12214
- Make translucentSuperType handle match types #12153
- Harden Type Inference #12560
- Reject references to self in super constructor calls #12567
- Provide mirror support after inlining #12062
- Allow export paths to see imports #12134
- Streamline given syntax #12107
- Export constructor proxies #12311
- Identify package and nested package object in isSubPrefix #12297
- Treat Refinements more like AndTypes #12317
- Fix #9871: use toNestedPairs in provablyDisjoint #10560
Thank you to all the contributors who made this release possible 🎉
git shortlog -sn --no-merges 3.0.0-RC2..3.0.1-RC1† these are:
121 Martin Odersky 111 Liu Fengyun 98 Nicolas Stucki 29 Guillaume Martres 24 Phil 20 Olivier Blanvillain 14 Tom Grigg 14 Adrien Piquerez 13 Natsu Kagami 12 Andrzej Ratajczak 10 odersky 10 Aleksander Boruch-Gruszecki 9 Anatolii Kmetiuk 8 Jamie Thompson 6 Maxime Kjaer 5 Som Snytt 3 Filip Zybała 3 Krzysztof Romanowski 3 Kai 3 Fengyun Liu 3 noti0na1 3 Phil Walker 2 Johannes Rudolph 2 soronpo 2 tanishiking 2 Adam Warski 2 Kacper Korban 2 Raphael Jolly 2 Sébastien Doeraene 1 xuwei-k 1 Alexander Ioffe 1 David Barri 1 Devon Stewart 1 Dmitrii Naumenko 1 Ivan Kurchenko 1 Jakub Kozłowski 1 Jonas Ackermann 1 Kevin Lee 1 Martin 1 Michał Pałka 1 Miles Sabin 1 Oron Port 1 Paweł Marks 1 Ruslan Shevchenko 1 Seth Tisue 1 Vadim Chelyshov 1 nogurenn 1 nurekata
†: Note that we measure against
3.0.0-RC2 and not
3.0.0 because we stabilized on
3.0.0-RC2. Only critical bug fixes found their way into
3.0.0-RC3 and further, while the majority of changes ended up in