We are excited to announce the release of Metals v0.4, codename "Tin" 🎉 Metals
is a language server for Scala that works with VS Code, Atom, Vim, Sublime Text
and Emacs. Metals is developed at the Scala Center
with contributors from the community.

The latest Metals release introduces three new in-memory indexes to implement
the features "find symbol references" and "fuzzy symbol search". Indexes are
important to provide fast response times for user requests but they come at the
price of higher memory usage. To keep memory usage low, Metals uses a data
structure called bloom filters that implements space-efficient sets. Thanks to
bloom filters, the three new indexes added in the last release use only a few
megabytes of memory even for large projects with >500k lines of code.

In this post, we look into how Metals uses bloom filters for fast indexing with
small memory footprint. We explain what bloom filters are and how we can encode
problems like fuzzy searching to take advantage of the nice properties of bloom
filters. Finally, we evaluate these new features on a real-world project: the
Akka build.

We are pleased to announce the release of Metals v0.3.2. Metals is a language
server for Scala that works with VS Code, Atom, Vim, Sublime Text and Emacs.
Metals is developed at the Scala Center with
contributors from the community.

Metals throws away its navigation index when it shuts down. Next time it starts,
the index is computed again from scratch. Although this approach is simple, it
requires indexing to be fast enough so you don't mind running it again and
again. Also, because we don't persist the index to disk, we need to be careful
with memory usage.

This post covers how Metals achieves fast source indexing for Scala with a small
memory footprint. We describe the problem statement, explain the initial
solution and how an optimization delivered a 10x speedup. Finally, we evaluate
the result on a real-world project.