From a2489495d909c43cfbefaeb79db6a77b13908257 Mon Sep 17 00:00:00 2001 From: Daniel Keep Date: Mon, 25 Apr 2016 02:04:01 +1000 Subject: Implementation of the `vis` macro matcher. --- src/libsyntax/parse/token.rs | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/libsyntax/parse') diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 74aa3984a9a..513aa866043 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -371,6 +371,7 @@ pub enum Nonterminal { NtGenerics(ast::Generics), NtWhereClause(ast::WhereClause), NtArg(ast::Arg), + NtVis(ast::Visibility), } impl fmt::Debug for Nonterminal { @@ -392,6 +393,7 @@ impl fmt::Debug for Nonterminal { NtGenerics(..) => f.pad("NtGenerics(..)"), NtWhereClause(..) => f.pad("NtWhereClause(..)"), NtArg(..) => f.pad("NtArg(..)"), + NtVis(..) => f.pad("NtVis(..)"), } } } -- cgit 1.4.1-3-g733a5 From d53e413e04e438fd0dc1a8b1a8dcb07a0774092a Mon Sep 17 00:00:00 2001 From: Alex Burka Date: Sun, 2 Apr 2017 04:21:12 +0000 Subject: update :vis implementation to current rust --- src/libsyntax/ext/tt/macro_rules.rs | 12 ++++++------ src/libsyntax/parse/parser.rs | 2 +- src/test/run-pass/macro-pub-matcher.rs | 19 +++++++++---------- 3 files changed, 16 insertions(+), 17 deletions(-) (limited to 'src/libsyntax/parse') diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index 4e197a85ebd..f888e29bdab 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -793,13 +793,13 @@ fn is_in_follow(tok: "ed::TokenTree, frag: &str) -> Result { // Explicitly disallow `priv`, on the off chance it comes back. match *tok { - Comma => Ok(true), - ModSep => Ok(true), - MatchNt(_, ref frag, _, _) => { - let name = frag.name.as_str(); - Ok(name == "ident" || name == "ty") + TokenTree::Token(_, ref tok) => match *tok { + Comma => Ok(true), + ModSep => Ok(true), + Ident(i) if i.name != "priv" => Ok(true), + _ => Ok(false) }, - Ident(i, _) if i.name.as_str() != "priv" => Ok(true), + TokenTree::MetaVarDecl(_, _, frag) if frag.name =="ident" || frag.name == "ty" => Ok(true), _ => Ok(false) } }, diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 3b928ea93c7..11becd58293 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -5056,7 +5056,7 @@ impl<'a> Parser<'a> { /// and `pub(super)` for `pub(in super)`. If the following element can't be a tuple (i.e. it's /// a function definition, it's not a tuple struct field) and the contents within the parens /// isn't valid, emit a proper diagnostic. - fn parse_visibility(&mut self, can_take_tuple: bool) -> PResult<'a, Visibility> { + pub fn parse_visibility(&mut self, can_take_tuple: bool) -> PResult<'a, Visibility> { if !self.eat_keyword(keywords::Pub) { return Ok(Visibility::Inherited) } diff --git a/src/test/run-pass/macro-pub-matcher.rs b/src/test/run-pass/macro-pub-matcher.rs index 64fa0bef464..7de9cc6bf21 100644 --- a/src/test/run-pass/macro-pub-matcher.rs +++ b/src/test/run-pass/macro-pub-matcher.rs @@ -1,5 +1,4 @@ #![allow(dead_code, unused_imports)] -#![feature(pub_restricted)] /** Ensure that `:vis` matches can be captured in existing positions, and passed @@ -56,15 +55,15 @@ mod with_pub_restricted { mod garden { mod with_pub_restricted_path { - vis_passthru! { pub(::garden) const A: i32 = 0; } - vis_passthru! { pub(::garden) enum B {} } - vis_passthru! { pub(::garden) extern "C" fn c() {} } - vis_passthru! { pub(::garden) mod d {} } - vis_passthru! { pub(::garden) static E: i32 = 0; } - vis_passthru! { pub(::garden) struct F; } - vis_passthru! { pub(::garden) trait G {} } - vis_passthru! { pub(::garden) type H = i32; } - vis_passthru! { pub(::garden) use A as I; } + vis_passthru! { pub(in garden) const A: i32 = 0; } + vis_passthru! { pub(in garden) enum B {} } + vis_passthru! { pub(in garden) extern "C" fn c() {} } + vis_passthru! { pub(in garden) mod d {} } + vis_passthru! { pub(in garden) static E: i32 = 0; } + vis_passthru! { pub(in garden) struct F; } + vis_passthru! { pub(in garden) trait G {} } + vis_passthru! { pub(in garden) type H = i32; } + vis_passthru! { pub(in garden) use A as I; } } } -- cgit 1.4.1-3-g733a5 From 16010c2f50dd92cc57ccced270a9fb727d6d4883 Mon Sep 17 00:00:00 2001 From: Alex Burka Date: Sun, 2 Apr 2017 04:46:51 +0000 Subject: parse interpolated visibility tokens --- src/libsyntax/ext/tt/macro_rules.rs | 3 ++- src/libsyntax/parse/parser.rs | 2 ++ src/test/run-pass/macro-pub-matcher.rs | 16 ++++++++++++++-- 3 files changed, 18 insertions(+), 3 deletions(-) (limited to 'src/libsyntax/parse') diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index f888e29bdab..84c909284a8 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -799,7 +799,8 @@ fn is_in_follow(tok: "ed::TokenTree, frag: &str) -> Result Ok(true), _ => Ok(false) }, - TokenTree::MetaVarDecl(_, _, frag) if frag.name =="ident" || frag.name == "ty" => Ok(true), + TokenTree::MetaVarDecl(_, _, frag) + if frag.name =="ident" || frag.name == "ty" => Ok(true), _ => Ok(false) } }, diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 11becd58293..31669e1bbe3 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -5057,6 +5057,8 @@ impl<'a> Parser<'a> { /// a function definition, it's not a tuple struct field) and the contents within the parens /// isn't valid, emit a proper diagnostic. pub fn parse_visibility(&mut self, can_take_tuple: bool) -> PResult<'a, Visibility> { + maybe_whole!(self, NtVis, |x| x); + if !self.eat_keyword(keywords::Pub) { return Ok(Visibility::Inherited) } diff --git a/src/test/run-pass/macro-pub-matcher.rs b/src/test/run-pass/macro-pub-matcher.rs index 7de9cc6bf21..d5b25e6cdf2 100644 --- a/src/test/run-pass/macro-pub-matcher.rs +++ b/src/test/run-pass/macro-pub-matcher.rs @@ -1,3 +1,13 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + #![allow(dead_code, unused_imports)] /** @@ -96,11 +106,13 @@ macro_rules! vis_parse_struct { vis_parse_struct! { @parse_tuple $(#[$($attrs)*])*, , $name, $($body)* } }; - (@parse_fields $(#[$attrs:meta])*, $vis:vis, $name:ident, $($fvis:vis $fname:ident: $fty:ty),* $(,)*) => { + (@parse_fields + $(#[$attrs:meta])*, $vis:vis, $name:ident, $($fvis:vis $fname:ident: $fty:ty),* $(,)*) => { $(#[$attrs])* $vis struct $name { $($fvis $fname: $fty,)* } }; - (@parse_tuple $(#[$attrs:meta])*, $vis:vis, $name:ident, $($fvis:vis $fty:ty),* $(,)*) => { + (@parse_tuple + $(#[$attrs:meta])*, $vis:vis, $name:ident, $($fvis:vis $fty:ty),* $(,)*) => { $(#[$attrs])* $vis struct $name ( $($fvis $fty,)* ); }; } -- cgit 1.4.1-3-g733a5 From 06d32335e893a1b5af5dd3f6a8a53dcae266a016 Mon Sep 17 00:00:00 2001 From: Alex Burka Date: Sun, 2 Apr 2017 18:34:38 +0000 Subject: move NtVis enum variant to stave off comment rot --- src/libsyntax/parse/token.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/libsyntax/parse') diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 513aa866043..25cabef70c1 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -363,6 +363,7 @@ pub enum Nonterminal { /// Stuff inside brackets for attributes NtMeta(ast::MetaItem), NtPath(ast::Path), + NtVis(ast::Visibility), NtTT(TokenTree), // These are not exposed to macros, but are used by quasiquote. NtArm(ast::Arm), @@ -371,7 +372,6 @@ pub enum Nonterminal { NtGenerics(ast::Generics), NtWhereClause(ast::WhereClause), NtArg(ast::Arg), - NtVis(ast::Visibility), } impl fmt::Debug for Nonterminal { -- cgit 1.4.1-3-g733a5