diff options
Diffstat (limited to 'crates/ra_syntax/src')
-rw-r--r-- | crates/ra_syntax/src/ast/extensions.rs | 2 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/generated.rs | 37 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/traits.rs | 6 | ||||
-rw-r--r-- | crates/ra_syntax/src/grammar.ron | 6 | ||||
-rw-r--r-- | crates/ra_syntax/src/parsing/lexer/numbers.rs | 6 | ||||
-rw-r--r-- | crates/ra_syntax/src/validation/unescape.rs | 2 |
6 files changed, 54 insertions, 5 deletions
diff --git a/crates/ra_syntax/src/ast/extensions.rs b/crates/ra_syntax/src/ast/extensions.rs index e4c99784c..930b2d9fa 100644 --- a/crates/ra_syntax/src/ast/extensions.rs +++ b/crates/ra_syntax/src/ast/extensions.rs | |||
@@ -78,7 +78,7 @@ impl ast::Attr { | |||
78 | if attr.kind() == IDENT { | 78 | if attr.kind() == IDENT { |
79 | let key = attr.as_token()?.text().clone(); | 79 | let key = attr.as_token()?.text().clone(); |
80 | let val_node = tt_node.children_with_tokens().find(|t| t.kind() == STRING)?; | 80 | let val_node = tt_node.children_with_tokens().find(|t| t.kind() == STRING)?; |
81 | let val = val_node.as_token()?.text().trim_start_matches("\"").trim_end_matches("\""); | 81 | let val = val_node.as_token()?.text().trim_start_matches('"').trim_end_matches('"'); |
82 | Some((key, SmolStr::new(val))) | 82 | Some((key, SmolStr::new(val))) |
83 | } else { | 83 | } else { |
84 | None | 84 | None |
diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index e73fe22e9..1d888e709 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs | |||
@@ -713,6 +713,7 @@ pub enum ExprKind<'a> { | |||
713 | MethodCallExpr(&'a MethodCallExpr), | 713 | MethodCallExpr(&'a MethodCallExpr), |
714 | FieldExpr(&'a FieldExpr), | 714 | FieldExpr(&'a FieldExpr), |
715 | TryExpr(&'a TryExpr), | 715 | TryExpr(&'a TryExpr), |
716 | TryBlockExpr(&'a TryBlockExpr), | ||
716 | CastExpr(&'a CastExpr), | 717 | CastExpr(&'a CastExpr), |
717 | RefExpr(&'a RefExpr), | 718 | RefExpr(&'a RefExpr), |
718 | PrefixExpr(&'a PrefixExpr), | 719 | PrefixExpr(&'a PrefixExpr), |
@@ -826,6 +827,11 @@ impl<'a> From<&'a TryExpr> for &'a Expr { | |||
826 | Expr::cast(&n.syntax).unwrap() | 827 | Expr::cast(&n.syntax).unwrap() |
827 | } | 828 | } |
828 | } | 829 | } |
830 | impl<'a> From<&'a TryBlockExpr> for &'a Expr { | ||
831 | fn from(n: &'a TryBlockExpr) -> &'a Expr { | ||
832 | Expr::cast(&n.syntax).unwrap() | ||
833 | } | ||
834 | } | ||
829 | impl<'a> From<&'a CastExpr> for &'a Expr { | 835 | impl<'a> From<&'a CastExpr> for &'a Expr { |
830 | fn from(n: &'a CastExpr) -> &'a Expr { | 836 | fn from(n: &'a CastExpr) -> &'a Expr { |
831 | Expr::cast(&n.syntax).unwrap() | 837 | Expr::cast(&n.syntax).unwrap() |
@@ -887,6 +893,7 @@ impl AstNode for Expr { | |||
887 | | METHOD_CALL_EXPR | 893 | | METHOD_CALL_EXPR |
888 | | FIELD_EXPR | 894 | | FIELD_EXPR |
889 | | TRY_EXPR | 895 | | TRY_EXPR |
896 | | TRY_BLOCK_EXPR | ||
890 | | CAST_EXPR | 897 | | CAST_EXPR |
891 | | REF_EXPR | 898 | | REF_EXPR |
892 | | PREFIX_EXPR | 899 | | PREFIX_EXPR |
@@ -929,6 +936,7 @@ impl Expr { | |||
929 | METHOD_CALL_EXPR => ExprKind::MethodCallExpr(MethodCallExpr::cast(&self.syntax).unwrap()), | 936 | METHOD_CALL_EXPR => ExprKind::MethodCallExpr(MethodCallExpr::cast(&self.syntax).unwrap()), |
930 | FIELD_EXPR => ExprKind::FieldExpr(FieldExpr::cast(&self.syntax).unwrap()), | 937 | FIELD_EXPR => ExprKind::FieldExpr(FieldExpr::cast(&self.syntax).unwrap()), |
931 | TRY_EXPR => ExprKind::TryExpr(TryExpr::cast(&self.syntax).unwrap()), | 938 | TRY_EXPR => ExprKind::TryExpr(TryExpr::cast(&self.syntax).unwrap()), |
939 | TRY_BLOCK_EXPR => ExprKind::TryBlockExpr(TryBlockExpr::cast(&self.syntax).unwrap()), | ||
932 | CAST_EXPR => ExprKind::CastExpr(CastExpr::cast(&self.syntax).unwrap()), | 940 | CAST_EXPR => ExprKind::CastExpr(CastExpr::cast(&self.syntax).unwrap()), |
933 | REF_EXPR => ExprKind::RefExpr(RefExpr::cast(&self.syntax).unwrap()), | 941 | REF_EXPR => ExprKind::RefExpr(RefExpr::cast(&self.syntax).unwrap()), |
934 | PREFIX_EXPR => ExprKind::PrefixExpr(PrefixExpr::cast(&self.syntax).unwrap()), | 942 | PREFIX_EXPR => ExprKind::PrefixExpr(PrefixExpr::cast(&self.syntax).unwrap()), |
@@ -3672,6 +3680,35 @@ impl TraitDef { | |||
3672 | } | 3680 | } |
3673 | } | 3681 | } |
3674 | 3682 | ||
3683 | // TryBlockExpr | ||
3684 | #[derive(Debug, PartialEq, Eq, Hash)] | ||
3685 | #[repr(transparent)] | ||
3686 | pub struct TryBlockExpr { | ||
3687 | pub(crate) syntax: SyntaxNode, | ||
3688 | } | ||
3689 | unsafe impl TransparentNewType for TryBlockExpr { | ||
3690 | type Repr = rowan::SyntaxNode; | ||
3691 | } | ||
3692 | |||
3693 | impl AstNode for TryBlockExpr { | ||
3694 | fn cast(syntax: &SyntaxNode) -> Option<&Self> { | ||
3695 | match syntax.kind() { | ||
3696 | TRY_BLOCK_EXPR => Some(TryBlockExpr::from_repr(syntax.into_repr())), | ||
3697 | _ => None, | ||
3698 | } | ||
3699 | } | ||
3700 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
3701 | } | ||
3702 | |||
3703 | impl ToOwned for TryBlockExpr { | ||
3704 | type Owned = TreeArc<TryBlockExpr>; | ||
3705 | fn to_owned(&self) -> TreeArc<TryBlockExpr> { TreeArc::cast(self.syntax.to_owned()) } | ||
3706 | } | ||
3707 | |||
3708 | |||
3709 | impl ast::TryBlockBodyOwner for TryBlockExpr {} | ||
3710 | impl TryBlockExpr {} | ||
3711 | |||
3675 | // TryExpr | 3712 | // TryExpr |
3676 | #[derive(Debug, PartialEq, Eq, Hash)] | 3713 | #[derive(Debug, PartialEq, Eq, Hash)] |
3677 | #[repr(transparent)] | 3714 | #[repr(transparent)] |
diff --git a/crates/ra_syntax/src/ast/traits.rs b/crates/ra_syntax/src/ast/traits.rs index 1c90cf148..433485400 100644 --- a/crates/ra_syntax/src/ast/traits.rs +++ b/crates/ra_syntax/src/ast/traits.rs | |||
@@ -33,6 +33,12 @@ pub trait LoopBodyOwner: AstNode { | |||
33 | } | 33 | } |
34 | } | 34 | } |
35 | 35 | ||
36 | pub trait TryBlockBodyOwner: AstNode { | ||
37 | fn try_body(&self) -> Option<&ast::Block> { | ||
38 | child_opt(self) | ||
39 | } | ||
40 | } | ||
41 | |||
36 | pub trait ArgListOwner: AstNode { | 42 | pub trait ArgListOwner: AstNode { |
37 | fn arg_list(&self) -> Option<&ast::ArgList> { | 43 | fn arg_list(&self) -> Option<&ast::ArgList> { |
38 | child_opt(self) | 44 | child_opt(self) |
diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron index b8665bbc8..1c2714307 100644 --- a/crates/ra_syntax/src/grammar.ron +++ b/crates/ra_syntax/src/grammar.ron | |||
@@ -95,6 +95,7 @@ Grammar( | |||
95 | "let", | 95 | "let", |
96 | "move", | 96 | "move", |
97 | "return", | 97 | "return", |
98 | "try", | ||
98 | ], | 99 | ], |
99 | contextual_keywords: [ | 100 | contextual_keywords: [ |
100 | "auto", | 101 | "auto", |
@@ -189,6 +190,7 @@ Grammar( | |||
189 | "STRUCT_LIT", | 190 | "STRUCT_LIT", |
190 | "NAMED_FIELD_LIST", | 191 | "NAMED_FIELD_LIST", |
191 | "NAMED_FIELD", | 192 | "NAMED_FIELD", |
193 | "TRY_BLOCK_EXPR", | ||
192 | 194 | ||
193 | // postfix | 195 | // postfix |
194 | "CALL_EXPR", | 196 | "CALL_EXPR", |
@@ -417,6 +419,9 @@ Grammar( | |||
417 | "LoopExpr": ( | 419 | "LoopExpr": ( |
418 | traits: ["LoopBodyOwner"], | 420 | traits: ["LoopBodyOwner"], |
419 | ), | 421 | ), |
422 | "TryBlockExpr": ( | ||
423 | traits: ["TryBlockBodyOwner"], | ||
424 | ), | ||
420 | "ForExpr": ( | 425 | "ForExpr": ( |
421 | traits: ["LoopBodyOwner"], | 426 | traits: ["LoopBodyOwner"], |
422 | options: [ | 427 | options: [ |
@@ -499,6 +504,7 @@ Grammar( | |||
499 | "MethodCallExpr", | 504 | "MethodCallExpr", |
500 | "FieldExpr", | 505 | "FieldExpr", |
501 | "TryExpr", | 506 | "TryExpr", |
507 | "TryBlockExpr", | ||
502 | "CastExpr", | 508 | "CastExpr", |
503 | "RefExpr", | 509 | "RefExpr", |
504 | "PrefixExpr", | 510 | "PrefixExpr", |
diff --git a/crates/ra_syntax/src/parsing/lexer/numbers.rs b/crates/ra_syntax/src/parsing/lexer/numbers.rs index 7f6abe1d5..874fb8b32 100644 --- a/crates/ra_syntax/src/parsing/lexer/numbers.rs +++ b/crates/ra_syntax/src/parsing/lexer/numbers.rs | |||
@@ -16,7 +16,7 @@ pub(crate) fn scan_number(c: char, ptr: &mut Ptr) -> SyntaxKind { | |||
16 | ptr.bump(); | 16 | ptr.bump(); |
17 | scan_digits(ptr, true); | 17 | scan_digits(ptr, true); |
18 | } | 18 | } |
19 | '0'...'9' | '_' | '.' | 'e' | 'E' => { | 19 | '0'..='9' | '_' | '.' | 'e' | 'E' => { |
20 | scan_digits(ptr, true); | 20 | scan_digits(ptr, true); |
21 | } | 21 | } |
22 | _ => return INT_NUMBER, | 22 | _ => return INT_NUMBER, |
@@ -47,10 +47,10 @@ pub(crate) fn scan_number(c: char, ptr: &mut Ptr) -> SyntaxKind { | |||
47 | fn scan_digits(ptr: &mut Ptr, allow_hex: bool) { | 47 | fn scan_digits(ptr: &mut Ptr, allow_hex: bool) { |
48 | while let Some(c) = ptr.current() { | 48 | while let Some(c) = ptr.current() { |
49 | match c { | 49 | match c { |
50 | '_' | '0'...'9' => { | 50 | '_' | '0'..='9' => { |
51 | ptr.bump(); | 51 | ptr.bump(); |
52 | } | 52 | } |
53 | 'a'...'f' | 'A'...'F' if allow_hex => { | 53 | 'a'..='f' | 'A'..='F' if allow_hex => { |
54 | ptr.bump(); | 54 | ptr.bump(); |
55 | } | 55 | } |
56 | _ => return, | 56 | _ => return, |
diff --git a/crates/ra_syntax/src/validation/unescape.rs b/crates/ra_syntax/src/validation/unescape.rs index 2086046b6..91dbcfae8 100644 --- a/crates/ra_syntax/src/validation/unescape.rs +++ b/crates/ra_syntax/src/validation/unescape.rs | |||
@@ -255,7 +255,7 @@ where | |||
255 | let first_non_space = str | 255 | let first_non_space = str |
256 | .bytes() | 256 | .bytes() |
257 | .position(|b| b != b' ' && b != b'\t' && b != b'\n' && b != b'\r') | 257 | .position(|b| b != b' ' && b != b'\t' && b != b'\n' && b != b'\r') |
258 | .unwrap_or(str.len()); | 258 | .unwrap_or_else(|| str.len()); |
259 | *chars = str[first_non_space..].chars() | 259 | *chars = str[first_non_space..].chars() |
260 | } | 260 | } |
261 | } | 261 | } |