aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax')
-rw-r--r--crates/ra_syntax/src/ast/generated.rs10
-rw-r--r--crates/ra_syntax/src/ast/traits.rs31
-rw-r--r--crates/ra_syntax/test_data/parser/err/0010_unsafe_lambda_block.txt30
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0158_lambda_ret_block.rs1
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0158_lambda_ret_block.txt45
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}
4139impl From<StructDef> for ModuleItem { 4140impl 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}
4200impl From<MacroCall> for ModuleItem {
4201 fn from(node: MacroCall) -> ModuleItem {
4202 ModuleItem::MacroCall(node)
4203 }
4204}
4199impl std::fmt::Display for ModuleItem { 4205impl 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
7use crate::{ 7use 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
13pub trait TypeAscriptionOwner: AstNode { 12pub trait TypeAscriptionOwner: AstNode {
@@ -46,38 +45,10 @@ pub trait FnDefOwner: AstNode {
46 } 45 }
47} 46}
48 47
49#[derive(Debug, Clone, PartialEq, Eq)]
50pub enum ItemOrMacro {
51 Item(ast::ModuleItem),
52 Macro(ast::MacroCall),
53}
54
55pub trait ModuleItemOwner: AstNode { 48pub 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)]
65pub struct ItemOrMacroIter(SyntaxNodeChildren);
66
67impl 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
83pub trait TypeParamsOwner: AstNode { 54pub 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"
43error [24; 24): expected `{` 44error [24; 24): expected `{`
45error [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 @@
1SOURCE_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"