Skip to content

Commit a35f7cb

Browse files
Merge #8382
8382: Make Fixture docs more accessible and fix small doc issues r=SomeoneToIgnore a=SomeoneToIgnore Follow up of #8302 (comment) Co-authored-by: Kirill Bulatov <mail4score@gmail.com>
2 parents fcb22a6 + e785672 commit a35f7cb

File tree

8 files changed

+88
-85
lines changed

8 files changed

+88
-85
lines changed

PRIVACY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ Any other editor plugins that integrate with `rust-analyzer` are not under the c
1414

1515
## Others
1616

17-
If `cargo check` is enabled (the default), any build scripts or procedural macros used by the project or its dependencies will be executed. This is also the case when `cargo check` is disabled, but build script or procedural macro support is enabled in `rust-analyzer` (off by default).
17+
If `cargo check` is enabled (the default), any build scripts or procedural macros used by the project or its dependencies will be executed. This is also the case when `cargo check` is disabled, but build script or procedural macro support is enabled in `rust-analyzer` (on by default).

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ For usage and troubleshooting requests, please use "IDEs and Editors" category o
3333

3434
https://users.rust-lang.org/c/ide/14
3535

36-
For questions about development and implementation, join rls-2.0 working group on Zulip:
36+
For questions about development and implementation, join rust-analyzer working group on Zulip:
3737

38-
https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Frls-2.2E0
38+
https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Frust-analyzer
3939

4040
## Quick Links
4141

crates/base_db/src/fixture.rs

Lines changed: 1 addition & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,4 @@
1-
//! Fixtures are strings containing rust source code with optional metadata.
2-
//! A fixture without metadata is parsed into a single source file.
3-
//! Use this to test functionality local to one file.
4-
//!
5-
//! Simple Example:
6-
//! ```
7-
//! r#"
8-
//! fn main() {
9-
//! println!("Hello World")
10-
//! }
11-
//! "#
12-
//! ```
13-
//!
14-
//! Metadata can be added to a fixture after a `//-` comment.
15-
//! The basic form is specifying filenames,
16-
//! which is also how to define multiple files in a single test fixture
17-
//!
18-
//! Example using two files in the same crate:
19-
//! ```
20-
//! "
21-
//! //- /main.rs
22-
//! mod foo;
23-
//! fn main() {
24-
//! foo::bar();
25-
//! }
26-
//!
27-
//! //- /foo.rs
28-
//! pub fn bar() {}
29-
//! "
30-
//! ```
31-
//!
32-
//! Example using two crates with one file each, with one crate depending on the other:
33-
//! ```
34-
//! r#"
35-
//! //- /main.rs crate:a deps:b
36-
//! fn main() {
37-
//! b::foo();
38-
//! }
39-
//! //- /lib.rs crate:b
40-
//! pub fn b() {
41-
//! println!("Hello World")
42-
//! }
43-
//! "#
44-
//! ```
45-
//!
46-
//! Metadata allows specifying all settings and variables
47-
//! that are available in a real rust project:
48-
//! - crate names via `crate:cratename`
49-
//! - dependencies via `deps:dep1,dep2`
50-
//! - configuration settings via `cfg:dbg=false,opt_level=2`
51-
//! - environment variables via `env:PATH=/bin,RUST_LOG=debug`
52-
//!
53-
//! Example using all available metadata:
54-
//! ```
55-
//! "
56-
//! //- /lib.rs crate:foo deps:bar,baz cfg:foo=a,bar=b env:OUTDIR=path/to,OTHER=foo
57-
//! fn insert_source_code_here() {}
58-
//! "
59-
//! ```
1+
//! A set of high-level utility fixture methods to use in tests.
602
use std::{mem, str::FromStr, sync::Arc};
613

624
use cfg::CfgOptions;

crates/test_utils/src/fixture.rs

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,65 @@
11
//! Defines `Fixture` -- a convenient way to describe the initial state of
22
//! rust-analyzer database from a single string.
3+
//!
4+
//! Fixtures are strings containing rust source code with optional metadata.
5+
//! A fixture without metadata is parsed into a single source file.
6+
//! Use this to test functionality local to one file.
7+
//!
8+
//! Simple Example:
9+
//! ```
10+
//! r#"
11+
//! fn main() {
12+
//! println!("Hello World")
13+
//! }
14+
//! "#
15+
//! ```
16+
//!
17+
//! Metadata can be added to a fixture after a `//-` comment.
18+
//! The basic form is specifying filenames,
19+
//! which is also how to define multiple files in a single test fixture
20+
//!
21+
//! Example using two files in the same crate:
22+
//! ```
23+
//! "
24+
//! //- /main.rs
25+
//! mod foo;
26+
//! fn main() {
27+
//! foo::bar();
28+
//! }
29+
//!
30+
//! //- /foo.rs
31+
//! pub fn bar() {}
32+
//! "
33+
//! ```
34+
//!
35+
//! Example using two crates with one file each, with one crate depending on the other:
36+
//! ```
37+
//! r#"
38+
//! //- /main.rs crate:a deps:b
39+
//! fn main() {
40+
//! b::foo();
41+
//! }
42+
//! //- /lib.rs crate:b
43+
//! pub fn b() {
44+
//! println!("Hello World")
45+
//! }
46+
//! "#
47+
//! ```
48+
//!
49+
//! Metadata allows specifying all settings and variables
50+
//! that are available in a real rust project:
51+
//! - crate names via `crate:cratename`
52+
//! - dependencies via `deps:dep1,dep2`
53+
//! - configuration settings via `cfg:dbg=false,opt_level=2`
54+
//! - environment variables via `env:PATH=/bin,RUST_LOG=debug`
55+
//!
56+
//! Example using all available metadata:
57+
//! ```
58+
//! "
59+
//! //- /lib.rs crate:foo deps:bar,baz cfg:foo=a,bar=b env:OUTDIR=path/to,OTHER=foo
60+
//! fn insert_source_code_here() {}
61+
//! "
62+
//! ```
363
464
use rustc_hash::FxHashMap;
565
use stdx::{lines_with_ends, split_once, trim_indent};
@@ -24,7 +84,7 @@ impl Fixture {
2484
/// //- some meta
2585
/// line 1
2686
/// line 2
27-
/// // - other meta
87+
/// //- other meta
2888
/// ```
2989
pub fn parse(ra_fixture: &str) -> Vec<Fixture> {
3090
let fixture = trim_indent(ra_fixture);

docs/dev/architecture.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ The underlying engine makes sure that model is computed lazily (on-demand) and c
4242
## Entry Points
4343

4444
`crates/rust-analyzer/src/bin/main.rs` contains the main function which spawns LSP.
45-
This is *the* entry point, but it front-loads a lot of complexity, so its fine to just skim through it.
45+
This is *the* entry point, but it front-loads a lot of complexity, so it's fine to just skim through it.
4646

4747
`crates/rust-analyzer/src/handlers.rs` implements all LSP requests and is a great place to start if you are already familiar with LSP.
4848

@@ -67,7 +67,7 @@ They are handled by Rust code in the xtask directory.
6767

6868
VS Code plugin.
6969

70-
### `libs/`
70+
### `lib/`
7171

7272
rust-analyzer independent libraries which we publish to crates.io.
7373
It's not heavily utilized at the moment.
@@ -139,7 +139,8 @@ If an AST method returns an `Option`, it *can* be `None` at runtime, even if thi
139139
### `crates/base_db`
140140

141141
We use the [salsa](https://github.com/salsa-rs/salsa) crate for incremental and on-demand computation.
142-
Roughly, you can think of salsa as a key-value store, but it can also compute derived values using specified functions. The `base_db` crate provides basic infrastructure for interacting with salsa.
142+
Roughly, you can think of salsa as a key-value store, but it can also compute derived values using specified functions.
143+
The `base_db` crate provides basic infrastructure for interacting with salsa.
143144
Crucially, it defines most of the "input" queries: facts supplied by the client of the analyzer.
144145
Reading the docs of the `base_db::input` module should be useful: everything else is strictly derived from those inputs.
145146

@@ -221,7 +222,7 @@ Internally, `ide` is split across several crates. `ide_assists`, `ide_completion
221222
The `ide` contains a public API/façade, as well as implementation for a plethora of smaller features.
222223

223224
**Architecture Invariant:** `ide` crate strives to provide a _perfect_ API.
224-
Although at the moment it has only one consumer, the LSP server, LSP *does not* influence it's API design.
225+
Although at the moment it has only one consumer, the LSP server, LSP *does not* influence its API design.
225226
Instead, we keep in mind a hypothetical _ideal_ client -- an IDE tailored specifically for rust, every nook and cranny of which is packed with Rust-specific goodies.
226227

227228
### `crates/rust-analyzer`
@@ -307,7 +308,7 @@ This sections talks about the things which are everywhere and nowhere in particu
307308

308309
### Code generation
309310

310-
Some of the components of this repository are generated through automatic processes.
311+
Some ]components in this repository are generated through automatic processes.
311312
Generated code is updated automatically on `cargo test`.
312313
Generated code is generally committed to the git repository.
313314

@@ -389,7 +390,7 @@ fn spam() {
389390
```
390391

391392
To specify input data, we use a single string literal in a special format, which can describe a set of rust files.
392-
See the `Fixture` type.
393+
See the `Fixture` its module for fixture examples and documentation.
393394

394395
**Architecture Invariant:** all code invariants are tested by `#[test]` tests.
395396
There's no additional checks in CI, formatting and tidy tests are run with `cargo test`.

docs/dev/lsp-extensions.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ interface SnippetTextEdit extends TextEdit {
5151

5252
```typescript
5353
export interface TextDocumentEdit {
54-
textDocument: OptionalVersionedTextDocumentIdentifier;
55-
edits: (TextEdit | SnippetTextEdit)[];
54+
textDocument: OptionalVersionedTextDocumentIdentifier;
55+
edits: (TextEdit | SnippetTextEdit)[];
5656
}
5757
```
5858

@@ -145,9 +145,9 @@ mod foo;
145145
### Unresolved Question
146146

147147
* An alternative would be to use a more general "gotoSuper" request, which would work for super methods, super classes and super modules.
148-
This is the approach IntelliJ Rust is takeing.
148+
This is the approach IntelliJ Rust is taking.
149149
However, experience shows that super module (which generally has a feeling of navigation between files) should be separate.
150-
If you want super module, but the cursor happens to be inside an overriden function, the behavior with single "gotoSuper" request is surprising.
150+
If you want super module, but the cursor happens to be inside an overridden function, the behavior with single "gotoSuper" request is surprising.
151151

152152
## Join Lines
153153

@@ -193,7 +193,7 @@ fn main() {
193193
### Unresolved Question
194194

195195
* What is the position of the cursor after `joinLines`?
196-
Currently this is left to editor's discretion, but it might be useful to specify on the server via snippets.
196+
Currently, this is left to editor's discretion, but it might be useful to specify on the server via snippets.
197197
However, it then becomes unclear how it works with multi cursor.
198198

199199
## On Enter
@@ -330,7 +330,7 @@ Moreover, it would be cool if editors didn't need to implement even basic langua
330330

331331
### Unresolved Question
332332

333-
* Should we return a a nested brace structure, to allow paredit-like actions of jump *out* of the current brace pair?
333+
* Should we return a nested brace structure, to allow paredit-like actions of jump *out* of the current brace pair?
334334
This is how `SelectionRange` request works.
335335
* Alternatively, should we perhaps flag certain `SelectionRange`s as being brace pairs?
336336

@@ -511,7 +511,7 @@ Expands macro call at a given position.
511511
This request is sent from client to server to render "inlay hints" -- virtual text inserted into editor to show things like inferred types.
512512
Generally, the client should re-query inlay hints after every modification.
513513
Note that we plan to move this request to `experimental/inlayHints`, as it is not really Rust-specific, but the current API is not necessary the right one.
514-
Upstream issue: https://github.com/microsoft/language-server-protocol/issues/956
514+
Upstream issues: https://github.com/microsoft/language-server-protocol/issues/956 , https://github.com/rust-analyzer/rust-analyzer/issues/2797
515515

516516
**Request:**
517517

docs/dev/style.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ https://www.tedinski.com/2018/02/06/system-boundaries.html
5353
## Crates.io Dependencies
5454

5555
We try to be very conservative with usage of crates.io dependencies.
56-
Don't use small "helper" crates (exception: `itertools` is allowed).
56+
Don't use small "helper" crates (exception: `itertools` and `either` are allowed).
5757
If there's some general reusable bit of code you need, consider adding it to the `stdx` crate.
58-
A useful exercise is to read Cargo.lock and see if some of the *transitive* dependencies do not make sense for rust-analyzer.
58+
A useful exercise is to read Cargo.lock and see if some *transitive* dependencies do not make sense for rust-analyzer.
5959

6060
**Rationale:** keep compile times low, create ecosystem pressure for faster compiles, reduce the number of things which might break.
6161

@@ -330,7 +330,7 @@ When implementing `do_thing`, it might be very useful to create a context object
330330

331331
```rust
332332
pub fn do_thing(arg1: Arg1, arg2: Arg2) -> Res {
333-
let mut ctx = Ctx { arg1, arg2 }
333+
let mut ctx = Ctx { arg1, arg2 };
334334
ctx.run()
335335
}
336336

@@ -586,7 +586,7 @@ use super::{}
586586

587587
**Rationale:** consistency.
588588
Reading order is important for new contributors.
589-
Grouping by crate allows to spot unwanted dependencies easier.
589+
Grouping by crate allows spotting unwanted dependencies easier.
590590

591591
## Import Style
592592

@@ -779,7 +779,7 @@ assert!(x < y);
779779
assert!(x > 0);
780780

781781
// BAD
782-
assert!(x >= lo && x <= hi>);
782+
assert!(x >= lo && x <= hi);
783783
assert!(r1 < l2 || l1 > r2);
784784
assert!(y > x);
785785
assert!(0 > x);

docs/dev/syntax.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ Another alternative (used by swift and roslyn) is to explicitly divide the set o
145145

146146
```rust
147147
struct Token {
148-
kind: NonTriviaTokenKind
148+
kind: NonTriviaTokenKind,
149149
text: String,
150150
leading_trivia: Vec<TriviaToken>,
151151
trailing_trivia: Vec<TriviaToken>,
@@ -240,7 +240,7 @@ impl SyntaxNode {
240240
let child_offset = offset;
241241
offset += green_child.text_len;
242242
Arc::new(SyntaxData {
243-
offset: child_offset;
243+
offset: child_offset,
244244
parent: Some(Arc::clone(self)),
245245
green: Arc::clone(green_child),
246246
})
@@ -249,7 +249,7 @@ impl SyntaxNode {
249249
}
250250

251251
impl PartialEq for SyntaxNode {
252-
fn eq(&self, other: &SyntaxNode) {
252+
fn eq(&self, other: &SyntaxNode) -> bool {
253253
self.offset == other.offset
254254
&& Arc::ptr_eq(&self.green, &other.green)
255255
}
@@ -273,7 +273,7 @@ This is OK because trees traversals mostly (always, in case of rust-analyzer) ru
273273
The other thread can restore the `SyntaxNode` by traversing from the root green node and looking for a node with specified range.
274274
You can also use the similar trick to store a `SyntaxNode`.
275275
That is, a data structure that holds a `(GreenNode, Range<usize>)` will be `Sync`.
276-
However rust-analyzer goes even further.
276+
However, rust-analyzer goes even further.
277277
It treats trees as semi-transient and instead of storing a `GreenNode`, it generally stores just the id of the file from which the tree originated: `(FileId, Range<usize>)`.
278278
The `SyntaxNode` is the restored by reparsing the file and traversing it from root.
279279
With this trick, rust-analyzer holds only a small amount of trees in memory at the same time, which reduces memory usage.

0 commit comments

Comments
 (0)