From c1cb5953820f26d4d0a614650bc8c50cbc5a3ce6 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Tue, 15 Dec 2020 15:37:37 +0100 Subject: Move to upstream `macro_rules!` model --- crates/syntax/src/ast/generated/nodes.rs | 43 ++++++++++++++++--- crates/syntax/src/ast/node_ext.rs | 17 +------- crates/syntax/src/display.rs | 2 +- crates/syntax/src/parsing/text_tree_sink.rs | 4 +- .../parser/err/0002_duplicate_shebang.rast | 14 +++++-- .../parser/inline/ok/0062_mod_contents.rast | 7 +--- .../parser/inline/ok/0096_no_semi_after_block.rast | 48 ++++++++++------------ .../parser/inline/ok/0160_try_macro_rules.rast | 7 +--- .../ok/0053_outer_attribute_on_macro_rules.rast | 7 +--- 9 files changed, 80 insertions(+), 69 deletions(-) (limited to 'crates/syntax') diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs index 30d11b146..0ad75214f 100644 --- a/crates/syntax/src/ast/generated/nodes.rs +++ b/crates/syntax/src/ast/generated/nodes.rs @@ -128,7 +128,6 @@ pub struct MacroCall { pub(crate) syntax: SyntaxNode, } impl ast::AttrsOwner for MacroCall {} -impl ast::NameOwner for MacroCall {} impl MacroCall { pub fn path(&self) -> Option { support::child(&self.syntax) } pub fn excl_token(&self) -> Option { support::token(&self.syntax, T![!]) } @@ -273,6 +272,20 @@ impl Impl { pub fn assoc_item_list(&self) -> Option { support::child(&self.syntax) } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct MacroRules { + pub(crate) syntax: SyntaxNode, +} +impl ast::AttrsOwner for MacroRules {} +impl ast::NameOwner for MacroRules {} +impl ast::VisibilityOwner for MacroRules {} +impl MacroRules { + pub fn macro_rules_token(&self) -> Option { + support::token(&self.syntax, T![macro_rules]) + } + pub fn excl_token(&self) -> Option { support::token(&self.syntax, T![!]) } + pub fn token_tree(&self) -> Option { support::child(&self.syntax) } +} +#[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Module { pub(crate) syntax: SyntaxNode, } @@ -1318,6 +1331,7 @@ pub enum Item { Fn(Fn), Impl(Impl), MacroCall(MacroCall), + MacroRules(MacroRules), Module(Module), Static(Static), Struct(Struct), @@ -1374,7 +1388,6 @@ pub enum AssocItem { TypeAlias(TypeAlias), } impl ast::AttrsOwner for AssocItem {} -impl ast::NameOwner for AssocItem {} #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum ExternItem { Fn(Fn), @@ -1383,7 +1396,6 @@ pub enum ExternItem { TypeAlias(TypeAlias), } impl ast::AttrsOwner for ExternItem {} -impl ast::NameOwner for ExternItem {} #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum GenericParam { ConstParam(ConstParam), @@ -1666,6 +1678,17 @@ impl AstNode for Impl { } fn syntax(&self) -> &SyntaxNode { &self.syntax } } +impl AstNode for MacroRules { + fn can_cast(kind: SyntaxKind) -> bool { kind == MACRO_RULES } + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + fn syntax(&self) -> &SyntaxNode { &self.syntax } +} impl AstNode for Module { fn can_cast(kind: SyntaxKind) -> bool { kind == MODULE } fn cast(syntax: SyntaxNode) -> Option { @@ -3060,6 +3083,9 @@ impl From for Item { impl From for Item { fn from(node: MacroCall) -> Item { Item::MacroCall(node) } } +impl From for Item { + fn from(node: MacroRules) -> Item { Item::MacroRules(node) } +} impl From for Item { fn from(node: Module) -> Item { Item::Module(node) } } @@ -3084,8 +3110,8 @@ impl From for Item { impl AstNode for Item { fn can_cast(kind: SyntaxKind) -> bool { match kind { - CONST | ENUM | EXTERN_BLOCK | EXTERN_CRATE | FN | IMPL | MACRO_CALL | MODULE - | STATIC | STRUCT | TRAIT | TYPE_ALIAS | UNION | USE => true, + CONST | ENUM | EXTERN_BLOCK | EXTERN_CRATE | FN | IMPL | MACRO_CALL | MACRO_RULES + | MODULE | STATIC | STRUCT | TRAIT | TYPE_ALIAS | UNION | USE => true, _ => false, } } @@ -3098,6 +3124,7 @@ impl AstNode for Item { FN => Item::Fn(Fn { syntax }), IMPL => Item::Impl(Impl { syntax }), MACRO_CALL => Item::MacroCall(MacroCall { syntax }), + MACRO_RULES => Item::MacroRules(MacroRules { syntax }), MODULE => Item::Module(Module { syntax }), STATIC => Item::Static(Static { syntax }), STRUCT => Item::Struct(Struct { syntax }), @@ -3118,6 +3145,7 @@ impl AstNode for Item { Item::Fn(it) => &it.syntax, Item::Impl(it) => &it.syntax, Item::MacroCall(it) => &it.syntax, + Item::MacroRules(it) => &it.syntax, Item::Module(it) => &it.syntax, Item::Static(it) => &it.syntax, Item::Struct(it) => &it.syntax, @@ -3582,6 +3610,11 @@ impl std::fmt::Display for Impl { std::fmt::Display::fmt(self.syntax(), f) } } +impl std::fmt::Display for MacroRules { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Display::fmt(self.syntax(), f) + } +} impl std::fmt::Display for Module { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { std::fmt::Display::fmt(self.syntax(), f) diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index 820af2d20..c59a29eab 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -382,21 +382,6 @@ impl ast::Visibility { } } -impl ast::MacroCall { - pub fn is_macro_rules(&self) -> Option { - let name_ref = self.path()?.segment()?.name_ref()?; - if name_ref.text() == "macro_rules" { - self.name() - } else { - None - } - } - - pub fn is_bang(&self) -> bool { - self.is_macro_rules().is_none() - } -} - impl ast::LifetimeParam { pub fn lifetime_bounds(&self) -> impl Iterator { self.syntax() @@ -476,5 +461,5 @@ impl ast::DocCommentsOwner for ast::Static {} impl ast::DocCommentsOwner for ast::Const {} impl ast::DocCommentsOwner for ast::TypeAlias {} impl ast::DocCommentsOwner for ast::Impl {} -impl ast::DocCommentsOwner for ast::MacroCall {} +impl ast::DocCommentsOwner for ast::MacroRules {} impl ast::DocCommentsOwner for ast::Use {} diff --git a/crates/syntax/src/display.rs b/crates/syntax/src/display.rs index 8d2c7eae4..d33bde30c 100644 --- a/crates/syntax/src/display.rs +++ b/crates/syntax/src/display.rs @@ -76,7 +76,7 @@ pub fn type_label(node: &ast::TypeAlias) -> String { label.trim().to_owned() } -pub fn macro_label(node: &ast::MacroCall) -> String { +pub fn macro_label(node: &ast::MacroRules) -> String { let name = node.name().map(|name| name.syntax().text().to_string()).unwrap_or_default(); let vis = if node.has_atom_attr("macro_export") { "#[macro_export]\n" } else { "" }; format!("{}macro_rules! {}", vis, name) diff --git a/crates/syntax/src/parsing/text_tree_sink.rs b/crates/syntax/src/parsing/text_tree_sink.rs index 49842177a..ce27c3dd9 100644 --- a/crates/syntax/src/parsing/text_tree_sink.rs +++ b/crates/syntax/src/parsing/text_tree_sink.rs @@ -147,8 +147,8 @@ fn n_attached_trivias<'a>( trivias: impl Iterator, ) -> usize { match kind { - MACRO_CALL | CONST | TYPE_ALIAS | STRUCT | ENUM | VARIANT | FN | TRAIT | MODULE - | RECORD_FIELD | STATIC | USE => { + MACRO_CALL | MACRO_RULES | CONST | TYPE_ALIAS | STRUCT | ENUM | VARIANT | FN | TRAIT + | MODULE | RECORD_FIELD | STATIC | USE => { let mut res = 0; let mut trivias = trivias.enumerate().peekable(); diff --git a/crates/syntax/test_data/parser/err/0002_duplicate_shebang.rast b/crates/syntax/test_data/parser/err/0002_duplicate_shebang.rast index 4cfd1bce4..9ad5b12b8 100644 --- a/crates/syntax/test_data/parser/err/0002_duplicate_shebang.rast +++ b/crates/syntax/test_data/parser/err/0002_duplicate_shebang.rast @@ -17,14 +17,17 @@ SOURCE_FILE@0..42 IDENT@28..31 "bin" ERROR@31..32 SLASH@31..32 "/" - MACRO_CALL@32..41 + MACRO_CALL@32..35 PATH@32..35 PATH_SEGMENT@32..35 NAME_REF@32..35 IDENT@32..35 "env" - WHITESPACE@35..36 " " - NAME@36..41 - IDENT@36..41 "rusti" + WHITESPACE@35..36 " " + MACRO_CALL@36..41 + PATH@36..41 + PATH_SEGMENT@36..41 + NAME_REF@36..41 + IDENT@36..41 "rusti" WHITESPACE@41..42 "\n" error 23..23: expected `[` error 23..23: expected an item @@ -35,5 +38,8 @@ error 31..31: expected `{`, `[`, `(` error 31..31: expected SEMICOLON error 31..31: expected an item error 35..35: expected BANG +error 35..35: expected `{`, `[`, `(` +error 35..35: expected SEMICOLON +error 41..41: expected BANG error 41..41: expected `{`, `[`, `(` error 41..41: expected SEMICOLON diff --git a/crates/syntax/test_data/parser/inline/ok/0062_mod_contents.rast b/crates/syntax/test_data/parser/inline/ok/0062_mod_contents.rast index de8217064..e4fb32de1 100644 --- a/crates/syntax/test_data/parser/inline/ok/0062_mod_contents.rast +++ b/crates/syntax/test_data/parser/inline/ok/0062_mod_contents.rast @@ -12,11 +12,8 @@ SOURCE_FILE@0..70 L_CURLY@9..10 "{" R_CURLY@10..11 "}" WHITESPACE@11..12 "\n" - MACRO_CALL@12..31 - PATH@12..23 - PATH_SEGMENT@12..23 - NAME_REF@12..23 - IDENT@12..23 "macro_rules" + MACRO_RULES@12..31 + MACRO_RULES_KW@12..23 "macro_rules" BANG@23..24 "!" WHITESPACE@24..25 " " NAME@25..28 diff --git a/crates/syntax/test_data/parser/inline/ok/0096_no_semi_after_block.rast b/crates/syntax/test_data/parser/inline/ok/0096_no_semi_after_block.rast index e757249f0..e84b9164f 100644 --- a/crates/syntax/test_data/parser/inline/ok/0096_no_semi_after_block.rast +++ b/crates/syntax/test_data/parser/inline/ok/0096_no_semi_after_block.rast @@ -82,32 +82,28 @@ SOURCE_FILE@0..167 L_CURLY@102..103 "{" R_CURLY@103..104 "}" WHITESPACE@104..109 "\n " - EXPR_STMT@109..152 - MACRO_CALL@109..152 - PATH@109..120 - PATH_SEGMENT@109..120 - NAME_REF@109..120 - IDENT@109..120 "macro_rules" - BANG@120..121 "!" - WHITESPACE@121..122 " " - NAME@122..126 - IDENT@122..126 "test" - WHITESPACE@126..127 " " - TOKEN_TREE@127..152 - L_CURLY@127..128 "{" - WHITESPACE@128..138 "\n " - TOKEN_TREE@138..140 - L_PAREN@138..139 "(" - R_PAREN@139..140 ")" - WHITESPACE@140..141 " " - EQ@141..142 "=" - R_ANGLE@142..143 ">" - WHITESPACE@143..144 " " - TOKEN_TREE@144..146 - L_CURLY@144..145 "{" - R_CURLY@145..146 "}" - WHITESPACE@146..151 "\n " - R_CURLY@151..152 "}" + MACRO_RULES@109..152 + MACRO_RULES_KW@109..120 "macro_rules" + BANG@120..121 "!" + WHITESPACE@121..122 " " + NAME@122..126 + IDENT@122..126 "test" + WHITESPACE@126..127 " " + TOKEN_TREE@127..152 + L_CURLY@127..128 "{" + WHITESPACE@128..138 "\n " + TOKEN_TREE@138..140 + L_PAREN@138..139 "(" + R_PAREN@139..140 ")" + WHITESPACE@140..141 " " + EQ@141..142 "=" + R_ANGLE@142..143 ">" + WHITESPACE@143..144 " " + TOKEN_TREE@144..146 + L_CURLY@144..145 "{" + R_CURLY@145..146 "}" + WHITESPACE@146..151 "\n " + R_CURLY@151..152 "}" WHITESPACE@152..157 "\n " MACRO_CALL@157..164 PATH@157..161 diff --git a/crates/syntax/test_data/parser/inline/ok/0160_try_macro_rules.rast b/crates/syntax/test_data/parser/inline/ok/0160_try_macro_rules.rast index 05b89d1c3..d1c22947b 100644 --- a/crates/syntax/test_data/parser/inline/ok/0160_try_macro_rules.rast +++ b/crates/syntax/test_data/parser/inline/ok/0160_try_macro_rules.rast @@ -1,9 +1,6 @@ SOURCE_FILE@0..30 - MACRO_CALL@0..29 - PATH@0..11 - PATH_SEGMENT@0..11 - NAME_REF@0..11 - IDENT@0..11 "macro_rules" + MACRO_RULES@0..29 + MACRO_RULES_KW@0..11 "macro_rules" BANG@11..12 "!" WHITESPACE@12..13 " " NAME@13..16 diff --git a/crates/syntax/test_data/parser/ok/0053_outer_attribute_on_macro_rules.rast b/crates/syntax/test_data/parser/ok/0053_outer_attribute_on_macro_rules.rast index be60f7a8e..87d8ebcba 100644 --- a/crates/syntax/test_data/parser/ok/0053_outer_attribute_on_macro_rules.rast +++ b/crates/syntax/test_data/parser/ok/0053_outer_attribute_on_macro_rules.rast @@ -1,5 +1,5 @@ SOURCE_FILE@0..65 - MACRO_CALL@0..64 + MACRO_RULES@0..64 COMMENT@0..13 "/// Some docs" WHITESPACE@13..14 "\n" ATTR@14..29 @@ -11,10 +11,7 @@ SOURCE_FILE@0..65 IDENT@16..28 "macro_export" R_BRACK@28..29 "]" WHITESPACE@29..30 "\n" - PATH@30..41 - PATH_SEGMENT@30..41 - NAME_REF@30..41 - IDENT@30..41 "macro_rules" + MACRO_RULES_KW@30..41 "macro_rules" BANG@41..42 "!" WHITESPACE@42..43 " " NAME@43..46 -- cgit v1.2.3 From 479babf8740a4d3cf6fc03a5f4a2fca00d387501 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Tue, 15 Dec 2020 15:37:49 +0100 Subject: Reject visibilities on `macro_rules!` --- crates/syntax/src/validation.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'crates/syntax') diff --git a/crates/syntax/src/validation.rs b/crates/syntax/src/validation.rs index 6f45149bf..2ddaeb176 100644 --- a/crates/syntax/src/validation.rs +++ b/crates/syntax/src/validation.rs @@ -3,7 +3,9 @@ mod block; use crate::{ - algo, ast, match_ast, AstNode, SyntaxError, + algo, + ast::{self, VisibilityOwner}, + match_ast, AstNode, SyntaxError, SyntaxKind::{CONST, FN, INT_NUMBER, TYPE_ALIAS}, SyntaxNode, SyntaxToken, TextSize, T, }; @@ -99,6 +101,7 @@ pub(crate) fn validate(root: &SyntaxNode) -> Vec { ast::RefType(it) => validate_trait_object_ref_ty(it, &mut errors), ast::PtrType(it) => validate_trait_object_ptr_ty(it, &mut errors), ast::FnPtrType(it) => validate_trait_object_fn_ptr_ret_ty(it, &mut errors), + ast::MacroRules(it) => validate_macro_rules(it, &mut errors), _ => (), } } @@ -350,3 +353,12 @@ fn validate_trait_object_ty(ty: ast::DynTraitType) -> Option { } None } + +fn validate_macro_rules(mac: ast::MacroRules, errors: &mut Vec) { + if let Some(vis) = mac.visibility() { + errors.push(SyntaxError::new( + "visibilities are not allowed on `macro_rules!` items", + vis.syntax().text_range(), + )); + } +} -- cgit v1.2.3