Preview · v0.1.0-preview.10 · Dart SDK 3.13.3
dartr
A Rust port of the Dart analyzer (Dart SDK 3.13.3) with analyze, format, fix and language-server.
$ brew install orestesgaolin/tap/dartr
Benchmarks
Measured on a single machine (Apple M5 Pro, 15 cores, 48 GB RAM) against Dart SDK 3.13.3. Files are analyzed in parallel on all cores. Dart caches results on disk (~/.dartServer); dartr does not yet.
dartr analyze
Wall time in seconds, lower is better. Measured while other builds ran (load average 5 to 11).
dart analyze, warm disk cachedart analyze, empty cachedartr analyze, cold (no cache)
packages/flutter1,309,663 lines · mean of 3 runsanalyzer 9.0.0 (pub)909,249 lines · mean of 3 runsflutter_tools455,099 lines · mean of 3 runs| project | Dart lines | dart, warm cache | dart, empty cache | dartr | peak RSS (dart / dartr) |
|---|---|---|---|---|---|
| Flutter application (pub workspace, analyzer plugins) | 1,559,637 | 62.7 s | 81.7 s | 22 s | 5,955 MB / 5,651 MB |
Flutter packages/flutter | 1,309,663 | 6 s | 19.8 s | 1.75 s | 915 MB / 1,497 MB |
analyzer 9.0.0 (pub) | 909,249 | 3.1 s | 8.7 s | 0.84 s | 490 MB / 790 MB |
flutter_tools | 455,099 | 1.6 s | 12.1 s | 0.87 s | 492 MB / 918 MB |
dartr language-server
Measured on the same machine (load average 5 to 7) with bench/lsp_bench.py. Memory is RSS after startup.
dart language-server, cold (empty cache)dart language-server, warm cachedartr language-server(no cache)
.median of 20 positions| project | server | startup cold / warm | hover | completion . / stmt | references repeat / first | memory |
|---|---|---|---|---|---|---|
flutter_tools | dart | 8.5 s / 1.6 s | 0.1 ms | 2.7 / 30 ms | 45 ms / 75 ms | 546 MB |
| dartr | 1.3–2.2 s | 0.0 ms | 1.1 / 24 ms | 17 ms / 181 ms | 962 MB | |
analyzer 9.0.0 | dart | 9.0 s / 4.7 s | 0.1 ms | 2.1 / 19 ms | 13 ms / 16 ms | 612 MB |
| dartr | 1.0–1.5 s | 0.0 ms | 0.7 / 14 ms | 2 ms / 34 ms | 910 MB | |
Flutter packages/flutter | dart | 20.9 s / 4.0 s | 0.1 ms | 2.7 / 45 ms | 170 ms / 2.9 s | 823 MB |
| dartr | 3.6–4.2 s | 0.1 ms | 1.5 / 32 ms | 58 ms / 1.2 s | 1,652 MB | |
| Flutter application | dart | 77 s / 87 s | 0.2 ms | 5.8 / 57 ms | 90 ms / 2.5 s | 6,773 MB |
| dartr | 26 s* | 0.1 ms | 2.3 / 43 ms | 13 ms / 2.0 s | 5,270 MB |
* 70 s on the first start after installing a new dartr version (the analyzer plugin is prepared once).
Method: hyperfine -i -N -w 1 -r 3 via bench/compare.sh, /usr/bin/time -l via bench/memory.sh, and bench/lsp_bench.py; see docs/BENCHMARKS.md for more charts and full results.
Parity
dartr analyze reports the same diagnostics as dart analyze (3.13.3) on Flutter (packages/flutter), flutter_tools, analyzer 9.0.0, a 1.56 million line Flutter application (with analyzer plugins) and 671 real packages from the pub cache and the Flutter SDK. dartr format matches dart format on the dart_style tests and 220 pub packages, dartr fix matches dart fix on 65 pub packages with 85 fixable lints enabled, and dartr language-server registers every capability of dart language-server (plus all 59 requests and 22 notifications of --protocol=analyzer).
Correctness is checked with differential tests against the Dart SDK 3.13.3 tools on the SDK test suite and package corpora; see the README.
Differences
- Memory: 1.5 to 2 times Dart's on packages, slightly lower on the full application (see the memory charts).
- No disk cache: dartr analyzes from source on every run, so a warm
dart language-servercan start faster on packages (1.6 s vs 1.3–2.2 s onflutter_tools, 4.0 s vs 3.6–4.2 s on Flutter). - Remaining gaps:
dartr fixdoes not includepubspec.yamlmissing_dependencyfixes yet.flutter analyzeand IntelliJ invoke<sdk>/bin/dart language-serverdirectly and have no setting for another binary. - Platforms and SDK requirement: macOS arm64 and Linux x86_64 only. Requires a Dart or Flutter SDK (3.13.3) on
PATHto read thedart:libraries.
Editor setup
- VS Code (Dart-Code): set
"dart.analyzerPath"to/opt/homebrew/opt/dartr/libexec/dartr_shim.dart(installed by Homebrew), then reload the window. - Neovim, Helix, Zed, Emacs, Sublime: run
dartr language-serveras the Dart language server. - Back to the Dart server: remove
"dart.analyzerPath"and reload the window. - Details: docs/editor-setup.md.