From 5e5eb6a108b00c573455d8d088742592012707be Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 11 Apr 2020 23:33:17 +0200 Subject: Align grammar for record patterns and literals The grammar now looks like this [name_ref :] pat --- crates/ra_syntax/src/ast.rs | 4 +-- crates/ra_syntax/src/ast/extensions.rs | 30 ++++++++++++++++++++++ crates/ra_syntax/src/ast/generated/nodes.rs | 2 +- .../inline/ok/0102_record_field_pat_list.rast | 26 ++++++++++--------- .../test_data/parser/inline/ok/0143_box_pat.rast | 15 ++++++----- .../parser/inline/ok/0145_record_field_pat.rast | 5 ++-- .../parser/ok/0063_trait_fn_patterns.rast | 14 +++++----- .../test_data/parser/ok/0064_impl_fn_params.rast | 14 +++++----- 8 files changed, 74 insertions(+), 36 deletions(-) (limited to 'crates/ra_syntax') diff --git a/crates/ra_syntax/src/ast.rs b/crates/ra_syntax/src/ast.rs index 99c6b7219..7fca5661e 100644 --- a/crates/ra_syntax/src/ast.rs +++ b/crates/ra_syntax/src/ast.rs @@ -18,8 +18,8 @@ use crate::{ pub use self::{ expr_extensions::{ArrayExprKind, BinOp, ElseBranch, LiteralKind, PrefixOp, RangeOp}, extensions::{ - AttrKind, FieldKind, PathSegmentKind, SelfParamKind, SlicePatComponents, StructKind, - TypeBoundKind, VisibilityKind, + AttrKind, FieldKind, NameOrNameRef, PathSegmentKind, SelfParamKind, SlicePatComponents, + StructKind, TypeBoundKind, VisibilityKind, }, generated::{nodes::*, tokens::*}, tokens::*, diff --git a/crates/ra_syntax/src/ast/extensions.rs b/crates/ra_syntax/src/ast/extensions.rs index 63e272fbf..f2ea5088e 100644 --- a/crates/ra_syntax/src/ast/extensions.rs +++ b/crates/ra_syntax/src/ast/extensions.rs @@ -1,6 +1,8 @@ //! Various extension methods to ast Nodes, which are hard to code-generate. //! Extensions for various expressions live in a sibling `expr_extensions` module. +use std::fmt; + use itertools::Itertools; use ra_parser::SyntaxKind; @@ -217,6 +219,34 @@ impl ast::RecordField { } } +pub enum NameOrNameRef { + Name(ast::Name), + NameRef(ast::NameRef), +} + +impl fmt::Display for NameOrNameRef { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + NameOrNameRef::Name(it) => fmt::Display::fmt(it, f), + NameOrNameRef::NameRef(it) => fmt::Display::fmt(it, f), + } + } +} + +impl ast::RecordFieldPat { + /// Deals with field init shorthand + pub fn field_name(&self) -> Option { + if let Some(name_ref) = self.name_ref() { + return Some(NameOrNameRef::NameRef(name_ref)); + } + if let Some(ast::Pat::BindPat(pat)) = self.pat() { + let name = pat.name()?; + return Some(NameOrNameRef::Name(name)); + } + None + } +} + impl ast::EnumVariant { pub fn parent_enum(&self) -> ast::EnumDef { self.syntax() diff --git a/crates/ra_syntax/src/ast/generated/nodes.rs b/crates/ra_syntax/src/ast/generated/nodes.rs index f1098755b..188f0df96 100644 --- a/crates/ra_syntax/src/ast/generated/nodes.rs +++ b/crates/ra_syntax/src/ast/generated/nodes.rs @@ -1806,8 +1806,8 @@ impl AstNode for RecordFieldPat { fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ast::AttrsOwner for RecordFieldPat {} -impl ast::NameOwner for RecordFieldPat {} impl RecordFieldPat { + pub fn name_ref(&self) -> Option { support::child(&self.syntax) } pub fn colon_token(&self) -> Option { support::token(&self.syntax, T![:]) } pub fn pat(&self) -> Option { support::child(&self.syntax) } } diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0102_record_field_pat_list.rast b/crates/ra_syntax/test_data/parser/inline/ok/0102_record_field_pat_list.rast index c2614543c..fcd099de9 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0102_record_field_pat_list.rast +++ b/crates/ra_syntax/test_data/parser/inline/ok/0102_record_field_pat_list.rast @@ -44,18 +44,20 @@ SOURCE_FILE@[0; 119) RECORD_FIELD_PAT_LIST@[40; 56) L_CURLY@[40; 41) "{" WHITESPACE@[41; 42) " " - BIND_PAT@[42; 43) - NAME@[42; 43) - IDENT@[42; 43) "f" + RECORD_FIELD_PAT@[42; 43) + BIND_PAT@[42; 43) + NAME@[42; 43) + IDENT@[42; 43) "f" COMMA@[43; 44) "," WHITESPACE@[44; 45) " " - BIND_PAT@[45; 54) - REF_KW@[45; 48) "ref" - WHITESPACE@[48; 49) " " - MUT_KW@[49; 52) "mut" - WHITESPACE@[52; 53) " " - NAME@[53; 54) - IDENT@[53; 54) "g" + RECORD_FIELD_PAT@[45; 54) + BIND_PAT@[45; 54) + REF_KW@[45; 48) "ref" + WHITESPACE@[48; 49) " " + MUT_KW@[49; 52) "mut" + WHITESPACE@[52; 53) " " + NAME@[53; 54) + IDENT@[53; 54) "g" WHITESPACE@[54; 55) " " R_CURLY@[55; 56) "}" WHITESPACE@[56; 57) " " @@ -79,7 +81,7 @@ SOURCE_FILE@[0; 119) L_CURLY@[73; 74) "{" WHITESPACE@[74; 75) " " RECORD_FIELD_PAT@[75; 79) - NAME@[75; 76) + NAME_REF@[75; 76) IDENT@[75; 76) "h" COLON@[76; 77) ":" WHITESPACE@[77; 78) " " @@ -110,7 +112,7 @@ SOURCE_FILE@[0; 119) L_CURLY@[101; 102) "{" WHITESPACE@[102; 103) " " RECORD_FIELD_PAT@[103; 107) - NAME@[103; 104) + NAME_REF@[103; 104) IDENT@[103; 104) "h" COLON@[104; 105) ":" WHITESPACE@[105; 106) " " diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0143_box_pat.rast b/crates/ra_syntax/test_data/parser/inline/ok/0143_box_pat.rast index f75673070..1d245f8f3 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0143_box_pat.rast +++ b/crates/ra_syntax/test_data/parser/inline/ok/0143_box_pat.rast @@ -44,16 +44,17 @@ SOURCE_FILE@[0; 118) RECORD_FIELD_PAT_LIST@[50; 81) L_CURLY@[50; 51) "{" WHITESPACE@[51; 52) " " - BOX_PAT@[52; 57) - BOX_KW@[52; 55) "box" - WHITESPACE@[55; 56) " " - BIND_PAT@[56; 57) - NAME@[56; 57) - IDENT@[56; 57) "i" + RECORD_FIELD_PAT@[52; 57) + BOX_PAT@[52; 57) + BOX_KW@[52; 55) "box" + WHITESPACE@[55; 56) " " + BIND_PAT@[56; 57) + NAME@[56; 57) + IDENT@[56; 57) "i" COMMA@[57; 58) "," WHITESPACE@[58; 59) " " RECORD_FIELD_PAT@[59; 79) - NAME@[59; 60) + NAME_REF@[59; 60) IDENT@[59; 60) "j" COLON@[60; 61) ":" WHITESPACE@[61; 62) " " diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0145_record_field_pat.rast b/crates/ra_syntax/test_data/parser/inline/ok/0145_record_field_pat.rast index 0d786f597..cac2ffdcf 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0145_record_field_pat.rast +++ b/crates/ra_syntax/test_data/parser/inline/ok/0145_record_field_pat.rast @@ -25,7 +25,8 @@ SOURCE_FILE@[0; 63) L_CURLY@[21; 22) "{" WHITESPACE@[22; 23) " " RECORD_FIELD_PAT@[23; 27) - INT_NUMBER@[23; 24) "0" + NAME_REF@[23; 24) + INT_NUMBER@[23; 24) "0" COLON@[24; 25) ":" WHITESPACE@[25; 26) " " LITERAL_PAT@[26; 27) @@ -54,7 +55,7 @@ SOURCE_FILE@[0; 63) L_CURLY@[46; 47) "{" WHITESPACE@[47; 48) " " RECORD_FIELD_PAT@[48; 52) - NAME@[48; 49) + NAME_REF@[48; 49) IDENT@[48; 49) "x" COLON@[49; 50) ":" WHITESPACE@[50; 51) " " diff --git a/crates/ra_syntax/test_data/parser/ok/0063_trait_fn_patterns.rast b/crates/ra_syntax/test_data/parser/ok/0063_trait_fn_patterns.rast index 9b5954ebd..d0623ba90 100644 --- a/crates/ra_syntax/test_data/parser/ok/0063_trait_fn_patterns.rast +++ b/crates/ra_syntax/test_data/parser/ok/0063_trait_fn_patterns.rast @@ -68,14 +68,16 @@ SOURCE_FILE@[0; 170) RECORD_FIELD_PAT_LIST@[59; 67) L_CURLY@[59; 60) "{" WHITESPACE@[60; 61) " " - BIND_PAT@[61; 62) - NAME@[61; 62) - IDENT@[61; 62) "a" + RECORD_FIELD_PAT@[61; 62) + BIND_PAT@[61; 62) + NAME@[61; 62) + IDENT@[61; 62) "a" COMMA@[62; 63) "," WHITESPACE@[63; 64) " " - BIND_PAT@[64; 65) - NAME@[64; 65) - IDENT@[64; 65) "b" + RECORD_FIELD_PAT@[64; 65) + BIND_PAT@[64; 65) + NAME@[64; 65) + IDENT@[64; 65) "b" WHITESPACE@[65; 66) " " R_CURLY@[66; 67) "}" COLON@[67; 68) ":" diff --git a/crates/ra_syntax/test_data/parser/ok/0064_impl_fn_params.rast b/crates/ra_syntax/test_data/parser/ok/0064_impl_fn_params.rast index b30030de3..5e96b695b 100644 --- a/crates/ra_syntax/test_data/parser/ok/0064_impl_fn_params.rast +++ b/crates/ra_syntax/test_data/parser/ok/0064_impl_fn_params.rast @@ -71,14 +71,16 @@ SOURCE_FILE@[0; 137) RECORD_FIELD_PAT_LIST@[58; 66) L_CURLY@[58; 59) "{" WHITESPACE@[59; 60) " " - BIND_PAT@[60; 61) - NAME@[60; 61) - IDENT@[60; 61) "a" + RECORD_FIELD_PAT@[60; 61) + BIND_PAT@[60; 61) + NAME@[60; 61) + IDENT@[60; 61) "a" COMMA@[61; 62) "," WHITESPACE@[62; 63) " " - BIND_PAT@[63; 64) - NAME@[63; 64) - IDENT@[63; 64) "b" + RECORD_FIELD_PAT@[63; 64) + BIND_PAT@[63; 64) + NAME@[63; 64) + IDENT@[63; 64) "b" WHITESPACE@[64; 65) " " R_CURLY@[65; 66) "}" COLON@[66; 67) ":" -- cgit v1.2.3