- Latest releases of popular Backend repositories
Release notes
Release notes
Lua 5.3.4 has been frozen and is now the current release of Lua 5.3.
Like all minor releases, this is a bug-fix release. Lua 5.3.4 fixes all bugs listed in http://www.lua.org/bugs.html#5.3.3
Lua 5.3.4 also contains several internal improvements and includes a revised reference manual: http://www.lua.org/manual/5.3/
Lua 5.3.4 is available at http://www.lua.org/ftp/lua-5.3.4.tar.gz
The checksums are
- MD5 53a9c68bcc0eda58bdc2095ad5cdfc63
- SHA1 79790cfd40e09ba796b01a571d4d63b52b1cd950
For installation and building instructions, see http://www.lua.org/manual/5.3/readme.html
A test suite for Lua 5.3.4 is available at http://www.lua.org/tests/
The complete source code of Lua 5.3.4 is available for browsing at http://www.lua.org/source/5.3/
The complete diffs from Lua 5.3.3 to Lua 5.3.4 are available at
Release notes
:star: New Features
- Thread-safe removal of destruction callbacks in web scopes #23117
- Guard against ConcurrentModificationExceptions in the systemProperties PropertySource #23063
- OncePerRequestFilter does not work properly on Error Dispatch on Jetty #22989
- SimpleMessageListenerContainer - add possibility to disable manual recovery #22987
- AntPathMatcher#isPattern ignores template variables #22959
- Avoid expensive assertions in web resource resolution #22955
- WebFlux: Mono does not invoke onComplete(), but instead cancel() #22952
- Illegal reflective access on shutdown of ExecutorService #22939
- Illegal reflective access by SpEL ReflectivePropertyAccessor #22242
:beetle: Bug Fixes
- Fix MockHttpServletRequest.setCookies to produce single Cookie header #23074
- MappingMediaTypeFileExtensionResolver ConcurrentModificationException #23064
- Weird behaviour when calling
ApplicationContext.getBean()
with a null class reference #23045 - StompSubProtocolHandler does not close the connection after sending an ERROR frame #23039
- WebFlux AbstractView does not allow null model values anymore #23038
- Fix ScriptUtils for MS Windows line ending #23019
- validation error message {0} is not working #23014
- AnnotatedElementUtils.findMergedAnnotation not working for javax annotations (e.g. NotNull) #22957
- WebFlux AbstractView does not update BindingResult for resolved async attributes #22933
- HeaderResultMatchers should not import org.junit.Assert #22932
:notebook_with_decorative_cover: Documentation
- Reintroduce author list and copyright notice #23049
- spring-mvc.xsd stale-if-error attribute documentation incorrect #22983
- AbstractBeanDefinition.getBeanClass() javadoc misleads about returning null #22960
- Fix typo in package-info.java #22941
:heart: Contributors
We'd like to thank all the contributors who worked on this release!
Release notes
Release notes
OTP 22.0
Erlang/OTP 22 is a new major release with new features and improvements as well as incompatibilities.
For a deeper dive into the hightligts of the OTP 22 release, you can read our blog here: http://blog.erlang.org/OTP-22-Highlights/
Potential Incompatibilities
- gen_* behaviours: If logging of the last N messages through sys:log/2,3 is active for the server, this log is included in the terminate report
- reltool: A new element, Opts, can now be included in a rel tuple in the reltool release specific configuration format: {rel, Name, Vsn, RelApps, Opts}.
- All external pids/ports/refs created by erlang:list_to_pid and similar functions now compare equal to any other pid/port/ref with same number from that node.
- The old legacy erl_interface library is deprecated as of OTP 22, and will be removed in OTP 23. This does not apply to the ei library.
- VxWorks is deprecated as of OTP 22 and will be removed in OTP 23.
New Features
Erts:
- Support for Erlang Distribution protocol to split the payload of large signals into several fragments.
- ETS option write_concurrency now also effects and improves scalability of ordered_set tables.
- The length/1 BIF used to calculate the length of the list in one go without yielding, even if the list was very long. Now it yields when called with long lists.
- A new (still experimental) module socket is introduced. It is implemented as a NIF and the idea is that it shall be as "close as possible" to the OS level socket interface.
- Added the NIF function enif_term_type, which helps avoid long sequences of enif_is_xyz by returning the type of the given term. This is especially helpful for NIFs that serialize terms, such as JSON encoders, where it can improve both performance and readability.
Compiler:
- The compiler has been rewritten to internally use an intermediate representation based on Static Single Assignment (SSA). The new intermediate representation makes more optimizations possible.
- The binary matching optimizations are now applicable in many more circumstances than before.
- Type optimizations are now applied across local function calls, and will remove a lot more redundant type tests than before.
- All compiler options that can be given in the source file can now be given in the option list on the command line for erlc.
- In OTP 22, HiPE (the native code compiler) is not fully functional. The reasons for this are new BEAM instructions for binary matching that the HiPE native code compiler does not support. If erlc is invoked with the +native option, and if any of the new binary matching instructions are used, the compiler will issue a warning and produce a BEAM file without native code.
Standard libraries:
- Cover now uses the counters module instead of ets for updating counters. The new function cover:local_only/0 allows running Cover in a restricted but faster local-only mode. The increase in speed will vary depending on the type of code being cover-compiled, as an example the compiler test suite runs more than twice as fast with the new Cover.
- A simple socket API is provided through the socket module. This is a low level API that does not replace gen_tcp|udp|sctp. It is intended to eventually replace the inet driver. It also provides a basic API that facilitates the implementation of other protocols than TCP, UDP and SCTP. Known issues are; No support for the Windows OS (currently), a small term leakage. This feature will be classed as experimental in OTP 22.
- SSL: now uses the new logger API, including log levels and verbose debug logging.
- SSL: Basic support for TLS 1.3 Server for experimental use.
- Crypto: The new hash_info/1 and cipher_info/1 functions returns maps with information about the hash or cipher in the argument.
For more details see http://erlang.org/download/otp_src_22.0.readme
Pre built versions for Windows can be fetched here: http://erlang.org/download/otp_win32_22.0.exe http://erlang.org/download/otp_win64_22.0.exe
Online documentation can be browsed here: http://erlang.org/doc/search/
The Erlang/OTP source can also be found at GitHub on the official Erlang repository:
https://github.com/erlang/otp/releases/tag/OTP-22.0
Make sure to report any and all bugs here:
Thank you for all your contributions!
Release notes
Releases
The main feature in Elixir v1.9 is the addition of releases. A release is a self-contained directory that consists of your application code, all of its dependencies, plus the whole Erlang Virtual Machine (VM) and runtime. Once a release is assembled, it can be packaged and deployed to a target as long as the target runs on the same operating system (OS) distribution and version as the machine running the
mix release
command.You can start a new project and assemble a release for it in three easy steps:
$ mix new my_app $ cd my_app $ MIX_ENV=prod mix release
A release will be assembled in
_build/prod/rel/my_app
. Inside the release, there will be abin/my_app
file which is the entry point to your system. It supports multiple commands, such as:bin/my_app start
,bin/my_app start_iex
,bin/my_app restart
, andbin/my_app stop
- for general management of the releasebin/my_app rpc COMMAND
andbin/my_app remote
- for running commands on the running system or to connect to the running systembin/my_app eval COMMAND
- to start a fresh system that runs a single command and then shuts downbin/my_app daemon
andbin/my_app daemon_iex
- to start the system as a daemon on Unix-like systemsbin/my_app install
- to install the system as a service on Windows machines
Why releases?
Releases allow developers to precompile and package all of their code and the runtime into a single unit. The benefits of releases are:
Code preloading. The VM has two mechanisms for loading code: interactive and embedded. By default, it runs in the interactive mode which dynamically loads modules when they are used for the first time. The first time your application calls
Enum.map/2
, the VM will find theEnum
module and load it. There’s a downside. When you start a new server in production, it may need to load many other modules, causing the first requests to have an unusual spike in response time. Releases run in embedded mode, which loads all available modules upfront, guaranteeing your system is ready to handle requests after booting.Configuration and customization. Releases give developers fine grained control over system configuration and the VM flags used to start the system.
Self-contained. A release does not require the source code to be included in your production artifacts. All of the code is precompiled and packaged. Releases do not even require Erlang or Elixir in your servers, as they include the Erlang VM and its runtime by default. Furthermore, both Erlang and Elixir standard libraries are stripped to bring only the parts you are actually using.
Multiple releases. You can assemble different releases with different configuration per application or even with different applications altogether.
Hooks and Configuration
Releases also provide built-in hooks for configuring almost every need of the production system:
config/config.exs
(andconfig/prod.exs
) - provides build-time application configuration, which is executed when the release is assembledconfig/releases.exs
- provides runtime application configuration. It is executed every time the release boots and is further extensible via config providersrel/vm.args.eex
- a template file that is copied into every release and provides static configuration of the Erlang Virtual Machine and other runtime flagsrel/env.sh.eex
andrel/env.bat.eex
- template files that are copied into every release and executed on every command to set up environment variables, including ones specific to the VM, and the general environment
We have written extensive documentation on releases, so we recommend checking it out for more information.
Configuration overhaul
A new
Config
module has been added to Elixir. The previous configuration API,Mix.Config
, was part of the Mix build tool. But since releases provide runtime configuration and Mix is not included in releases, we ported theMix.Config
API to Elixir. In other words,use Mix.Config
has been soft-deprecated in favor ofimport Config
.Another important change related to configuration is that
mix new
will no longer generate aconfig/config.exs
file. Relying on configuration is undesired for most libraries and the generated config files pushed library authors in the wrong direction. Furthermore,mix new --umbrella
will no longer generate a configuration for each child app, instead all configuration should be declared in the umbrella root. That's how it has always behaved, we are now making it explicit.Other enhancements
There are many other enhancements. The Elixir CLI got a handful of new options in order to best support releases.
Logger
now computes its sync/async/discard thresholds in a decentralized fashion, reducing contention.EEx
templates support more complex expressions than before. Finally, there is a new~U
sigil for working with UTC DateTimes as well as new functions in theFile
,Registry
, andSystem
modules.v1.9.0 (2019-06-24)
1. Enhancements
EEx
- EEx Allow more complex mixed expressions when tokenizing
Elixir
- Access Allow
Access.at/1
to handle negative index - CLI Add support for
--boot
,--boot-var
,--erl-config
,--pipe-to
,--rpc-eval
, and--vm-args
options - Code Add
static_atom_encoder
option toCode.string_to_quoted/2
- Code Support
:force_do_end_blocks
onCode.format_string!/2
andCode.format_file!/2
- Code Do not raise on deadlocks on
Code.ensure_compiled/1
- Config Add
Config
,Config.Reader
, andConfig.Provider
modules for working with configuration - File Add
File.rename!/2
- Inspect Add
:inspect_fun
and:custom_options
toInspect.Opts
- Kernel Add
~U
sigil for UTC date times - Kernel Optimize
&super/arity
and&super(&1)
- Kernel Optimize generated code for
with
with a catch-all clause - Kernel Validate
__struct__
key in map returned by__struct__/0,1
- Module Add
Module.get_attribute/3
- Protocol Improve
Protocol.UndefinedError
messages to also include the type that was attempted to dispatch on - Protocol Optimize performance of dynamic dispatching for non-consolidated protocols
- Record Include field names in generated type for records
- Regex Automatically recompile regexes
- Registry Add
Registry.select/2
- System Add
System.restart/0
,System.pid/0
andSystem.no_halt/1
- System Add
System.get_env/2
,System.fetch_env/1
, andSystem.fetch_env!/1
- System Support
SOURCE_DATE_EPOCH
for reproducible builds
ExUnit
- ExUnit Allow multiple
:exclude
on configuration/CLI - ExUnit.DocTest No longer wrap doctest errors in custom exceptions. They ended-up hiding more information than showing
- ExUnit.DocTest Display the actual doctest code when doctest fails
IEx
- IEx.CLI Copy ticktime from remote node on IEx
--remsh
- IEx.CLI Automatically add a host on node given to
--remsh
Logger
- Logger Use a decentralized mode computation for Logger which allows overloads to be detected more quickly
- Logger Use
persistent_term
to store configuration whenever available for performance
Mix
- Mix Follow XDG base dir specification in Mix for temporary and configuration files
- Mix.Generator Add
copy_file/3
,copy_template/4
, andoverwite?/2
- Mix.Project Add
preferred_cli_target
that works likepreferred_cli_env
- mix archive.uninstall Allow
mix archive.uninstall APP
to uninstall any installed version of APP - mix new No longer generate a
config/
directory for mix new - mix release Add support for releases
- mix release.init Add templates for release configuration
- mix test Allow running tests for a given umbrella app from the umbrella root with
mix test apps/APP/test
. Test failures also include theapps/APP
prefix in the test location
2. Bug fixes
EEx
- EEx Consistently trim newlines when you have a single EEx expression per line on multiple lines
Elixir
- Code Quote
::
inCode.format_string!/1
to avoid ambiguity - Code Do not crash formatter on false positive sigils
- Enum Ensure the first equal entry is returned by
Enum.min/2
andEnum.max/2
- Kernel Improve error message when string interpolation is used in a guard
- Kernel Properly merge and handle docs for callbacks with multiple clauses
- Kernel Guarantee reproducible builds on modules with dozens of specs
- Kernel Resolve
__MODULE__
accordingly in nesteddefmodule
to avoid double nesting - Kernel Type variables starting with an underscore (
_foo
) should not raise compile error - Kernel Keep order of elements when macro
in/2
is expanded with a literal list on the right-hand side - Kernel Print proper location on undefined function error from dynamically generated functions
- System Make sure
:init.get_status/0
is set to{:started, :started}
once the system starts - Path Do not expand
~
inPath.expand/2
when not followed by a path separator - Protocol Ensure
debug_info
is kept in protocols - Regex Ensure inspect returns valid
~r//
expressions when they are manually compiled with backslashes - Registry Fix ETS leak in
Registry.register/2
for already registered calls in unique registries while the process is still alive
ExUnit
- ExUnit Raise error if attempting to run single line tests on multiple files
- ExUnit Return proper error on duplicate child IDs on
start_supervised
IEx
- IEx Automatically shut down IEx if we receive EOF
Logger
- Logger Don't discard Logger messages from other nodes as to leave a trail on both systems
Mix
- mix compile Ensure Erlang-based Mix compilers (erlang, leex, yecc) set valid position on diagnostics
- mix compile Ensure compilation halts in an umbrella project if one of the siblings fail to compile
- mix deps Raise an error if the umbrella app's dir name and
mix.exs
app name don't match - mix deps.compile Fix subcommand splitting bug in rebar3
- mix test Do not consider modules that are no longer cover compiled when computing coverage report, which could lead to flawed reports
3. Soft-deprecations (no warnings emitted)
Mix
- Mix.Config
Mix.Config
has been deprecated in favor of theConfig
module that now ships as part of Elixir itself. Reading configuration files should now be done by theConfig.Reader
module
4. Hard-deprecations
Elixir
- CLI Deprecate
--detached
option, use--erl "-detached"
instead - Map Deprecate Enumerable keys in
Map.drop/2
,Map.split/2
, andMap.take/2
- String The
:insert_replaced
option inString.replace/4
has been deprecated. Instead you may pass a function as a replacement or use:binary.replace/4
if you need to support earlier Elixir versions
Mix
- Mix.Project Deprecate
Mix.Project.load_paths/1
in favor ofMix.Project.compile_path/1
Checksums
- Precompiled.zip SHA1: e9847341ca0484da0ade831bf5d714d9094629c1
- Precompiled.zip SHA512: 89686dd150abbc3c65be373dedf60971801063537a3b32cccdcd7eda18e5a9b3b78012b11a2f06575824e0164fbf0b80178a7de943f508ec90ad9a74d8a1da05
- Docs.zip SHA1: d53d941dde32066e3f8d7aea6a5c85b77e32810d
- Docs.zip SHA512: a63ae1c11f0e2c787a18309fcf02e5eba579b7161d552fa70e0d9987e3a2407109b7cbc3ac8e9a9bca50c3a185f1d9f16e0dd3354c28f9aaf93211e1db054226
Release notes
We are delighted to announce the availability of Scala 2.13.0!
Release summary
2.13 improves Scala in the following areas:
- Collections: Standard library collections have been overhauled for simplicity, performance, and safety. This is the centerpiece of the release.
- Standard library:
Future
is faster and more robust. Elsewhere, useful classes and methods have been added. - Language: Literal types, partial unification, by-name implicits, more.
- Compiler: 5-10% faster, deterministic output, improved optimizer.
To learn more, read on.
Collections redesign
Standard library collections have been overhauled for simplicity, performance, and safety.
This is the centerpiece of the release.
Most ordinary code that used the old collections will continue to work as-is, except as detailed below.
The most important collections changes are:
- Simpler method signatures
- No more
CanBuildFrom
. Transformation methods no longer take an implicitCanBuildFrom
parameter. - The resulting library is easier to understand (in code, Scaladoc, and IDE code completion).
- It also makes user code compile faster.
- A new
BuildFrom
implicit is used in a handful of places that need it.
- No more
- Simpler type hierarchy
- No more
Traversable
andTraversableOnce
.- They remain only as deprecated aliases for
Iterable
andIterableOnce
.
- They remain only as deprecated aliases for
- Parallel collections are now a separate module.
- As a result,
GenSeq
,GenTraversableOnce
, et al are gone.
- As a result,
- No more
- Immutable
scala.Seq
Seq
is now an alias forcollection.immutable.Seq
- Before, it was an alias for the possibly-mutable
collection.Seq
.
- Before, it was an alias for the possibly-mutable
- This also changes the type of varargs in methods and pattern matches.
- Arrays passed as varargs are defensively copied. (#6970)
- Simplified views that work
collection.View
s have been vastly simplified and should now work reliably.
- New, faster
HashMap/Set
implementations - New concrete collections
immutable.LazyList
replacesimmutable.Stream
.Stream
had different laziness behavior and is now deprecated. (#7558, #7000)immutable.ArraySeq
is an immutable wrapper for an array; there is also a mutable versionmutable.CollisionProofHashMap
guards against denial-of-service attacks (#7633)mutable.ArrayDeque
is a double-ended queue that internally uses a resizable circular buffer (scala/collection-strawman#490)mutable.Stack
was reimplemented (and undeprecated)- In 2.12, both immutable and mutable
Stack
s wereList
-based and deprecated. - 2.13 adds a brand-new
mutable.Stack
backed by anArrayDeque
. immutable.Stack
was removed.
- In 2.12, both immutable and mutable
- New abstract collection type
SeqMap
immutable.SeqMap
provides immutable maps that maintain insertion order. (#7954)- Implementations:
VectorMap
(#6854) andTreeSeqMap
(#7146) (in addition to the already existingListMap
).
Additional collections changes:
- New
to(Collection)
method- Replaces old
to[Collection]
method. - The argument is the companion object of the desired collection type, for example
.to(Vector)
. - The API change enables support for all collection types (including
Map
,BitSet
, et al).
- Replaces old
- No more
collection.breakOut
- It required
CanBuildFrom
, which no longer exists. - To avoid constructing intermediate collections, use
.view
and.to(Collection)
instead.
- It required
List
andVector
are safer- They now offer safe publication under the Java Memory Model, using
releaseFence
(#6425)
- They now offer safe publication under the Java Memory Model, using
- Java interop has moved
- Extension methods for Scala are now in
scala.jdk
- Explicit converters for Java are in
scala.jdk.javaapi
- The reorganization centralizes all to-and-from-Java converters, including both collection and non-collection types, in a single package.
- Extension methods for Scala are now in
- Collection serialization has changed
- Collections now use the serialization proxy pattern uniformly whenever possible. (#6676, #7624, scala-dev#562, sbt/sbt#89)
- In some classloading environments, notably sbt's non-forked test execution, code changes may be needed.
- Added
.unfold
- This allows constructing a collection or iterator from an initial element and a repeated
Option
-returning operation, terminating onNone
. - This was added collection companion objects and to
Iterator
(#6851)
- This allows constructing a collection or iterator from an initial element and a repeated
- Added
.lengthIs
/.sizeIs
and.sizeCompare
- Error-prone
Map
methods deprecated - Added
.lazyZip
- Together with
.zip
on views, this replaces.zipped
(now deprecated). (scala/collection-strawman#223)
- Together with
- Added
.tapEach
method- This allows inserting side-effects in a chain of method calls on a collection or view. (#7124)
- Added
.updatedWith
andupdateWith
methods toMap
s - Deprecated symbolic methods with multiple arguments
- Such methods may be disallowed entirely in a future Scala. (#6719)
- Adding custom collections and operations works very differently
- See documentation links below.
To learn more about the new APIs and how to adapt your code, consult:
- Scala 2.13's Collections
- Intro for newcomers. Skip if the collections from Scala 2.12 and earlier are already familiar to you.
- The Architecture of Scala 2.13 Collections
- Implementing Custom Collections (Scala 2.13)
- Adding Custom Collection Operations (Scala 2.13)
- Migrating a Project to 2.13's Collections.
- This document describes the main changes for collection users that migrate to Scala 2.13 and shows how to cross-build on Scala 2.11/12/13.
- scala-collection-compat
- This new module provides shims for cross-building on Scala 2.11/12/13.
- It also provides two sets of Scalafix rewrites: one for cross-building, one for moving to 2.13 only.
We welcome assistance in continuing to expand and improve these documents.
Concurrency
Futures were internally redesigned, with these goals:
- provide expected behavior under a broader set of failure conditions
- provide a foundation for increased performance
- support more robust applications
Details:
- Updated and revised our
Future
andPromise
implementation. (#6610, #7663)- Among other changes, handling of
InterruptedException
andRejectedExecutionException
is improved.
- Among other changes, handling of
- Made the global
ExecutionContext
“batched”. (#7470) - Added synchronous ("parasitic")
ExecutionContext
. (#7784)
Standard library: additions
- Integrated Java interop (#7987)
- The old
scala-java8-compat
module is now part of the standard library. (#7458) - This provides converters for options, function types and Java streams.
- (As mentioned above, collection converters such as
JavaConverters
were moved to fit into the new scheme.)
- The old
- new:
scala.util.Using
- new: use
s
interpolator in pattern matches- Provides a simple string matcher as the dual of the simple string interpolator. (#7387)
- Example:
val s"$day-$month-$year" = "11-June-2019"
- new:
pipe
andtap
- These chaining operations are available via
import scala.util.chaining._
. (#7007) - Example:
3.pipe(_ * 5)
evaluates to 15 - Example:
9.tap(println)
first prints 9, then returns it
- These chaining operations are available via
- new:
.toIntOption
, et al - new: named
Product
elements- Case classes and other
Product
s now haveproductElementNames
andproductElementName
methods. (#6972)
- Case classes and other
- new:
.withRight
,.withLeft
- new:
Ordering.Double.TotalOrdering
,Ordering.Float.TotalOrdering
- The old orderings remain available at:
Ordering.Double.IeeeOrdering
,Ordering.Float.IeeeOrdering
- Example:
List(2.0, 1.0).sorted
now warns unless you import or pass an ordering. (#6410)
- The old orderings remain available at:
- new: converters between functions and extractors
- New methods provide conversions among optional
Function
s,PartialFunction
s and extractor objects. (#7111)
- New methods provide conversions among optional
- new:
@unused
annotation- This annotation is useful for suppressing warnings under
-Xlint
. (#7623)
- This annotation is useful for suppressing warnings under
Standard library: changes
- Library fits in compact1 profile
- This reduces deployment footprint for Scala applications. (#6164, scala/bug#10559)
Option
extendsIterableOnce
- This improves type inference when calling an overloaded
flatMap
. (#8038)
- This improves type inference when calling an overloaded
- Undeprecate
linesIterator
to avoid conflict with JDK 11'sString.lines
(#7269) PartialFunction
now overloadsandThen
. (#7263)- Replaced
Cloneable
/Serializable
traits with type aliases (#6729) ControlThrowable
never suppresses (#7413)
Standard library: deprecations and removals
Not a complete list, only the deprecations users are likeliest to encounter.
- String-building using
+
with a non-String
type on the left (akaany2stringadd
) is deprecated. (#6315, #6755) PartialFunction.fromFunction
replacesPartialFunction.apply
(#6703)- Right projections on
Either
are deprecated. (#6682, #8012) - Deprecated
@usecase
Scaladoc tag. (#7462) - Deprecated universal
Equiv
. (#7414) - The following modules are no longer included in the distribution: scala-xml, scala-parser-combinators, scala-swing.
- They are community-maintained and published to Maven Central.
- Assorted deprecated methods and classes throughout the standard library have been removed entirely.
Language changes
2.13 is primarily a library release, not a language/compiler release. Regardless, some language changes are included:
Features:
- Literal types
- Literals (for strings, integers, and so on) now have associated literal types. (#5310)
- See the original proposal, SIP-23, for motivation and details.
- The compiler will provide instances of a new typeclass
scala.ValueOf[T]
for all singleton typesT
. - A
Singleton
upper bound prevents widening (e.g.T <: Int with Singleton
). - The value of a singleton type can be accessed by calling method
valueOf[T]
. Example:val one: 1 = valueOf[1]
- Partial unification on by default
- Improves type constructor inference, fixes SI-2712.
- We recommend this great explanation of this feature.
- This feature is no longer considered experimental (#5102)
- The compiler no longer accepts
-Ypartial-unification
.
- By-name implicits with recursive dictionaries
- This extends by-name method arguments to support implicit (not just explicit) parameters.
- This enables implicit search to construct recursive values.
- The flagship use-case is typeclass derivation.
- Details: see the by-name implicits SIP, #6050, #7368
- Underscores in numeric literals
- Underscores can now be used as a spacer. (#6989)
- Example:
1_000_000
Experimental features:
- Macro annotations
- There is no more "macro paradise" compiler plugin for 2.13.
- Instead, macro annotations are handled directly by the compiler.
- Macro annotations are enabled with the
-Ymacro-annotations
flag. #6606 - Macro annotations remain experimental.
Deprecations:
- Procedure syntax deprecated
- Deprecated:
def m() { ... }
) #6325 - Use instead:
def m(): Unit = { ... }
- Deprecated:
- View bounds deprecated
- Deprecated:
A <% B
(#6500) - Use instead:
(implicit ev: A => B)
- Deprecated:
- Symbol literals deprecated
- Symbols themselves remain supported, only the single-quote syntax is deprecated. (#7395)
- Library designers may wish to change their APIs to use
String
instead. - Deprecated:
'foo
- Use instead:
Symbol("foo")
- Unicode arrows deprecated
- In particular, the single arrow operators had the wrong precedence. (#7540)
- Deprecated:
⇒
,→
,←
- Use instead:
=>
,->
,<-
postfixOps
syntax disabled by default- The syntax, already deprecated in 2.12, causes an error in 2.13 unless the feature is explicitly enabled. (#6831)
- Error:
xs size
- Use instead:
xs.size
Adjustments:
- Imports, including wildcard imports, now shadow locally defined identifiers. (#6589)
- Don't assume unsound type for ident/literal patterns. (#6502)
- Matches of the form
case x@N
involve callingequals
, so it was unsound to typex
asN.type
. - Consider rewriting as
case x:N.type
.
- Matches of the form
- Make extractor patterns null safe. (#6485)
null
is treated as no match.
- Better typing for overloaded higher-order methods (#6871, #7631)
- This change was a key enabler for the new collections design.
- Rework unification of
Object
andAny
in Java/Scala interop (#7966) - Name-based pattern matching has changed to enable immutable
Seq
matches (#7068) - Automatic eta-expansion of zero-argument methods is no longer deprecated (#7660)
- Improve binary stability of extension methods (#7896)
- Macros must now have explicit return types (#6942)
- Mixin fields with trait setters are no longer JVM final (#7028)
- In addition,
object
fields are now static (#7270)
- In addition,
- Support
implicitNotFound
on parameters (#6340) - Disallow repeated parameters except in method signatures (#7399)
- Value-discard warnings can be suppressed via type ascription to
Unit
. (#7563) x op ()
now parses asx.op(())
notx.op()
(#7684)
Compiler
- Deterministic, reproducible compilation
- The compiler generates identical output for identical input in more cases, for reproducible builds. (scala-dev#405)
- Optimizer improvements
- Operations on collections and arrays are now optimized more, including improved inlining. (#7133)
And:
- Scaladoc supports setting canonical URLs (#7834)
- This helps search engines identify the most relevant/recent version of a page when several versions are available.
- Compiler suggests possible corrections for unrecognized identifiers (#6711)
- Example:
List(1).sizzle
=>value sizzle is not a member of List[Int], did you mean size?
- Example:
- Added
-Yimports
for custom preamble imports. (#6764)- Example:
-Yimports:x,y,z
means x, y, and z are root imports of the form:import x._ { import y._ { import z._ { ... } } }
- Example:
- The scala-compiler JAR no longer depends on scala-xml (#6436)
Plus, changes to compiler options:
- Partition options by function:
-V
for verbose,-W
for warnings- In general, the old flags still exist as aliases. (#7908)
- Exceptions (breaking changes) include:
- Replaced
-warn-option
with-Woption
. - Replaced
-Xprint:all
with-Vprint:_
- Replaced
-Werror
is now recommended over-Xfatal-warnings
.
- Promoted
-deprecation
to-Xlint:deprecation
(#7714) - Deprecated
-Xfuture
(#7328)- Instead, use e.g.
-Xsource:2.14
- Instead, use e.g.
- Removed
-Yno-adapted-args
- The removal remains under discussion at scala/bug#11110.
- Removed
-Xmax-classfile-length
- It's hard-coded to 240 now (#7497)
Scripting, enviroment, and integrations
- The script runner (
scala Script.scala
) no longer uses thefsc
compilation daemon by default. (#6747)- The daemon was not reliable and will likely be removed entirely from a future release.
- JEP 293 style long command-line options are now supported (#6499)
- The REPL has undergone an internal refactoring to enable future improvements. (#7384)
- Ant support is no longer bundled. (#6255)
Compiler performance
We invested heavily in compiler speedups during the 2.13 cycle, but most of that work actually already landed in the 2.12.x series, with more to come in 2.12.9.
In addition, compiler performance in 2.13 is 5-10% better compared to 2.12, thanks mainly to the new collections. See performance graph.
Also, certain kinds of code now compile much faster because the compiler aggressively prunes polymorphic implicits during search (#6580).
Compatibility
Like Scala 2.12, the 2.13 series targets Java 8, minimum. Both 2.12 and 2.13 also work on later JDKs such as JDK 11; see our JDK Compatibility Guide.
Although Scala 2.11, 2.12, and 2.13 are mostly source compatible to facilitate cross-building, they are not binary compatible. This allows us to keep improving the Scala compiler and standard library.
All 2.13.x releases will be fully binary compatible with 2.13.0, in according with the policy we have followed since 2.10.
The list of open-source libraries released for Scala 2.13 is growing quickly!
Projects built with sbt must use at least sbt 1.2.8 (or 0.13.18) to use Scala 2.13. To move to 2.13, bump the
scalaVersion
setting in your existing project. <!--, or start a new project using `sbt new scala/scala-seed.g8`.-->Scala also works with Maven, Gradle, and other build tools.
Obtaining Scala
Scala releases are available through a variety of channels, including (but not limited to):
- Bump the
scalaVersion
setting in your sbt-based project - Download a distribution from scala-lang.org
- Obtain JARs via Maven Central
- Certain package managers (such as homebrew and SDKMAN) offer Scala.
Reporting bugs
Please file any bugs you encounter on our issue tracker. If you aren't yet sure something is a bug, ask on users.scala-lang.org.
Contributors
A big thank you to everyone who's helped improve Scala by reporting bugs, improving our documentation, kindly helping others on forums and at meetups, and submitting and reviewing pull requests! You are all magnificent.
<!-- 1271 scala/scala, 236 scala/collection-strawman -->Scala 2.13.0 is the result of merging over 1500 pull requests.
The pull request queue is managed by the Scala team at Lightbend: Adriaan Moors, Lukas Rytz, Jason Zaugg, Seth Tisue, Stefan Zeiger, Eugene Yokota.
Thanks to Lightbend for their continued sponsorship of the Scala core team’s efforts. Lightbend offers commercial support for Scala.
<!-- The [contributions to 2.13.x](TODO link) over the last 2 years [were split](https://docs.google.com/spreadsheets/d/16zVViCpJEZn_x2RlYFh-xAOiHJG3SrYYpfetRr5cu_Y/edit#gid=912693440) TODO/TODO/TODO percent between the Scala team at Lightbend -->The new collections API was developed in fruitful collaboration with the Scala Center, with major contributions from the community.
This release was brought to you by 162 contributors, according to
git shortlog -sn --no-merges 2.13.x ^2.12.x ^e2a211c
. Thank you Julien Richard-Foy, Lukas Rytz, Jason Zaugg, A. P. Marki, Stefan Zeiger, Kenji Yoshida, Adriaan Moors, Josh Lemer, NthPortal, Miles Sabin, Diego E. Alonso-Blas, Seth Tisue, Guillaume Martres, Marcelo Cenerino, Dale Wijnand, Odd Möller, Martin Odersky, Allan Renucci, Georgi Krastev, Eugene Yokota, Harrison Houghton, Martijn Hoekstra, Viktor Klang, Aaron S. Hawley, Ólafur Páll Geirsson, Rex Kerr, hepin1989, Philippus Baalman, Matthew de Detrich, Isaac Levy, exoego, Greg Methvin, Jasper Moeys, Sébastien Doeraene, wholock, Aggelos Biboudis, yui-knk, Matthias Sperl, Xavier Fernández Salas, Ethan Pronovost, Janek Bogucki, awibisono, BuildTools, Mike Skells, Jimin Hsieh, Jonathan Frawley, Xavier GUIHOT, Chris Phelps, chanyong.moon, Cong Zhao, Enno Runne, LPTK, Pathikrit Bhowmick, Yuval Dagan, Li Haoyi, Guillaume Massé, Christopher Hunt, Kamil Kloch, Marco Zühlke, Danila Matveev, Juliusz Sompolski,杨博 (Yang Bo), Masaru Nomura, Benjamin Kurczyk, Vince, taku0, Arnout Engelen, Tim Ruhland, Nicolas Stucki, Nicolas Rinaudo, Stephen Nancekivell, ashwin, Kobenko Mikhail, Song Kun, Anthony Tjuatja, k.bigwheel, ke-to, kelebra, mcintdan, mmocentre, psilospore, roman, svatsan, texasbruce, tim-zh, valydia, veera venky,虎鸣, Adianto Wibisono, Alden Torres, Alejandro Sellero, Alessandro Buggin, Alex Glukhovtsev, Alex Levenson, Alexey-NM, Anatolii, Andrei Baidarov, Andriy Plokhotnyuk, Bakhytzhan Karabalin, Benni, Callum Turnbull, Chris Birchall, Chujie Zeng, Cody Allen, Daniel Dietrich, Daniel Moss, Daniel Slapman, David Barri, David Hoepelman, Denis Buzdalov, Denys Shabalin, Dhanesh, Dhanesh Arole, Edin Dudojević, Eugene Platonov, Faiz Halde, Gabriel Claramunt, Heikki Vesalainen, Iaroslav Zeigerman, Jack Koenig, Jean Michel Rouly, Jeff Brower, Jeff Shaw, Josh, Kazuhiro Sera, Kentaro Tokutomi, Lionel Parreaux, Magnolia.K, Martin Duhem, Michael Steindorfer, Nafer Sanabria, Narek Asadorian, Oleksii Tkachuk, Oscar Boykin, PJ Fanning, Paolo Giarrusso, Pap Lőrinc, Pavel Petlinsky, Peter Fraenkel, Philip, Piotr Kukielka, Qiang Sima, Rob Norris, Robin Stephenson, Rui Gonçalves, Ruud Welling, Ryan McDougall, ShankarShastri, Simão Martins, Sperl Matthias, Sujeet Kausallya Gholap, Uttej Guduru, Vincent de Haan, Vladimir Parfinenko, Vlastimil Dort, Yang Bo, Zizheng Tai, ccjoywang, esarbe, howtonotwin, jvican.Conclusion
We again thank our contributors and the entire Scala community.
May you find Scala 2.13 a joy to code in!