This project is implemented as a
Java compiler plugin
that generates one
SemanticDB file for
every *.java source file. After compilation completes, the SemanticDB files
are processed to produce SCIP.

Why Java compiler plugin?
There are several benefits to implementing scip-java as a compiler plugin:
- Simple installation: compiler plugins are enabled with the -Xplugin
compiler option. All Java build tools support a way to customize compiler
options, simplifying installation.
- Language fidelity: by using the Java compiler to produce semantic
information, we ensure that the produced SCIP data is accurate even as new
Java language versions with new language features are released.
- Environment fidelity: by hooking into the compilation process of the build
tool, we minimize the risk of diverging from the CI build environment such as
installed system dependencies, custom compiler options and custom annotation
processors.
SemanticDB is Protobuf schema for information about symbols and types in Java
programs, Scala programs and other languages. There are several benefits to
using SemanticDB as an intermediary representation for SCIP:
- Simplicity: It's easy to translate a single Java source file into a single
SemanticDB file inside a compiler plugin. It's more complicated to produce
SCIP because compiler plugins does not have access to a project-wide context,
which is necessary to produce accurate definitions and hovers in multi-module
projects with external library dependencies.
- Performance: SemanticDB is fast to write and read. Each compilation unit
can be processed independently to keep memory usage low. The final conversion
from SemanticDB to SCIP can be safely parallelized.
- Cross-language: SemanticDB has a
spec for Java and
Scala enabling cross-language navigation in hybrid Java/Scala codebases.
- Cross-repository: Compiler plugins have access to both source code and the
classpath (compiled bytecode of upstream dependencies). SemanticDB has been
designed so that it's also possible to generate spec-compliant symbols from
the classpath alone (no source code) and from the syntax tree of an individual
source file (no classpath). This flexibility allows the
Metals language server to index codebases
from a variety of different inputs, and will be helpful for scip-java in the
future to unblock cross-repository navigation.