diff options
Diffstat (limited to 'crates/ra_syntax')
-rw-r--r-- | crates/ra_syntax/src/ast/extensions.rs | 3 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/generated.rs | 42 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/make.rs | 28 | ||||
-rw-r--r-- | crates/ra_syntax/test_data/parser/inline/ok/0129_marco_pat.txt | 21 |
4 files changed, 82 insertions, 12 deletions
diff --git a/crates/ra_syntax/src/ast/extensions.rs b/crates/ra_syntax/src/ast/extensions.rs index 392731dac..bf7d137be 100644 --- a/crates/ra_syntax/src/ast/extensions.rs +++ b/crates/ra_syntax/src/ast/extensions.rs | |||
@@ -325,6 +325,9 @@ impl ast::BindPat { | |||
325 | pub fn is_ref(&self) -> bool { | 325 | pub fn is_ref(&self) -> bool { |
326 | self.syntax().children_with_tokens().any(|n| n.kind() == T![ref]) | 326 | self.syntax().children_with_tokens().any(|n| n.kind() == T![ref]) |
327 | } | 327 | } |
328 | pub fn has_at(&self) -> bool { | ||
329 | self.syntax().children_with_tokens().any(|it| it.kind() == T![@]) | ||
330 | } | ||
328 | } | 331 | } |
329 | 332 | ||
330 | pub struct SlicePatComponents { | 333 | pub struct SlicePatComponents { |
diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index 7204ca5b1..0c339b987 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs | |||
@@ -2563,6 +2563,38 @@ impl LiteralPat { | |||
2563 | } | 2563 | } |
2564 | } | 2564 | } |
2565 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 2565 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
2566 | pub struct MacroPat { | ||
2567 | pub(crate) syntax: SyntaxNode, | ||
2568 | } | ||
2569 | impl std::fmt::Display for MacroPat { | ||
2570 | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { | ||
2571 | std::fmt::Display::fmt(self.syntax(), f) | ||
2572 | } | ||
2573 | } | ||
2574 | impl AstNode for MacroPat { | ||
2575 | fn can_cast(kind: SyntaxKind) -> bool { | ||
2576 | match kind { | ||
2577 | MACRO_PAT => true, | ||
2578 | _ => false, | ||
2579 | } | ||
2580 | } | ||
2581 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2582 | if Self::can_cast(syntax.kind()) { | ||
2583 | Some(Self { syntax }) | ||
2584 | } else { | ||
2585 | None | ||
2586 | } | ||
2587 | } | ||
2588 | fn syntax(&self) -> &SyntaxNode { | ||
2589 | &self.syntax | ||
2590 | } | ||
2591 | } | ||
2592 | impl MacroPat { | ||
2593 | pub fn macro_call(&self) -> Option<MacroCall> { | ||
2594 | AstChildren::new(&self.syntax).next() | ||
2595 | } | ||
2596 | } | ||
2597 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | ||
2566 | pub struct RecordPat { | 2598 | pub struct RecordPat { |
2567 | pub(crate) syntax: SyntaxNode, | 2599 | pub(crate) syntax: SyntaxNode, |
2568 | } | 2600 | } |
@@ -4600,6 +4632,7 @@ pub enum Pat { | |||
4600 | SlicePat(SlicePat), | 4632 | SlicePat(SlicePat), |
4601 | RangePat(RangePat), | 4633 | RangePat(RangePat), |
4602 | LiteralPat(LiteralPat), | 4634 | LiteralPat(LiteralPat), |
4635 | MacroPat(MacroPat), | ||
4603 | } | 4636 | } |
4604 | impl From<OrPat> for Pat { | 4637 | impl From<OrPat> for Pat { |
4605 | fn from(node: OrPat) -> Pat { | 4638 | fn from(node: OrPat) -> Pat { |
@@ -4671,6 +4704,11 @@ impl From<LiteralPat> for Pat { | |||
4671 | Pat::LiteralPat(node) | 4704 | Pat::LiteralPat(node) |
4672 | } | 4705 | } |
4673 | } | 4706 | } |
4707 | impl From<MacroPat> for Pat { | ||
4708 | fn from(node: MacroPat) -> Pat { | ||
4709 | Pat::MacroPat(node) | ||
4710 | } | ||
4711 | } | ||
4674 | impl std::fmt::Display for Pat { | 4712 | impl std::fmt::Display for Pat { |
4675 | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { | 4713 | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { |
4676 | std::fmt::Display::fmt(self.syntax(), f) | 4714 | std::fmt::Display::fmt(self.syntax(), f) |
@@ -4681,7 +4719,7 @@ impl AstNode for Pat { | |||
4681 | match kind { | 4719 | match kind { |
4682 | OR_PAT | PAREN_PAT | REF_PAT | BOX_PAT | BIND_PAT | PLACEHOLDER_PAT | DOT_DOT_PAT | 4720 | OR_PAT | PAREN_PAT | REF_PAT | BOX_PAT | BIND_PAT | PLACEHOLDER_PAT | DOT_DOT_PAT |
4683 | | PATH_PAT | RECORD_PAT | TUPLE_STRUCT_PAT | TUPLE_PAT | SLICE_PAT | RANGE_PAT | 4721 | | PATH_PAT | RECORD_PAT | TUPLE_STRUCT_PAT | TUPLE_PAT | SLICE_PAT | RANGE_PAT |
4684 | | LITERAL_PAT => true, | 4722 | | LITERAL_PAT | MACRO_PAT => true, |
4685 | _ => false, | 4723 | _ => false, |
4686 | } | 4724 | } |
4687 | } | 4725 | } |
@@ -4701,6 +4739,7 @@ impl AstNode for Pat { | |||
4701 | SLICE_PAT => Pat::SlicePat(SlicePat { syntax }), | 4739 | SLICE_PAT => Pat::SlicePat(SlicePat { syntax }), |
4702 | RANGE_PAT => Pat::RangePat(RangePat { syntax }), | 4740 | RANGE_PAT => Pat::RangePat(RangePat { syntax }), |
4703 | LITERAL_PAT => Pat::LiteralPat(LiteralPat { syntax }), | 4741 | LITERAL_PAT => Pat::LiteralPat(LiteralPat { syntax }), |
4742 | MACRO_PAT => Pat::MacroPat(MacroPat { syntax }), | ||
4704 | _ => return None, | 4743 | _ => return None, |
4705 | }; | 4744 | }; |
4706 | Some(res) | 4745 | Some(res) |
@@ -4721,6 +4760,7 @@ impl AstNode for Pat { | |||
4721 | Pat::SlicePat(it) => &it.syntax, | 4760 | Pat::SlicePat(it) => &it.syntax, |
4722 | Pat::RangePat(it) => &it.syntax, | 4761 | Pat::RangePat(it) => &it.syntax, |
4723 | Pat::LiteralPat(it) => &it.syntax, | 4762 | Pat::LiteralPat(it) => &it.syntax, |
4763 | Pat::MacroPat(it) => &it.syntax, | ||
4724 | } | 4764 | } |
4725 | } | 4765 | } |
4726 | } | 4766 | } |
diff --git a/crates/ra_syntax/src/ast/make.rs b/crates/ra_syntax/src/ast/make.rs index 0c908573d..f39559e9e 100644 --- a/crates/ra_syntax/src/ast/make.rs +++ b/crates/ra_syntax/src/ast/make.rs | |||
@@ -22,7 +22,8 @@ pub fn path_unqualified(segment: ast::PathSegment) -> ast::Path { | |||
22 | pub fn path_qualified(qual: ast::Path, segment: ast::PathSegment) -> ast::Path { | 22 | pub fn path_qualified(qual: ast::Path, segment: ast::PathSegment) -> ast::Path { |
23 | path_from_text(&format!("{}::{}", qual, segment)) | 23 | path_from_text(&format!("{}::{}", qual, segment)) |
24 | } | 24 | } |
25 | fn path_from_text(text: &str) -> ast::Path { | 25 | |
26 | pub fn path_from_text(text: &str) -> ast::Path { | ||
26 | ast_from_text(text) | 27 | ast_from_text(text) |
27 | } | 28 | } |
28 | 29 | ||
@@ -269,6 +270,31 @@ pub fn unreachable_macro_call() -> ast::MacroCall { | |||
269 | ast_from_text(&format!("unreachable!()")) | 270 | ast_from_text(&format!("unreachable!()")) |
270 | } | 271 | } |
271 | 272 | ||
273 | pub fn param(name: String, ty: String) -> ast::Param { | ||
274 | ast_from_text(&format!("fn f({}: {}) {{ }}", name, ty)) | ||
275 | } | ||
276 | |||
277 | pub fn param_list(pats: impl IntoIterator<Item = ast::Param>) -> ast::ParamList { | ||
278 | let args = pats.into_iter().join(", "); | ||
279 | ast_from_text(&format!("fn f({}) {{ }}", args)) | ||
280 | } | ||
281 | |||
282 | pub fn fn_def( | ||
283 | fn_name: ast::Name, | ||
284 | type_params: Option<ast::TypeParamList>, | ||
285 | params: ast::ParamList, | ||
286 | body: ast::BlockExpr, | ||
287 | ) -> ast::FnDef { | ||
288 | let type_params = | ||
289 | if let Some(type_params) = type_params { format!("<{}>", type_params) } else { "".into() }; | ||
290 | ast_from_text(&format!("fn {}{}{} {}", fn_name, type_params, params, body)) | ||
291 | } | ||
292 | |||
293 | pub fn add_newlines(amount_of_newlines: usize, t: impl AstNode) -> ast::SourceFile { | ||
294 | let newlines = "\n".repeat(amount_of_newlines); | ||
295 | ast_from_text(&format!("{}{}", newlines, t.syntax())) | ||
296 | } | ||
297 | |||
272 | fn ast_from_text<N: AstNode>(text: &str) -> N { | 298 | fn ast_from_text<N: AstNode>(text: &str) -> N { |
273 | let parse = SourceFile::parse(text); | 299 | let parse = SourceFile::parse(text); |
274 | let node = parse.tree().syntax().descendants().find_map(N::cast).unwrap(); | 300 | let node = parse.tree().syntax().descendants().find_map(N::cast).unwrap(); |
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0129_marco_pat.txt b/crates/ra_syntax/test_data/parser/inline/ok/0129_marco_pat.txt index b05ccc0ed..36d8f4a5f 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0129_marco_pat.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0129_marco_pat.txt | |||
@@ -15,16 +15,17 @@ SOURCE_FILE@[0; 33) | |||
15 | LET_STMT@[16; 30) | 15 | LET_STMT@[16; 30) |
16 | LET_KW@[16; 19) "let" | 16 | LET_KW@[16; 19) "let" |
17 | WHITESPACE@[19; 20) " " | 17 | WHITESPACE@[19; 20) " " |
18 | MACRO_CALL@[20; 25) | 18 | MACRO_PAT@[20; 25) |
19 | PATH@[20; 21) | 19 | MACRO_CALL@[20; 25) |
20 | PATH_SEGMENT@[20; 21) | 20 | PATH@[20; 21) |
21 | NAME_REF@[20; 21) | 21 | PATH_SEGMENT@[20; 21) |
22 | IDENT@[20; 21) "m" | 22 | NAME_REF@[20; 21) |
23 | EXCL@[21; 22) "!" | 23 | IDENT@[20; 21) "m" |
24 | TOKEN_TREE@[22; 25) | 24 | EXCL@[21; 22) "!" |
25 | L_PAREN@[22; 23) "(" | 25 | TOKEN_TREE@[22; 25) |
26 | IDENT@[23; 24) "x" | 26 | L_PAREN@[22; 23) "(" |
27 | R_PAREN@[24; 25) ")" | 27 | IDENT@[23; 24) "x" |
28 | R_PAREN@[24; 25) ")" | ||
28 | WHITESPACE@[25; 26) " " | 29 | WHITESPACE@[25; 26) " " |
29 | EQ@[26; 27) "=" | 30 | EQ@[26; 27) "=" |
30 | WHITESPACE@[27; 28) " " | 31 | WHITESPACE@[27; 28) " " |