diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/completion/src/render.rs | 3 | ||||
-rw-r--r-- | crates/hir_expand/src/builtin_macro.rs | 24 | ||||
-rw-r--r-- | crates/ide/src/display/navigation_target.rs | 1 | ||||
-rw-r--r-- | crates/ide_db/src/symbol_index.rs | 14 | ||||
-rw-r--r-- | crates/parser/src/grammar/items/consts.rs | 2 | ||||
-rw-r--r-- | crates/profile/Cargo.toml | 2 | ||||
-rw-r--r-- | crates/syntax/Cargo.toml | 2 | ||||
-rw-r--r-- | crates/syntax/src/validation.rs | 16 | ||||
-rw-r--r-- | crates/syntax/test_data/parser/err/0047_mutable_const_item.rast | 22 | ||||
-rw-r--r-- | crates/syntax/test_data/parser/err/0047_mutable_const_item.rs | 1 | ||||
-rw-r--r-- | crates/syntax/test_data/parser/ok/0024_const_item.rast | 23 | ||||
-rw-r--r-- | crates/syntax/test_data/parser/ok/0024_const_item.rs | 1 |
12 files changed, 61 insertions, 50 deletions
diff --git a/crates/completion/src/render.rs b/crates/completion/src/render.rs index 6eb20df2b..e11b881ca 100644 --- a/crates/completion/src/render.rs +++ b/crates/completion/src/render.rs | |||
@@ -201,8 +201,7 @@ impl<'a> Render<'a> { | |||
201 | ScopeDef::ModuleDef(Module(..)) => CompletionItemKind::SymbolKind(SymbolKind::Module), | 201 | ScopeDef::ModuleDef(Module(..)) => CompletionItemKind::SymbolKind(SymbolKind::Module), |
202 | ScopeDef::ModuleDef(Adt(adt)) => CompletionItemKind::SymbolKind(match adt { | 202 | ScopeDef::ModuleDef(Adt(adt)) => CompletionItemKind::SymbolKind(match adt { |
203 | hir::Adt::Struct(_) => SymbolKind::Struct, | 203 | hir::Adt::Struct(_) => SymbolKind::Struct, |
204 | // FIXME: add CompletionItemKind::Union | 204 | hir::Adt::Union(_) => SymbolKind::Union, |
205 | hir::Adt::Union(_) => SymbolKind::Struct, | ||
206 | hir::Adt::Enum(_) => SymbolKind::Enum, | 205 | hir::Adt::Enum(_) => SymbolKind::Enum, |
207 | }), | 206 | }), |
208 | ScopeDef::ModuleDef(Const(..)) => CompletionItemKind::SymbolKind(SymbolKind::Const), | 207 | ScopeDef::ModuleDef(Const(..)) => CompletionItemKind::SymbolKind(SymbolKind::Const), |
diff --git a/crates/hir_expand/src/builtin_macro.rs b/crates/hir_expand/src/builtin_macro.rs index 80b60d59f..2806842cd 100644 --- a/crates/hir_expand/src/builtin_macro.rs +++ b/crates/hir_expand/src/builtin_macro.rs | |||
@@ -327,17 +327,12 @@ fn concat_expand( | |||
327 | // concat works with string and char literals, so remove any quotes. | 327 | // concat works with string and char literals, so remove any quotes. |
328 | // It also works with integer, float and boolean literals, so just use the rest | 328 | // It also works with integer, float and boolean literals, so just use the rest |
329 | // as-is. | 329 | // as-is. |
330 | 330 | let component = unquote_str(&it).unwrap_or_else(|| it.text.to_string()); | |
331 | text += it | 331 | text.push_str(&component); |
332 | .text | 332 | } |
333 | .trim_start_matches(|c| match c { | 333 | // handle boolean literals |
334 | 'r' | '#' | '\'' | '"' => true, | 334 | tt::TokenTree::Leaf(tt::Leaf::Ident(id)) if i % 2 == 0 => { |
335 | _ => false, | 335 | text.push_str(id.text.as_str()); |
336 | }) | ||
337 | .trim_end_matches(|c| match c { | ||
338 | '#' | '\'' | '"' => true, | ||
339 | _ => false, | ||
340 | }); | ||
341 | } | 336 | } |
342 | tt::TokenTree::Leaf(tt::Leaf::Punct(punct)) if i % 2 == 1 && punct.char == ',' => (), | 337 | tt::TokenTree::Leaf(tt::Leaf::Punct(punct)) if i % 2 == 1 && punct.char == ',' => (), |
343 | _ => { | 338 | _ => { |
@@ -345,7 +340,6 @@ fn concat_expand( | |||
345 | } | 340 | } |
346 | } | 341 | } |
347 | } | 342 | } |
348 | |||
349 | ExpandResult { value: Some((quote!(#text), FragmentKind::Expr)), err } | 343 | ExpandResult { value: Some((quote!(#text), FragmentKind::Expr)), err } |
350 | } | 344 | } |
351 | 345 | ||
@@ -745,12 +739,10 @@ mod tests { | |||
745 | r##" | 739 | r##" |
746 | #[rustc_builtin_macro] | 740 | #[rustc_builtin_macro] |
747 | macro_rules! concat {} | 741 | macro_rules! concat {} |
748 | concat!("foo", 0, r#"bar"#); | 742 | concat!("foo", r, 0, r#"bar"#, false); |
749 | "##, | 743 | "##, |
750 | ); | 744 | ); |
751 | 745 | ||
752 | assert_eq!(expanded, r#""foo0bar""#); | 746 | assert_eq!(expanded, r#""foor0barfalse""#); |
753 | |||
754 | // FIXME: `true`/`false` literals don't work. | ||
755 | } | 747 | } |
756 | } | 748 | } |
diff --git a/crates/ide/src/display/navigation_target.rs b/crates/ide/src/display/navigation_target.rs index 16fa828ad..f178dd744 100644 --- a/crates/ide/src/display/navigation_target.rs +++ b/crates/ide/src/display/navigation_target.rs | |||
@@ -173,6 +173,7 @@ impl ToNav for FileSymbol { | |||
173 | FileSymbolKind::Const => SymbolKind::Const, | 173 | FileSymbolKind::Const => SymbolKind::Const, |
174 | FileSymbolKind::Static => SymbolKind::Static, | 174 | FileSymbolKind::Static => SymbolKind::Static, |
175 | FileSymbolKind::Macro => SymbolKind::Macro, | 175 | FileSymbolKind::Macro => SymbolKind::Macro, |
176 | FileSymbolKind::Union => SymbolKind::Union, | ||
176 | }), | 177 | }), |
177 | full_range: self.range, | 178 | full_range: self.range, |
178 | focus_range: self.name_range, | 179 | focus_range: self.name_range, |
diff --git a/crates/ide_db/src/symbol_index.rs b/crates/ide_db/src/symbol_index.rs index e954bd72e..9ed9568ce 100644 --- a/crates/ide_db/src/symbol_index.rs +++ b/crates/ide_db/src/symbol_index.rs | |||
@@ -356,15 +356,16 @@ pub struct FileSymbol { | |||
356 | 356 | ||
357 | #[derive(PartialEq, Eq, Hash, Clone, Copy, Debug)] | 357 | #[derive(PartialEq, Eq, Hash, Clone, Copy, Debug)] |
358 | pub enum FileSymbolKind { | 358 | pub enum FileSymbolKind { |
359 | Const, | ||
360 | Enum, | ||
359 | Function, | 361 | Function, |
362 | Macro, | ||
363 | Module, | ||
364 | Static, | ||
360 | Struct, | 365 | Struct, |
361 | Enum, | ||
362 | Trait, | 366 | Trait, |
363 | Module, | ||
364 | TypeAlias, | 367 | TypeAlias, |
365 | Const, | 368 | Union, |
366 | Static, | ||
367 | Macro, | ||
368 | } | 369 | } |
369 | 370 | ||
370 | impl FileSymbolKind { | 371 | impl FileSymbolKind { |
@@ -375,6 +376,7 @@ impl FileSymbolKind { | |||
375 | | FileSymbolKind::Enum | 376 | | FileSymbolKind::Enum |
376 | | FileSymbolKind::Trait | 377 | | FileSymbolKind::Trait |
377 | | FileSymbolKind::TypeAlias | 378 | | FileSymbolKind::TypeAlias |
379 | | FileSymbolKind::Union | ||
378 | ) | 380 | ) |
379 | } | 381 | } |
380 | } | 382 | } |
@@ -425,6 +427,7 @@ fn to_symbol(node: &SyntaxNode) -> Option<(SmolStr, SyntaxNodePtr, TextRange)> { | |||
425 | ast::Const(it) => decl(it), | 427 | ast::Const(it) => decl(it), |
426 | ast::Static(it) => decl(it), | 428 | ast::Static(it) => decl(it), |
427 | ast::MacroRules(it) => decl(it), | 429 | ast::MacroRules(it) => decl(it), |
430 | ast::Union(it) => decl(it), | ||
428 | _ => None, | 431 | _ => None, |
429 | } | 432 | } |
430 | } | 433 | } |
@@ -443,6 +446,7 @@ fn to_file_symbol(node: &SyntaxNode, file_id: FileId) -> Option<FileSymbol> { | |||
443 | CONST => FileSymbolKind::Const, | 446 | CONST => FileSymbolKind::Const, |
444 | STATIC => FileSymbolKind::Static, | 447 | STATIC => FileSymbolKind::Static, |
445 | MACRO_RULES => FileSymbolKind::Macro, | 448 | MACRO_RULES => FileSymbolKind::Macro, |
449 | UNION => FileSymbolKind::Union, | ||
446 | kind => unreachable!("{:?}", kind), | 450 | kind => unreachable!("{:?}", kind), |
447 | }, | 451 | }, |
448 | range: node.text_range(), | 452 | range: node.text_range(), |
diff --git a/crates/parser/src/grammar/items/consts.rs b/crates/parser/src/grammar/items/consts.rs index eb7d1f828..12130df40 100644 --- a/crates/parser/src/grammar/items/consts.rs +++ b/crates/parser/src/grammar/items/consts.rs | |||
@@ -13,7 +13,7 @@ pub(super) fn konst(p: &mut Parser, m: Marker) { | |||
13 | fn const_or_static(p: &mut Parser, m: Marker, kw: SyntaxKind, def: SyntaxKind) { | 13 | fn const_or_static(p: &mut Parser, m: Marker, kw: SyntaxKind, def: SyntaxKind) { |
14 | assert!(p.at(kw)); | 14 | assert!(p.at(kw)); |
15 | p.bump(kw); | 15 | p.bump(kw); |
16 | p.eat(T![mut]); // FIXME: validator to forbid const mut | 16 | p.eat(T![mut]); |
17 | 17 | ||
18 | // Allow `_` in place of an identifier in a `const`. | 18 | // Allow `_` in place of an identifier in a `const`. |
19 | let is_const_underscore = kw == T![const] && p.eat(T![_]); | 19 | let is_const_underscore = kw == T![const] && p.eat(T![_]); |
diff --git a/crates/profile/Cargo.toml b/crates/profile/Cargo.toml index cc7da27f7..4dd9acc98 100644 --- a/crates/profile/Cargo.toml +++ b/crates/profile/Cargo.toml | |||
@@ -14,7 +14,7 @@ once_cell = "1.3.1" | |||
14 | cfg-if = "1" | 14 | cfg-if = "1" |
15 | libc = "0.2.73" | 15 | libc = "0.2.73" |
16 | la-arena = { version = "0.2.0", path = "../../lib/arena" } | 16 | la-arena = { version = "0.2.0", path = "../../lib/arena" } |
17 | countme = { version = "2.0.0-pre.2", features = ["enable"] } | 17 | countme = { version = "2.0.0", features = ["enable"] } |
18 | jemalloc-ctl = { version = "0.3.3", optional = true } | 18 | jemalloc-ctl = { version = "0.3.3", optional = true } |
19 | 19 | ||
20 | [target.'cfg(target_os = "linux")'.dependencies] | 20 | [target.'cfg(target_os = "linux")'.dependencies] |
diff --git a/crates/syntax/Cargo.toml b/crates/syntax/Cargo.toml index 24298fbfa..e70fbba9c 100644 --- a/crates/syntax/Cargo.toml +++ b/crates/syntax/Cargo.toml | |||
@@ -12,7 +12,7 @@ doctest = false | |||
12 | 12 | ||
13 | [dependencies] | 13 | [dependencies] |
14 | itertools = "0.10.0" | 14 | itertools = "0.10.0" |
15 | rowan = "0.12" | 15 | rowan = "0.12.2" |
16 | rustc_lexer = { version = "700.0.0", package = "rustc-ap-rustc_lexer" } | 16 | rustc_lexer = { version = "700.0.0", package = "rustc-ap-rustc_lexer" } |
17 | rustc-hash = "1.1.0" | 17 | rustc-hash = "1.1.0" |
18 | arrayvec = "0.5.1" | 18 | arrayvec = "0.5.1" |
diff --git a/crates/syntax/src/validation.rs b/crates/syntax/src/validation.rs index 7694e8834..3e216fb70 100644 --- a/crates/syntax/src/validation.rs +++ b/crates/syntax/src/validation.rs | |||
@@ -1,4 +1,6 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! This module implements syntax validation that the parser doesn't handle. |
2 | //! | ||
3 | //! A failed validation emits a diagnostic. | ||
2 | 4 | ||
3 | mod block; | 5 | mod block; |
4 | 6 | ||
@@ -92,6 +94,7 @@ pub(crate) fn validate(root: &SyntaxNode) -> Vec<SyntaxError> { | |||
92 | match_ast! { | 94 | match_ast! { |
93 | match node { | 95 | match node { |
94 | ast::Literal(it) => validate_literal(it, &mut errors), | 96 | ast::Literal(it) => validate_literal(it, &mut errors), |
97 | ast::Const(it) => validate_const(it, &mut errors), | ||
95 | ast::BlockExpr(it) => block::validate_block_expr(it, &mut errors), | 98 | ast::BlockExpr(it) => block::validate_block_expr(it, &mut errors), |
96 | ast::FieldExpr(it) => validate_numeric_name(it.name_ref(), &mut errors), | 99 | ast::FieldExpr(it) => validate_numeric_name(it.name_ref(), &mut errors), |
97 | ast::RecordExprField(it) => validate_numeric_name(it.name_ref(), &mut errors), | 100 | ast::RecordExprField(it) => validate_numeric_name(it.name_ref(), &mut errors), |
@@ -362,3 +365,14 @@ fn validate_macro_rules(mac: ast::MacroRules, errors: &mut Vec<SyntaxError>) { | |||
362 | )); | 365 | )); |
363 | } | 366 | } |
364 | } | 367 | } |
368 | |||
369 | fn validate_const(const_: ast::Const, errors: &mut Vec<SyntaxError>) { | ||
370 | if let Some(mut_token) = const_ | ||
371 | .const_token() | ||
372 | .and_then(|t| t.next_token()) | ||
373 | .and_then(|t| algo::skip_trivia_token(t, Direction::Next)) | ||
374 | .filter(|t| t.kind() == T![mut]) | ||
375 | { | ||
376 | errors.push(SyntaxError::new("const globals cannot be mutable", mut_token.text_range())); | ||
377 | } | ||
378 | } | ||
diff --git a/crates/syntax/test_data/parser/err/0047_mutable_const_item.rast b/crates/syntax/test_data/parser/err/0047_mutable_const_item.rast new file mode 100644 index 000000000..c7eb312c9 --- /dev/null +++ b/crates/syntax/test_data/parser/err/0047_mutable_const_item.rast | |||
@@ -0,0 +1,22 @@ | |||
1 | [email protected] | ||
2 | [email protected] | ||
3 | [email protected] "const" | ||
4 | [email protected] " " | ||
5 | [email protected] "mut" | ||
6 | [email protected] " " | ||
7 | [email protected] | ||
8 | [email protected] "FOO" | ||
9 | [email protected] ":" | ||
10 | [email protected] " " | ||
11 | [email protected] | ||
12 | [email protected] "(" | ||
13 | [email protected] ")" | ||
14 | [email protected] " " | ||
15 | [email protected] "=" | ||
16 | [email protected] " " | ||
17 | [email protected] | ||
18 | [email protected] "(" | ||
19 | [email protected] ")" | ||
20 | [email protected] ";" | ||
21 | [email protected] "\n" | ||
22 | error 6..9: const globals cannot be mutable | ||
diff --git a/crates/syntax/test_data/parser/err/0047_mutable_const_item.rs b/crates/syntax/test_data/parser/err/0047_mutable_const_item.rs new file mode 100644 index 000000000..b34336f3f --- /dev/null +++ b/crates/syntax/test_data/parser/err/0047_mutable_const_item.rs | |||
@@ -0,0 +1 @@ | |||
const mut FOO: () = (); | |||
diff --git a/crates/syntax/test_data/parser/ok/0024_const_item.rast b/crates/syntax/test_data/parser/ok/0024_const_item.rast index dd1b9c9a0..b89ed6f98 100644 --- a/crates/syntax/test_data/parser/ok/0024_const_item.rast +++ b/crates/syntax/test_data/parser/ok/0024_const_item.rast | |||
@@ -1,4 +1,4 @@ | |||
1 | SOURCE_FILE@0..64 | 1 | SOURCE_FILE@0..39 |
2 | [email protected] | 2 | [email protected] |
3 | [email protected] "const" | 3 | [email protected] "const" |
4 | [email protected] " " | 4 | [email protected] " " |
@@ -36,24 +36,3 @@ [email protected] | |||
36 | [email protected] "92" | 36 | [email protected] "92" |
37 | [email protected] ";" | 37 | [email protected] ";" |
38 | [email protected] "\n" | 38 | [email protected] "\n" |
39 | [email protected] | ||
40 | [email protected] "const" | ||
41 | [email protected] " " | ||
42 | [email protected] "mut" | ||
43 | [email protected] " " | ||
44 | [email protected] | ||
45 | [email protected] "BAR" | ||
46 | [email protected] ":" | ||
47 | [email protected] " " | ||
48 | [email protected] | ||
49 | [email protected] | ||
50 | [email protected] | ||
51 | [email protected] | ||
52 | [email protected] "u32" | ||
53 | [email protected] " " | ||
54 | [email protected] "=" | ||
55 | [email protected] " " | ||
56 | [email protected] | ||
57 | [email protected] "62" | ||
58 | [email protected] ";" | ||
59 | [email protected] "\n" | ||
diff --git a/crates/syntax/test_data/parser/ok/0024_const_item.rs b/crates/syntax/test_data/parser/ok/0024_const_item.rs index a806a209d..1f2ffa0da 100644 --- a/crates/syntax/test_data/parser/ok/0024_const_item.rs +++ b/crates/syntax/test_data/parser/ok/0024_const_item.rs | |||
@@ -1,3 +1,2 @@ | |||
1 | const _: u32 = 0; | 1 | const _: u32 = 0; |
2 | const FOO: u32 = 92; | 2 | const FOO: u32 = 92; |
3 | const mut BAR: u32 = 62; | ||