diff options
-rw-r--r-- | Cargo.lock | 4 | ||||
-rw-r--r-- | crates/ra_ide/src/snapshots/highlight_strings.html | 2 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/tokens.rs | 37 | ||||
-rw-r--r-- | docs/dev/README.md | 48 | ||||
-rw-r--r-- | editors/code/package.json | 5 | ||||
-rw-r--r-- | editors/code/src/run.ts | 2 |
6 files changed, 76 insertions, 22 deletions
diff --git a/Cargo.lock b/Cargo.lock index 2e86b3fee..df79334c9 100644 --- a/Cargo.lock +++ b/Cargo.lock | |||
@@ -884,9 +884,9 @@ dependencies = [ | |||
884 | 884 | ||
885 | [[package]] | 885 | [[package]] |
886 | name = "quote" | 886 | name = "quote" |
887 | version = "1.0.6" | 887 | version = "1.0.7" |
888 | source = "registry+https://github.com/rust-lang/crates.io-index" | 888 | source = "registry+https://github.com/rust-lang/crates.io-index" |
889 | checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" | 889 | checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" |
890 | dependencies = [ | 890 | dependencies = [ |
891 | "proc-macro2", | 891 | "proc-macro2", |
892 | ] | 892 | ] |
diff --git a/crates/ra_ide/src/snapshots/highlight_strings.html b/crates/ra_ide/src/snapshots/highlight_strings.html index e97192b61..6a5cf0e74 100644 --- a/crates/ra_ide/src/snapshots/highlight_strings.html +++ b/crates/ra_ide/src/snapshots/highlight_strings.html | |||
@@ -63,7 +63,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
63 | <span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">^</span><span class="numeric_literal">5</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="string_literal">"x"</span>); | 63 | <span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">^</span><span class="numeric_literal">5</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="string_literal">"x"</span>); |
64 | <span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">></span><span class="numeric_literal">5</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="string_literal">"x"</span>); | 64 | <span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">></span><span class="numeric_literal">5</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="string_literal">"x"</span>); |
65 | <span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">+</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="numeric_literal">5</span>); | 65 | <span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">+</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="numeric_literal">5</span>); |
66 | <span class="macro">println!</span>(<span class="string_literal">"</span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">#</span><span class="variable">x</span><span class="string_literal">}!"</span>, <span class="numeric_literal">27</span>); | 66 | <span class="macro">println!</span>(<span class="string_literal">"</span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">#</span><span class="variable">x</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="numeric_literal">27</span>); |
67 | <span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="numeric_literal">0</span><span class="numeric_literal">5</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="numeric_literal">5</span>); | 67 | <span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="numeric_literal">0</span><span class="numeric_literal">5</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="numeric_literal">5</span>); |
68 | <span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="numeric_literal">0</span><span class="numeric_literal">5</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, -<span class="numeric_literal">5</span>); | 68 | <span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="numeric_literal">0</span><span class="numeric_literal">5</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, -<span class="numeric_literal">5</span>); |
69 | <span class="macro">println!</span>(<span class="string_literal">"</span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">#</span><span class="numeric_literal">0</span><span class="numeric_literal">10</span><span class="variable">x</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="numeric_literal">27</span>); | 69 | <span class="macro">println!</span>(<span class="string_literal">"</span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">#</span><span class="numeric_literal">0</span><span class="numeric_literal">10</span><span class="variable">x</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="numeric_literal">27</span>); |
diff --git a/crates/ra_syntax/src/ast/tokens.rs b/crates/ra_syntax/src/ast/tokens.rs index 04b0a4480..56378385a 100644 --- a/crates/ra_syntax/src/ast/tokens.rs +++ b/crates/ra_syntax/src/ast/tokens.rs | |||
@@ -335,16 +335,26 @@ pub trait HasFormatSpecifier: AstToken { | |||
335 | } | 335 | } |
336 | c if c == '_' || c.is_alphabetic() => { | 336 | c if c == '_' || c.is_alphabetic() => { |
337 | read_identifier(&mut chars, &mut callback); | 337 | read_identifier(&mut chars, &mut callback); |
338 | if chars.peek().and_then(|next| next.1.as_ref().ok()).copied() | 338 | // can be either width (indicated by dollar sign, or type in which case |
339 | != Some('$') | 339 | // the next sign has to be `}`) |
340 | { | 340 | let next = |
341 | continue; | 341 | chars.peek().and_then(|next| next.1.as_ref().ok()).copied(); |
342 | } | 342 | match next { |
343 | skip_char_and_emit( | 343 | Some('$') => skip_char_and_emit( |
344 | &mut chars, | 344 | &mut chars, |
345 | FormatSpecifier::DollarSign, | 345 | FormatSpecifier::DollarSign, |
346 | &mut callback, | 346 | &mut callback, |
347 | ); | 347 | ), |
348 | Some('}') => { | ||
349 | skip_char_and_emit( | ||
350 | &mut chars, | ||
351 | FormatSpecifier::Close, | ||
352 | &mut callback, | ||
353 | ); | ||
354 | continue; | ||
355 | } | ||
356 | _ => continue, | ||
357 | }; | ||
348 | } | 358 | } |
349 | _ => {} | 359 | _ => {} |
350 | } | 360 | } |
@@ -416,12 +426,11 @@ pub trait HasFormatSpecifier: AstToken { | |||
416 | } | 426 | } |
417 | } | 427 | } |
418 | 428 | ||
419 | let mut cloned = chars.clone().take(2); | 429 | if let Some((_, Ok('}'))) = chars.peek() { |
420 | let first = cloned.next().and_then(|next| next.1.as_ref().ok()).copied(); | 430 | skip_char_and_emit(&mut chars, FormatSpecifier::Close, &mut callback); |
421 | if first != Some('}') { | 431 | } else { |
422 | continue; | 432 | continue; |
423 | } | 433 | } |
424 | skip_char_and_emit(&mut chars, FormatSpecifier::Close, &mut callback); | ||
425 | } | 434 | } |
426 | _ => { | 435 | _ => { |
427 | while let Some((_, Ok(next_char))) = chars.peek() { | 436 | while let Some((_, Ok(next_char))) = chars.peek() { |
diff --git a/docs/dev/README.md b/docs/dev/README.md index 194a40e15..903cb4055 100644 --- a/docs/dev/README.md +++ b/docs/dev/README.md | |||
@@ -184,6 +184,27 @@ use crate::{} | |||
184 | use super::{} // but prefer `use crate::` | 184 | use super::{} // but prefer `use crate::` |
185 | ``` | 185 | ``` |
186 | 186 | ||
187 | ## Import Style | ||
188 | |||
189 | Items from `hir` and `ast` should be used qualified: | ||
190 | |||
191 | ```rust | ||
192 | // Good | ||
193 | use ra_syntax::ast; | ||
194 | |||
195 | fn frobnicate(func: hir::Function, strukt: ast::StructDef) {} | ||
196 | |||
197 | // Not as good | ||
198 | use hir::Function; | ||
199 | use ra_syntax::ast::StructDef; | ||
200 | |||
201 | fn frobnicate(func: Function, strukt: StructDef) {} | ||
202 | ``` | ||
203 | |||
204 | Avoid local `use MyEnum::*` imports. | ||
205 | |||
206 | Prefer `use crate::foo::bar` to `use super::bar`. | ||
207 | |||
187 | ## Order of Items | 208 | ## Order of Items |
188 | 209 | ||
189 | Optimize for the reader who sees the file for the first time, and wants to get the general idea about what's going on. | 210 | Optimize for the reader who sees the file for the first time, and wants to get the general idea about what's going on. |
@@ -220,6 +241,33 @@ struct Foo { | |||
220 | For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines. | 241 | For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines. |
221 | If the line is too long, you want to split the sentence in two :-) | 242 | If the line is too long, you want to split the sentence in two :-) |
222 | 243 | ||
244 | # Architecture Invariants | ||
245 | |||
246 | This section tries to document high-level design constraints, which are not | ||
247 | always obvious from the low-level code. | ||
248 | |||
249 | ## Incomplete syntax trees | ||
250 | |||
251 | Syntax trees are by design incomplete and do not enforce well-formedness. | ||
252 | If ast method returns an `Option`, it *can* be `None` at runtime, even if this is forbidden by the grammar. | ||
253 | |||
254 | ## LSP indenpendence | ||
255 | |||
256 | rust-analyzer is independent from LSP. | ||
257 | It provides features for a hypothetical perfect Rust-specific IDE client. | ||
258 | Internal representations are lowered to LSP in the `rust-analyzer` crate (the only crate which is allowed to use LSP types). | ||
259 | |||
260 | ## IDE/Compiler split | ||
261 | |||
262 | There's a semi-hard split between "compiler" and "IDE", at the `ra_hir` crate. | ||
263 | Compiler derives new facts about source code. | ||
264 | It explicitly acknowledges that not all info is available (ie, you can't look at types during name resolution). | ||
265 | |||
266 | IDE assumes that all information is available at all times. | ||
267 | |||
268 | IDE should use only types from `ra_hir`, and should not depend on the underling compiler types. | ||
269 | `ra_hir` is a facade. | ||
270 | |||
223 | # Logging | 271 | # Logging |
224 | 272 | ||
225 | Logging is done by both rust-analyzer and VS Code, so it might be tricky to | 273 | Logging is done by both rust-analyzer and VS Code, so it might be tricky to |
diff --git a/editors/code/package.json b/editors/code/package.json index b9c57db3b..859ab4477 100644 --- a/editors/code/package.json +++ b/editors/code/package.json | |||
@@ -487,10 +487,7 @@ | |||
487 | "default": true | 487 | "default": true |
488 | }, | 488 | }, |
489 | "rust-analyzer.linkedProjects": { | 489 | "rust-analyzer.linkedProjects": { |
490 | "markdownDescription": [ | 490 | "markdownDescription": "Disable project auto-discovery in favor of explicitly specified set of projects. \nElements must be paths pointing to Cargo.toml, rust-project.json, or JSON objects in rust-project.json format", |
491 | "Disable project auto-discovery in favor of explicitly specified set of projects.", | ||
492 | "Elements must be paths pointing to Cargo.toml, rust-project.json, or JSON objects in rust-project.json format" | ||
493 | ], | ||
494 | "type": "array", | 491 | "type": "array", |
495 | "items": { | 492 | "items": { |
496 | "type": [ | 493 | "type": [ |
diff --git a/editors/code/src/run.ts b/editors/code/src/run.ts index 5c790741f..bb060cfe1 100644 --- a/editors/code/src/run.ts +++ b/editors/code/src/run.ts | |||
@@ -110,7 +110,7 @@ export function createTask(runnable: ra.Runnable): vscode.Task { | |||
110 | switch (runnable.kind) { | 110 | switch (runnable.kind) { |
111 | case "cargo": command = toolchain.getPathForExecutable("cargo"); | 111 | case "cargo": command = toolchain.getPathForExecutable("cargo"); |
112 | } | 112 | } |
113 | const args = runnable.args.cargoArgs; | 113 | const args = [...runnable.args.cargoArgs]; // should be a copy! |
114 | if (runnable.args.executableArgs.length > 0) { | 114 | if (runnable.args.executableArgs.length > 0) { |
115 | args.push('--', ...runnable.args.executableArgs); | 115 | args.push('--', ...runnable.args.executableArgs); |
116 | } | 116 | } |