izumi-reflect
@quote: Looks a bit similar to TypeTag
izumi-reflect
is a fast, lightweight, portable and efficient alternative for TypeTag
from scala-reflect
.
izumi-reflect
is a lightweight model of Scala type system and provides a simulator of the important parts of the Scala typechecker.
Why izumi-reflect
izumi-reflect
compiles faster, runs a lot faster thanscala-reflect
and is fully immutable and thread-safe,izumi-reflect
supports Scala 2.11, 2.12, 2.13 and Scala 3,izumi-reflect
supports Scala.js and Scala Native,izumi-reflect
works well with GraalVM Native Image,izumi-reflect
allows you to obtain tags for unapplied type constructors (F[_]
) and combine them at runtime.
Limitations
izumi-reflect
model of the Scala type system is not 100% precise, but "good enough" for the vast majority of the usecases.
Known limitations are:
- Recursive type bounds (F-bounded types) are not preserved and may produce false positives,
- Existential types, both written with wildcards and
forSome
may produce unexpected results, the support is limited, - Path-Dependent Types are based on variable names and may cause unexpected results when variables with different names have the same type or vice-versa (vs. Scala compiler)
- This-Types such as
X.this.type
are ignored and identical toX
- At the moment Scala 3 port does not support Path-Dependent Types, and Structural Refinements. This will be fixed in the future.
izumi-reflect
is less powerful thanscala-reflect
: it does not preserve fields and methods when it's not necessary for equality and subtype checks, it does not preserve code trees, internal compiler data structures, etc.
Debugging
Set -Dizumi.reflect.debug.macro.rtti=true
to enable debug output during compilation when tags are constructed and at runtime when they are compared.
sbt -Dizumi.reflect.debug.macro.rtti=true
To see debug output when compiling in Intellij, add the above flag to VM options
in Preferences -> Build, Execution, Deployment -> Compiler -> Scala Compiler -> Scala Compile Server
You may also set it in .jvmopts
file during development. (.jvmopts
properties will not apply to Intellij compile server, only to sbt)
Set -Dizumi.reflect.debug.macro.rtti.assertions=true
to enable additional assertions.
Other useful system properties are:
Build
build.sbt
is generated by sbtgen. During development you may not want to mess with ScalaJS and ScalaNative, you may generate a pure-JVM Scala project:
./sbtgen.sc
Once you finished tinkering with the code you may want to generate full project and test it for all the platforms:
./sbtgen.sc --js --native
sbt +test
To develop using Scala 2 invoke sbtgen with a scala version argument:
./sbtgen.sc 2 // 2.13
./sbtgen.sc 2.12 // 2.12
Likewise with Scala 3:
./sbtgen.sc 3
In Intellij, you may also set Scala version by changing the option sbt -> sbt settings -> Open cross-compiled projects Scala 3 / Scala 2 projects as:
See also
gzoller/scala-reflection
- Scala 3 only
- No support for subtype checks
- Requires compiler plugin
- Type lambdas are not supported
- Preserves field information
airframe-surface
- Scala 2 and Scala 3
- No support for subtype checks
- Preserves field information