diff options
-rw-r--r-- | crates/ra_assists/src/handlers/change_return_type_to_result.rs | 2 | ||||
-rw-r--r-- | crates/ra_hir_def/src/body/lower.rs | 30 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast.rs | 2 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/generated.rs | 41 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/generated/nodes.rs | 26 | ||||
-rw-r--r-- | xtask/src/codegen/gen_syntax.rs | 54 | ||||
-rw-r--r-- | xtask/src/codegen/rust.ungram | 2 |
7 files changed, 94 insertions, 63 deletions
diff --git a/crates/ra_assists/src/handlers/change_return_type_to_result.rs b/crates/ra_assists/src/handlers/change_return_type_to_result.rs index 167e162d8..4b73c41da 100644 --- a/crates/ra_assists/src/handlers/change_return_type_to_result.rs +++ b/crates/ra_assists/src/handlers/change_return_type_to_result.rs | |||
@@ -74,6 +74,7 @@ impl TailReturnCollector { | |||
74 | let expr = match &stmt { | 74 | let expr = match &stmt { |
75 | ast::Stmt::ExprStmt(stmt) => stmt.expr(), | 75 | ast::Stmt::ExprStmt(stmt) => stmt.expr(), |
76 | ast::Stmt::LetStmt(stmt) => stmt.initializer(), | 76 | ast::Stmt::LetStmt(stmt) => stmt.initializer(), |
77 | ast::Stmt::Item(_) => continue, | ||
77 | }; | 78 | }; |
78 | if let Some(expr) = &expr { | 79 | if let Some(expr) = &expr { |
79 | self.handle_exprs(expr, collect_break); | 80 | self.handle_exprs(expr, collect_break); |
@@ -94,6 +95,7 @@ impl TailReturnCollector { | |||
94 | let expr_stmt = match &expr_stmt { | 95 | let expr_stmt = match &expr_stmt { |
95 | ast::Stmt::ExprStmt(stmt) => stmt.expr(), | 96 | ast::Stmt::ExprStmt(stmt) => stmt.expr(), |
96 | ast::Stmt::LetStmt(stmt) => stmt.initializer(), | 97 | ast::Stmt::LetStmt(stmt) => stmt.initializer(), |
98 | ast::Stmt::Item(_) => None, | ||
97 | }; | 99 | }; |
98 | if let Some(expr) = &expr_stmt { | 100 | if let Some(expr) = &expr_stmt { |
99 | self.handle_exprs(expr, collect_break); | 101 | self.handle_exprs(expr, collect_break); |
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs index 827ced4ad..5816bf566 100644 --- a/crates/ra_hir_def/src/body/lower.rs +++ b/crates/ra_hir_def/src/body/lower.rs | |||
@@ -10,7 +10,7 @@ use hir_expand::{ | |||
10 | use ra_arena::Arena; | 10 | use ra_arena::Arena; |
11 | use ra_syntax::{ | 11 | use ra_syntax::{ |
12 | ast::{ | 12 | ast::{ |
13 | self, ArgListOwner, ArrayExprKind, LiteralKind, LoopBodyOwner, ModuleItemOwner, NameOwner, | 13 | self, ArgListOwner, ArrayExprKind, LiteralKind, LoopBodyOwner, NameOwner, |
14 | SlicePatComponents, | 14 | SlicePatComponents, |
15 | }, | 15 | }, |
16 | AstNode, AstPtr, | 16 | AstNode, AstPtr, |
@@ -601,14 +601,20 @@ impl ExprCollector<'_> { | |||
601 | self.collect_block_items(&block); | 601 | self.collect_block_items(&block); |
602 | let statements = block | 602 | let statements = block |
603 | .statements() | 603 | .statements() |
604 | .map(|s| match s { | 604 | .filter_map(|s| { |
605 | ast::Stmt::LetStmt(stmt) => { | 605 | let stmt = match s { |
606 | let pat = self.collect_pat_opt(stmt.pat()); | 606 | ast::Stmt::LetStmt(stmt) => { |
607 | let type_ref = stmt.ty().map(|it| TypeRef::from_ast(&self.ctx(), it)); | 607 | let pat = self.collect_pat_opt(stmt.pat()); |
608 | let initializer = stmt.initializer().map(|e| self.collect_expr(e)); | 608 | let type_ref = stmt.ty().map(|it| TypeRef::from_ast(&self.ctx(), it)); |
609 | Statement::Let { pat, type_ref, initializer } | 609 | let initializer = stmt.initializer().map(|e| self.collect_expr(e)); |
610 | } | 610 | Statement::Let { pat, type_ref, initializer } |
611 | ast::Stmt::ExprStmt(stmt) => Statement::Expr(self.collect_expr_opt(stmt.expr())), | 611 | } |
612 | ast::Stmt::ExprStmt(stmt) => { | ||
613 | Statement::Expr(self.collect_expr_opt(stmt.expr())) | ||
614 | } | ||
615 | ast::Stmt::Item(_) => return None, | ||
616 | }; | ||
617 | Some(stmt) | ||
612 | }) | 618 | }) |
613 | .collect(); | 619 | .collect(); |
614 | let tail = block.expr().map(|e| self.collect_expr(e)); | 620 | let tail = block.expr().map(|e| self.collect_expr(e)); |
@@ -620,7 +626,11 @@ impl ExprCollector<'_> { | |||
620 | let container = ContainerId::DefWithBodyId(self.def); | 626 | let container = ContainerId::DefWithBodyId(self.def); |
621 | 627 | ||
622 | let items = block | 628 | let items = block |
623 | .items() | 629 | .statements() |
630 | .filter_map(|stmt| match stmt { | ||
631 | ast::Stmt::Item(it) => Some(it), | ||
632 | ast::Stmt::LetStmt(_) | ast::Stmt::ExprStmt(_) => None, | ||
633 | }) | ||
624 | .filter_map(|item| { | 634 | .filter_map(|item| { |
625 | let (def, name): (ModuleDefId, Option<ast::Name>) = match item { | 635 | let (def, name): (ModuleDefId, Option<ast::Name>) = match item { |
626 | ast::Item::Fn(def) => { | 636 | ast::Item::Fn(def) => { |
diff --git a/crates/ra_syntax/src/ast.rs b/crates/ra_syntax/src/ast.rs index 8a0e3d27b..d536bb1e7 100644 --- a/crates/ra_syntax/src/ast.rs +++ b/crates/ra_syntax/src/ast.rs | |||
@@ -17,7 +17,7 @@ use crate::{ | |||
17 | 17 | ||
18 | pub use self::{ | 18 | pub use self::{ |
19 | expr_ext::{ArrayExprKind, BinOp, Effect, ElseBranch, LiteralKind, PrefixOp, RangeOp}, | 19 | expr_ext::{ArrayExprKind, BinOp, Effect, ElseBranch, LiteralKind, PrefixOp, RangeOp}, |
20 | generated::{nodes::*, tokens::*}, | 20 | generated::*, |
21 | node_ext::{ | 21 | node_ext::{ |
22 | AttrKind, FieldKind, NameOrNameRef, PathSegmentKind, SelfParamKind, SlicePatComponents, | 22 | AttrKind, FieldKind, NameOrNameRef, PathSegmentKind, SelfParamKind, SlicePatComponents, |
23 | StructKind, TypeBoundKind, VisibilityKind, | 23 | StructKind, TypeBoundKind, VisibilityKind, |
diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index f5199e09f..4a6f41ee7 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs | |||
@@ -1,6 +1,41 @@ | |||
1 | //! This file is actually hand-written, but the submodules are indeed generated. | 1 | //! This file is actually hand-written, but the submodules are indeed generated. |
2 | |||
3 | #[rustfmt::skip] | 2 | #[rustfmt::skip] |
4 | pub(super) mod nodes; | 3 | mod nodes; |
5 | #[rustfmt::skip] | 4 | #[rustfmt::skip] |
6 | pub(super) mod tokens; | 5 | mod tokens; |
6 | |||
7 | use crate::{ | ||
8 | AstNode, | ||
9 | SyntaxKind::{self, *}, | ||
10 | SyntaxNode, | ||
11 | }; | ||
12 | |||
13 | pub use {nodes::*, tokens::*}; | ||
14 | |||
15 | // Stmt is the only nested enum, so it's easier to just hand-write it | ||
16 | impl AstNode for Stmt { | ||
17 | fn can_cast(kind: SyntaxKind) -> bool { | ||
18 | match kind { | ||
19 | LET_STMT | EXPR_STMT => true, | ||
20 | _ => Item::can_cast(kind), | ||
21 | } | ||
22 | } | ||
23 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
24 | let res = match syntax.kind() { | ||
25 | LET_STMT => Stmt::LetStmt(LetStmt { syntax }), | ||
26 | EXPR_STMT => Stmt::ExprStmt(ExprStmt { syntax }), | ||
27 | _ => { | ||
28 | let item = Item::cast(syntax)?; | ||
29 | Stmt::Item(item) | ||
30 | } | ||
31 | }; | ||
32 | Some(res) | ||
33 | } | ||
34 | fn syntax(&self) -> &SyntaxNode { | ||
35 | match self { | ||
36 | Stmt::LetStmt(it) => &it.syntax, | ||
37 | Stmt::ExprStmt(it) => &it.syntax, | ||
38 | Stmt::Item(it) => it.syntax(), | ||
39 | } | ||
40 | } | ||
41 | } | ||
diff --git a/crates/ra_syntax/src/ast/generated/nodes.rs b/crates/ra_syntax/src/ast/generated/nodes.rs index 286be1032..763fd20f4 100644 --- a/crates/ra_syntax/src/ast/generated/nodes.rs +++ b/crates/ra_syntax/src/ast/generated/nodes.rs | |||
@@ -348,7 +348,6 @@ pub struct BlockExpr { | |||
348 | pub(crate) syntax: SyntaxNode, | 348 | pub(crate) syntax: SyntaxNode, |
349 | } | 349 | } |
350 | impl ast::AttrsOwner for BlockExpr {} | 350 | impl ast::AttrsOwner for BlockExpr {} |
351 | impl ast::ModuleItemOwner for BlockExpr {} | ||
352 | impl BlockExpr { | 351 | impl BlockExpr { |
353 | pub fn label(&self) -> Option<Label> { support::child(&self.syntax) } | 352 | pub fn label(&self) -> Option<Label> { support::child(&self.syntax) } |
354 | pub fn l_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) } | 353 | pub fn l_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) } |
@@ -1395,8 +1394,8 @@ impl ast::AttrsOwner for GenericParam {} | |||
1395 | pub enum Stmt { | 1394 | pub enum Stmt { |
1396 | LetStmt(LetStmt), | 1395 | LetStmt(LetStmt), |
1397 | ExprStmt(ExprStmt), | 1396 | ExprStmt(ExprStmt), |
1397 | Item(Item), | ||
1398 | } | 1398 | } |
1399 | impl ast::AttrsOwner for Stmt {} | ||
1400 | impl AstNode for SourceFile { | 1399 | impl AstNode for SourceFile { |
1401 | fn can_cast(kind: SyntaxKind) -> bool { kind == SOURCE_FILE } | 1400 | fn can_cast(kind: SyntaxKind) -> bool { kind == SOURCE_FILE } |
1402 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1401 | fn cast(syntax: SyntaxNode) -> Option<Self> { |
@@ -3380,27 +3379,8 @@ impl From<LetStmt> for Stmt { | |||
3380 | impl From<ExprStmt> for Stmt { | 3379 | impl From<ExprStmt> for Stmt { |
3381 | fn from(node: ExprStmt) -> Stmt { Stmt::ExprStmt(node) } | 3380 | fn from(node: ExprStmt) -> Stmt { Stmt::ExprStmt(node) } |
3382 | } | 3381 | } |
3383 | impl AstNode for Stmt { | 3382 | impl From<Item> for Stmt { |
3384 | fn can_cast(kind: SyntaxKind) -> bool { | 3383 | fn from(node: Item) -> Stmt { Stmt::Item(node) } |
3385 | match kind { | ||
3386 | LET_STMT | EXPR_STMT => true, | ||
3387 | _ => false, | ||
3388 | } | ||
3389 | } | ||
3390 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3391 | let res = match syntax.kind() { | ||
3392 | LET_STMT => Stmt::LetStmt(LetStmt { syntax }), | ||
3393 | EXPR_STMT => Stmt::ExprStmt(ExprStmt { syntax }), | ||
3394 | _ => return None, | ||
3395 | }; | ||
3396 | Some(res) | ||
3397 | } | ||
3398 | fn syntax(&self) -> &SyntaxNode { | ||
3399 | match self { | ||
3400 | Stmt::LetStmt(it) => &it.syntax, | ||
3401 | Stmt::ExprStmt(it) => &it.syntax, | ||
3402 | } | ||
3403 | } | ||
3404 | } | 3384 | } |
3405 | impl std::fmt::Display for Item { | 3385 | impl std::fmt::Display for Item { |
3406 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | 3386 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
diff --git a/xtask/src/codegen/gen_syntax.rs b/xtask/src/codegen/gen_syntax.rs index d6a72ccc0..d9f358513 100644 --- a/xtask/src/codegen/gen_syntax.rs +++ b/xtask/src/codegen/gen_syntax.rs | |||
@@ -153,25 +153,10 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: &AstSrc) -> Result<String> { | |||
153 | quote!(impl ast::#trait_name for #name {}) | 153 | quote!(impl ast::#trait_name for #name {}) |
154 | }); | 154 | }); |
155 | 155 | ||
156 | ( | 156 | let ast_node = if en.name == "Stmt" { |
157 | quote! { | 157 | quote! {} |
158 | #[pretty_doc_comment_placeholder_workaround] | 158 | } else { |
159 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | ||
160 | pub enum #name { | ||
161 | #(#variants(#variants),)* | ||
162 | } | ||
163 | |||
164 | #(#traits)* | ||
165 | }, | ||
166 | quote! { | 159 | quote! { |
167 | #( | ||
168 | impl From<#variants> for #name { | ||
169 | fn from(node: #variants) -> #name { | ||
170 | #name::#variants(node) | ||
171 | } | ||
172 | } | ||
173 | )* | ||
174 | |||
175 | impl AstNode for #name { | 160 | impl AstNode for #name { |
176 | fn can_cast(kind: SyntaxKind) -> bool { | 161 | fn can_cast(kind: SyntaxKind) -> bool { |
177 | match kind { | 162 | match kind { |
@@ -196,6 +181,28 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: &AstSrc) -> Result<String> { | |||
196 | } | 181 | } |
197 | } | 182 | } |
198 | } | 183 | } |
184 | } | ||
185 | }; | ||
186 | |||
187 | ( | ||
188 | quote! { | ||
189 | #[pretty_doc_comment_placeholder_workaround] | ||
190 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | ||
191 | pub enum #name { | ||
192 | #(#variants(#variants),)* | ||
193 | } | ||
194 | |||
195 | #(#traits)* | ||
196 | }, | ||
197 | quote! { | ||
198 | #( | ||
199 | impl From<#variants> for #name { | ||
200 | fn from(node: #variants) -> #name { | ||
201 | #name::#variants(node) | ||
202 | } | ||
203 | } | ||
204 | )* | ||
205 | #ast_node | ||
199 | }, | 206 | }, |
200 | ) | 207 | ) |
201 | }) | 208 | }) |
@@ -497,13 +504,7 @@ fn lower(grammar: &Grammar) -> AstSrc { | |||
497 | let mut res = AstSrc::default(); | 504 | let mut res = AstSrc::default(); |
498 | res.tokens = vec!["Whitespace".into(), "Comment".into(), "String".into(), "RawString".into()]; | 505 | res.tokens = vec!["Whitespace".into(), "Comment".into(), "String".into(), "RawString".into()]; |
499 | 506 | ||
500 | let nodes = grammar | 507 | let nodes = grammar.iter().collect::<Vec<_>>(); |
501 | .iter() | ||
502 | .filter(|&node| match grammar[node].rule { | ||
503 | Rule::Node(it) if it == node => false, | ||
504 | _ => true, | ||
505 | }) | ||
506 | .collect::<Vec<_>>(); | ||
507 | 508 | ||
508 | for &node in &nodes { | 509 | for &node in &nodes { |
509 | let name = grammar[node].name.clone(); | 510 | let name = grammar[node].name.clone(); |
@@ -693,6 +694,9 @@ fn extract_struct_trait(node: &mut AstNodeSrc, trait_name: &str, methods: &[&str | |||
693 | 694 | ||
694 | fn extract_enum_traits(ast: &mut AstSrc) { | 695 | fn extract_enum_traits(ast: &mut AstSrc) { |
695 | for enm in &mut ast.enums { | 696 | for enm in &mut ast.enums { |
697 | if enm.name == "Stmt" { | ||
698 | continue; | ||
699 | } | ||
696 | let nodes = &ast.nodes; | 700 | let nodes = &ast.nodes; |
697 | let mut variant_traits = enm | 701 | let mut variant_traits = enm |
698 | .variants | 702 | .variants |
diff --git a/xtask/src/codegen/rust.ungram b/xtask/src/codegen/rust.ungram index 8271509cf..17de36d7a 100644 --- a/xtask/src/codegen/rust.ungram +++ b/xtask/src/codegen/rust.ungram | |||
@@ -197,6 +197,7 @@ Attr = | |||
197 | Stmt = | 197 | Stmt = |
198 | LetStmt | 198 | LetStmt |
199 | | ExprStmt | 199 | | ExprStmt |
200 | | Item | ||
200 | 201 | ||
201 | LetStmt = | 202 | LetStmt = |
202 | Attr* 'let' Pat (':' Type)? | 203 | Attr* 'let' Pat (':' Type)? |
@@ -316,7 +317,6 @@ Label = | |||
316 | BlockExpr = | 317 | BlockExpr = |
317 | Attr* Label | 318 | Attr* Label |
318 | '{' | 319 | '{' |
319 | Item* | ||
320 | statements:Stmt* | 320 | statements:Stmt* |
321 | Expr? | 321 | Expr? |
322 | '}' | 322 | '}' |