aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_assists/src/handlers/change_return_type_to_result.rs2
-rw-r--r--crates/ra_hir_def/src/body/lower.rs30
-rw-r--r--crates/ra_syntax/src/ast.rs2
-rw-r--r--crates/ra_syntax/src/ast/generated.rs41
-rw-r--r--crates/ra_syntax/src/ast/generated/nodes.rs26
-rw-r--r--xtask/src/codegen/gen_syntax.rs54
-rw-r--r--xtask/src/codegen/rust.ungram2
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::{
10use ra_arena::Arena; 10use ra_arena::Arena;
11use ra_syntax::{ 11use 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
18pub use self::{ 18pub 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]
4pub(super) mod nodes; 3mod nodes;
5#[rustfmt::skip] 4#[rustfmt::skip]
6pub(super) mod tokens; 5mod tokens;
6
7use crate::{
8 AstNode,
9 SyntaxKind::{self, *},
10 SyntaxNode,
11};
12
13pub use {nodes::*, tokens::*};
14
15// Stmt is the only nested enum, so it's easier to just hand-write it
16impl 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}
350impl ast::AttrsOwner for BlockExpr {} 350impl ast::AttrsOwner for BlockExpr {}
351impl ast::ModuleItemOwner for BlockExpr {}
352impl BlockExpr { 351impl 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 {}
1395pub enum Stmt { 1394pub enum Stmt {
1396 LetStmt(LetStmt), 1395 LetStmt(LetStmt),
1397 ExprStmt(ExprStmt), 1396 ExprStmt(ExprStmt),
1397 Item(Item),
1398} 1398}
1399impl ast::AttrsOwner for Stmt {}
1400impl AstNode for SourceFile { 1399impl 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 {
3380impl From<ExprStmt> for Stmt { 3379impl From<ExprStmt> for Stmt {
3381 fn from(node: ExprStmt) -> Stmt { Stmt::ExprStmt(node) } 3380 fn from(node: ExprStmt) -> Stmt { Stmt::ExprStmt(node) }
3382} 3381}
3383impl AstNode for Stmt { 3382impl 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}
3405impl std::fmt::Display for Item { 3385impl 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
694fn extract_enum_traits(ast: &mut AstSrc) { 695fn 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 =
197Stmt = 197Stmt =
198 LetStmt 198 LetStmt
199| ExprStmt 199| ExprStmt
200| Item
200 201
201LetStmt = 202LetStmt =
202 Attr* 'let' Pat (':' Type)? 203 Attr* 'let' Pat (':' Type)?
@@ -316,7 +317,6 @@ Label =
316BlockExpr = 317BlockExpr =
317 Attr* Label 318 Attr* Label
318 '{' 319 '{'
319 Item*
320 statements:Stmt* 320 statements:Stmt*
321 Expr? 321 Expr?
322 '}' 322 '}'