From 996dd4f620a0550c2ebf8834d3e333ed6dfb5468 Mon Sep 17 00:00:00 2001 From: Bas Zalmstra Date: Sat, 12 Sep 2020 13:29:09 +0200 Subject: [PATCH] misc: split database and added docs --- book/src/SUMMARY.md | 3 + book/src/ch04-00-developer-docs.md | 7 ++ book/src/ch04-01-salsa-super-traits.png | Bin 0 -> 190397 bytes book/src/ch04-01-salsa.md | 102 ++++++++++++++++++ crates/mun_codegen/src/mock.rs | 8 ++ crates/mun_compiler/src/db.rs | 8 ++ crates/mun_compiler/src/driver.rs | 4 +- crates/mun_hir/src/db.rs | 48 +++++---- crates/mun_hir/src/expr/validator/tests.rs | 9 +- crates/mun_hir/src/in_file.rs | 4 +- crates/mun_hir/src/lib.rs | 3 +- crates/mun_hir/src/mock.rs | 10 +- crates/mun_hir/src/source_id.rs | 29 +++-- crates/mun_hir/src/ty/tests.rs | 13 +-- crates/mun_language_server/src/db.rs | 16 ++- crates/mun_language_server/src/diagnostics.rs | 2 +- 16 files changed, 209 insertions(+), 57 deletions(-) create mode 100644 book/src/ch04-00-developer-docs.md create mode 100644 book/src/ch04-01-salsa-super-traits.png create mode 100644 book/src/ch04-01-salsa.md diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md index 25c354751..46b30dfef 100644 --- a/book/src/SUMMARY.md +++ b/book/src/SUMMARY.md @@ -19,3 +19,6 @@ - [Struct Memory Kind](ch03-02-struct-memory-kind.md) - [Marshalling](ch03-03-marshalling.md) - [Hot Reloading Structs](ch03-04-hot-reloading-structs.md) + +- [Developer Documentation](ch04-00-developer-docs.md) + - [Salsa](ch04-01-salsa.md) diff --git a/book/src/ch04-00-developer-docs.md b/book/src/ch04-00-developer-docs.md new file mode 100644 index 000000000..007093aef --- /dev/null +++ b/book/src/ch04-00-developer-docs.md @@ -0,0 +1,7 @@ +# Developer documentation + +These chapters provide some insight in the design of the Mun compiler and +language server. + +* [Salsa](ch04-01-salsa.md) provides some information about Salsa and how we use +it. diff --git a/book/src/ch04-01-salsa-super-traits.png b/book/src/ch04-01-salsa-super-traits.png new file mode 100644 index 0000000000000000000000000000000000000000..a891830972d9f95898d116e558d25081dd64982a GIT binary patch literal 190397 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