diff options
Diffstat (limited to 'crates/ra_syntax')
5 files changed, 72 insertions, 45 deletions
diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index 002f453cd..7204ca5b1 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs | |||
@@ -4135,6 +4135,7 @@ pub enum ModuleItem { | |||
4135 | ConstDef(ConstDef), | 4135 | ConstDef(ConstDef), |
4136 | StaticDef(StaticDef), | 4136 | StaticDef(StaticDef), |
4137 | Module(Module), | 4137 | Module(Module), |
4138 | MacroCall(MacroCall), | ||
4138 | } | 4139 | } |
4139 | impl From<StructDef> for ModuleItem { | 4140 | impl From<StructDef> for ModuleItem { |
4140 | fn from(node: StructDef) -> ModuleItem { | 4141 | fn from(node: StructDef) -> ModuleItem { |
@@ -4196,6 +4197,11 @@ impl From<Module> for ModuleItem { | |||
4196 | ModuleItem::Module(node) | 4197 | ModuleItem::Module(node) |
4197 | } | 4198 | } |
4198 | } | 4199 | } |
4200 | impl From<MacroCall> for ModuleItem { | ||
4201 | fn from(node: MacroCall) -> ModuleItem { | ||
4202 | ModuleItem::MacroCall(node) | ||
4203 | } | ||
4204 | } | ||
4199 | impl std::fmt::Display for ModuleItem { | 4205 | impl std::fmt::Display for ModuleItem { |
4200 | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { | 4206 | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { |
4201 | std::fmt::Display::fmt(self.syntax(), f) | 4207 | std::fmt::Display::fmt(self.syntax(), f) |
@@ -4205,7 +4211,7 @@ impl AstNode for ModuleItem { | |||
4205 | fn can_cast(kind: SyntaxKind) -> bool { | 4211 | fn can_cast(kind: SyntaxKind) -> bool { |
4206 | match kind { | 4212 | match kind { |
4207 | STRUCT_DEF | UNION_DEF | ENUM_DEF | FN_DEF | TRAIT_DEF | TYPE_ALIAS_DEF | IMPL_DEF | 4213 | STRUCT_DEF | UNION_DEF | ENUM_DEF | FN_DEF | TRAIT_DEF | TYPE_ALIAS_DEF | IMPL_DEF |
4208 | | USE_ITEM | EXTERN_CRATE_ITEM | CONST_DEF | STATIC_DEF | MODULE => true, | 4214 | | USE_ITEM | EXTERN_CRATE_ITEM | CONST_DEF | STATIC_DEF | MODULE | MACRO_CALL => true, |
4209 | _ => false, | 4215 | _ => false, |
4210 | } | 4216 | } |
4211 | } | 4217 | } |
@@ -4223,6 +4229,7 @@ impl AstNode for ModuleItem { | |||
4223 | CONST_DEF => ModuleItem::ConstDef(ConstDef { syntax }), | 4229 | CONST_DEF => ModuleItem::ConstDef(ConstDef { syntax }), |
4224 | STATIC_DEF => ModuleItem::StaticDef(StaticDef { syntax }), | 4230 | STATIC_DEF => ModuleItem::StaticDef(StaticDef { syntax }), |
4225 | MODULE => ModuleItem::Module(Module { syntax }), | 4231 | MODULE => ModuleItem::Module(Module { syntax }), |
4232 | MACRO_CALL => ModuleItem::MacroCall(MacroCall { syntax }), | ||
4226 | _ => return None, | 4233 | _ => return None, |
4227 | }; | 4234 | }; |
4228 | Some(res) | 4235 | Some(res) |
@@ -4241,6 +4248,7 @@ impl AstNode for ModuleItem { | |||
4241 | ModuleItem::ConstDef(it) => &it.syntax, | 4248 | ModuleItem::ConstDef(it) => &it.syntax, |
4242 | ModuleItem::StaticDef(it) => &it.syntax, | 4249 | ModuleItem::StaticDef(it) => &it.syntax, |
4243 | ModuleItem::Module(it) => &it.syntax, | 4250 | ModuleItem::Module(it) => &it.syntax, |
4251 | ModuleItem::MacroCall(it) => &it.syntax, | ||
4244 | } | 4252 | } |
4245 | } | 4253 | } |
4246 | } | 4254 | } |
diff --git a/crates/ra_syntax/src/ast/traits.rs b/crates/ra_syntax/src/ast/traits.rs index f8cf1e3eb..576378306 100644 --- a/crates/ra_syntax/src/ast/traits.rs +++ b/crates/ra_syntax/src/ast/traits.rs | |||
@@ -6,8 +6,7 @@ use itertools::Itertools; | |||
6 | 6 | ||
7 | use crate::{ | 7 | use crate::{ |
8 | ast::{self, child_opt, children, AstChildren, AstNode, AstToken}, | 8 | ast::{self, child_opt, children, AstChildren, AstNode, AstToken}, |
9 | match_ast, | 9 | syntax_node::SyntaxElementChildren, |
10 | syntax_node::{SyntaxElementChildren, SyntaxNodeChildren}, | ||
11 | }; | 10 | }; |
12 | 11 | ||
13 | pub trait TypeAscriptionOwner: AstNode { | 12 | pub trait TypeAscriptionOwner: AstNode { |
@@ -46,38 +45,10 @@ pub trait FnDefOwner: AstNode { | |||
46 | } | 45 | } |
47 | } | 46 | } |
48 | 47 | ||
49 | #[derive(Debug, Clone, PartialEq, Eq)] | ||
50 | pub enum ItemOrMacro { | ||
51 | Item(ast::ModuleItem), | ||
52 | Macro(ast::MacroCall), | ||
53 | } | ||
54 | |||
55 | pub trait ModuleItemOwner: AstNode { | 48 | pub trait ModuleItemOwner: AstNode { |
56 | fn items(&self) -> AstChildren<ast::ModuleItem> { | 49 | fn items(&self) -> AstChildren<ast::ModuleItem> { |
57 | children(self) | 50 | children(self) |
58 | } | 51 | } |
59 | fn items_with_macros(&self) -> ItemOrMacroIter { | ||
60 | ItemOrMacroIter(self.syntax().children()) | ||
61 | } | ||
62 | } | ||
63 | |||
64 | #[derive(Debug)] | ||
65 | pub struct ItemOrMacroIter(SyntaxNodeChildren); | ||
66 | |||
67 | impl Iterator for ItemOrMacroIter { | ||
68 | type Item = ItemOrMacro; | ||
69 | fn next(&mut self) -> Option<ItemOrMacro> { | ||
70 | loop { | ||
71 | let n = self.0.next()?; | ||
72 | match_ast! { | ||
73 | match n { | ||
74 | ast::ModuleItem(it) => { return Some(ItemOrMacro::Item(it)) }, | ||
75 | ast::MacroCall(it) => { return Some(ItemOrMacro::Macro(it)) }, | ||
76 | _ => {}, | ||
77 | } | ||
78 | } | ||
79 | } | ||
80 | } | ||
81 | } | 52 | } |
82 | 53 | ||
83 | pub trait TypeParamsOwner: AstNode { | 54 | pub trait TypeParamsOwner: AstNode { |
diff --git a/crates/ra_syntax/test_data/parser/err/0010_unsafe_lambda_block.txt b/crates/ra_syntax/test_data/parser/err/0010_unsafe_lambda_block.txt index e0edf6a2d..0ffbd25aa 100644 --- a/crates/ra_syntax/test_data/parser/err/0010_unsafe_lambda_block.txt +++ b/crates/ra_syntax/test_data/parser/err/0010_unsafe_lambda_block.txt | |||
@@ -12,8 +12,8 @@ SOURCE_FILE@[0; 42) | |||
12 | BLOCK@[10; 41) | 12 | BLOCK@[10; 41) |
13 | L_CURLY@[10; 11) "{" | 13 | L_CURLY@[10; 11) "{" |
14 | WHITESPACE@[11; 16) "\n " | 14 | WHITESPACE@[11; 16) "\n " |
15 | EXPR_STMT@[16; 39) | 15 | EXPR_STMT@[16; 24) |
16 | LAMBDA_EXPR@[16; 38) | 16 | LAMBDA_EXPR@[16; 24) |
17 | PARAM_LIST@[16; 18) | 17 | PARAM_LIST@[16; 18) |
18 | PIPE@[16; 17) "|" | 18 | PIPE@[16; 17) "|" |
19 | PIPE@[17; 18) "|" | 19 | PIPE@[17; 18) "|" |
@@ -24,20 +24,22 @@ SOURCE_FILE@[0; 42) | |||
24 | TUPLE_TYPE@[22; 24) | 24 | TUPLE_TYPE@[22; 24) |
25 | L_PAREN@[22; 23) "(" | 25 | L_PAREN@[22; 23) "(" |
26 | R_PAREN@[23; 24) ")" | 26 | R_PAREN@[23; 24) ")" |
27 | WHITESPACE@[24; 25) " " | 27 | WHITESPACE@[24; 25) " " |
28 | BLOCK_EXPR@[25; 38) | 28 | EXPR_STMT@[25; 39) |
29 | UNSAFE_KW@[25; 31) "unsafe" | 29 | BLOCK_EXPR@[25; 38) |
30 | WHITESPACE@[31; 32) " " | 30 | UNSAFE_KW@[25; 31) "unsafe" |
31 | BLOCK@[32; 38) | 31 | WHITESPACE@[31; 32) " " |
32 | L_CURLY@[32; 33) "{" | 32 | BLOCK@[32; 38) |
33 | WHITESPACE@[33; 34) " " | 33 | L_CURLY@[32; 33) "{" |
34 | TUPLE_EXPR@[34; 36) | 34 | WHITESPACE@[33; 34) " " |
35 | L_PAREN@[34; 35) "(" | 35 | TUPLE_EXPR@[34; 36) |
36 | R_PAREN@[35; 36) ")" | 36 | L_PAREN@[34; 35) "(" |
37 | WHITESPACE@[36; 37) " " | 37 | R_PAREN@[35; 36) ")" |
38 | R_CURLY@[37; 38) "}" | 38 | WHITESPACE@[36; 37) " " |
39 | R_CURLY@[37; 38) "}" | ||
39 | SEMI@[38; 39) ";" | 40 | SEMI@[38; 39) ";" |
40 | WHITESPACE@[39; 40) "\n" | 41 | WHITESPACE@[39; 40) "\n" |
41 | R_CURLY@[40; 41) "}" | 42 | R_CURLY@[40; 41) "}" |
42 | WHITESPACE@[41; 42) "\n" | 43 | WHITESPACE@[41; 42) "\n" |
43 | error [24; 24): expected `{` | 44 | error [24; 24): expected `{` |
45 | error [24; 24): expected SEMI | ||
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0158_lambda_ret_block.rs b/crates/ra_syntax/test_data/parser/inline/ok/0158_lambda_ret_block.rs new file mode 100644 index 000000000..061118d3a --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0158_lambda_ret_block.rs | |||
@@ -0,0 +1 @@ | |||
fn main() { || -> i32 { 92 }(); } | |||
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0158_lambda_ret_block.txt b/crates/ra_syntax/test_data/parser/inline/ok/0158_lambda_ret_block.txt new file mode 100644 index 000000000..ba8779094 --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0158_lambda_ret_block.txt | |||
@@ -0,0 +1,45 @@ | |||
1 | SOURCE_FILE@[0; 34) | ||
2 | FN_DEF@[0; 33) | ||
3 | FN_KW@[0; 2) "fn" | ||
4 | WHITESPACE@[2; 3) " " | ||
5 | NAME@[3; 7) | ||
6 | IDENT@[3; 7) "main" | ||
7 | PARAM_LIST@[7; 9) | ||
8 | L_PAREN@[7; 8) "(" | ||
9 | R_PAREN@[8; 9) ")" | ||
10 | WHITESPACE@[9; 10) " " | ||
11 | BLOCK_EXPR@[10; 33) | ||
12 | BLOCK@[10; 33) | ||
13 | L_CURLY@[10; 11) "{" | ||
14 | WHITESPACE@[11; 12) " " | ||
15 | EXPR_STMT@[12; 31) | ||
16 | CALL_EXPR@[12; 30) | ||
17 | LAMBDA_EXPR@[12; 28) | ||
18 | PARAM_LIST@[12; 14) | ||
19 | PIPE@[12; 13) "|" | ||
20 | PIPE@[13; 14) "|" | ||
21 | WHITESPACE@[14; 15) " " | ||
22 | RET_TYPE@[15; 21) | ||
23 | THIN_ARROW@[15; 17) "->" | ||
24 | WHITESPACE@[17; 18) " " | ||
25 | PATH_TYPE@[18; 21) | ||
26 | PATH@[18; 21) | ||
27 | PATH_SEGMENT@[18; 21) | ||
28 | NAME_REF@[18; 21) | ||
29 | IDENT@[18; 21) "i32" | ||
30 | WHITESPACE@[21; 22) " " | ||
31 | BLOCK_EXPR@[22; 28) | ||
32 | BLOCK@[22; 28) | ||
33 | L_CURLY@[22; 23) "{" | ||
34 | WHITESPACE@[23; 24) " " | ||
35 | LITERAL@[24; 26) | ||
36 | INT_NUMBER@[24; 26) "92" | ||
37 | WHITESPACE@[26; 27) " " | ||
38 | R_CURLY@[27; 28) "}" | ||
39 | ARG_LIST@[28; 30) | ||
40 | L_PAREN@[28; 29) "(" | ||
41 | R_PAREN@[29; 30) ")" | ||
42 | SEMI@[30; 31) ";" | ||
43 | WHITESPACE@[31; 32) " " | ||
44 | R_CURLY@[32; 33) "}" | ||
45 | WHITESPACE@[33; 34) "\n" | ||