diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-07-06 22:14:36 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-07-06 22:14:36 +0200 |
| commit | 154726cf7d92e72e3386e056cf0ec61902f342cd (patch) | |
| tree | ca6f86597bba6e1af5d32b07a2fbc525a8cf88ac /src/libsyntax | |
| parent | 296e825afab8665dfc5527aa8f72dfe5f5894224 (diff) | |
| parent | 327450797d460ae011eaaba68fae356117ab883d (diff) | |
| download | rust-154726cf7d92e72e3386e056cf0ec61902f342cd.tar.gz rust-154726cf7d92e72e3386e056cf0ec61902f342cd.zip | |
Rollup merge of #62243 - petrochenkov:macrodoc, r=eddyb
Improve documentation for built-in macros This is the `libcore` part of https://github.com/rust-lang/rust/pull/62086. Right now the only effect is improved documentation. The changes in the last few commits are required to make the `libcore` change compile successfully.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/attr/builtin.rs | 33 | ||||
| -rw-r--r-- | src/libsyntax/attr/mod.rs | 6 | ||||
| -rw-r--r-- | src/libsyntax/ext/tt/macro_rules.rs | 23 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 8 |
4 files changed, 53 insertions, 17 deletions
diff --git a/src/libsyntax/attr/builtin.rs b/src/libsyntax/attr/builtin.rs index bf6eab4ec91..752ab5d474d 100644 --- a/src/libsyntax/attr/builtin.rs +++ b/src/libsyntax/attr/builtin.rs @@ -5,6 +5,7 @@ use crate::feature_gate::{Features, GatedCfg}; use crate::parse::ParseSess; use errors::{Applicability, Handler}; +use syntax_pos::hygiene::Transparency; use syntax_pos::{symbol::Symbol, symbol::sym, Span}; use super::{mark_used, MetaItemKind}; @@ -854,3 +855,35 @@ fn int_type_of_word(s: Symbol) -> Option<IntType> { _ => None } } + +pub enum TransparencyError { + UnknownTransparency(Symbol, Span), + MultipleTransparencyAttrs(Span, Span), +} + +pub fn find_transparency( + attrs: &[Attribute], is_legacy: bool +) -> (Transparency, Option<TransparencyError>) { + let mut transparency = None; + let mut error = None; + for attr in attrs { + if attr.check_name(sym::rustc_macro_transparency) { + if let Some((_, old_span)) = transparency { + error = Some(TransparencyError::MultipleTransparencyAttrs(old_span, attr.span)); + break; + } else if let Some(value) = attr.value_str() { + transparency = Some((match &*value.as_str() { + "transparent" => Transparency::Transparent, + "semitransparent" => Transparency::SemiTransparent, + "opaque" => Transparency::Opaque, + _ => { + error = Some(TransparencyError::UnknownTransparency(value, attr.span)); + continue; + } + }, attr.span)); + } + } + } + let fallback = if is_legacy { Transparency::SemiTransparent } else { Transparency::Opaque }; + (transparency.map_or(fallback, |t| t.0), error) +} diff --git a/src/libsyntax/attr/mod.rs b/src/libsyntax/attr/mod.rs index a0c298010b6..a9f2429560a 100644 --- a/src/libsyntax/attr/mod.rs +++ b/src/libsyntax/attr/mod.rs @@ -2,11 +2,7 @@ mod builtin; -pub use builtin::{ - cfg_matches, contains_feature_attr, eval_condition, find_crate_name, find_deprecation, - find_repr_attrs, find_stability, find_unwind_attr, Deprecation, InlineAttr, OptimizeAttr, - IntType, ReprAttr, RustcDeprecation, Stability, StabilityLevel, UnwindAttr, -}; +pub use builtin::*; pub use IntType::*; pub use ReprAttr::*; pub use StabilityLevel::*; diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index 1a448cb2a43..cf3c748cd82 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -2,7 +2,6 @@ use crate::edition::Edition; use crate::ext::base::{DummyResult, ExtCtxt, MacResult, TTMacroExpander}; use crate::ext::base::{SyntaxExtension, SyntaxExtensionKind}; use crate::ext::expand::{AstFragment, AstFragmentKind}; -use crate::ext::hygiene::Transparency; use crate::ext::tt::macro_parser::{parse, parse_failure_msg}; use crate::ext::tt::macro_parser::{Error, Failure, Success}; use crate::ext::tt::macro_parser::{MatchedNonterminal, MatchedSeq}; @@ -15,7 +14,7 @@ use crate::parse::token::{self, NtTT, Token}; use crate::parse::{Directory, ParseSess}; use crate::symbol::{kw, sym, Symbol}; use crate::tokenstream::{DelimSpan, TokenStream, TokenTree}; -use crate::{ast, attr}; +use crate::{ast, attr, attr::TransparencyError}; use errors::FatalError; use log::debug; @@ -380,13 +379,19 @@ pub fn compile( let expander: Box<_> = Box::new(MacroRulesMacroExpander { name: def.ident, lhses, rhses, valid }); - let default_transparency = if attr::contains_name(&def.attrs, sym::rustc_transparent_macro) { - Transparency::Transparent - } else if body.legacy { - Transparency::SemiTransparent - } else { - Transparency::Opaque - }; + let (default_transparency, transparency_error) = + attr::find_transparency(&def.attrs, body.legacy); + match transparency_error { + Some(TransparencyError::UnknownTransparency(value, span)) => + sess.span_diagnostic.span_err( + span, &format!("unknown macro transparency: `{}`", value) + ), + Some(TransparencyError::MultipleTransparencyAttrs(old_span, new_span)) => + sess.span_diagnostic.span_err( + vec![old_span, new_span], "multiple macro transparency attributes" + ), + None => {} + } let allow_internal_unstable = attr::find_by_name(&def.attrs, sym::allow_internal_unstable).map(|attr| { diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index e1e39faaad4..2b242a71ad4 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -245,7 +245,7 @@ declare_features! ( (active, allocator_internals, "1.20.0", None, None), // Allows using the `format_args_nl` macro. - (active, format_args_nl, "1.29.0", None, None), + (active, format_args_nl, "1.29.0", Some(0), None), // no-tracking-issue-end @@ -1313,7 +1313,9 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ "the `#[rustc_test_marker]` attribute \ is used internally to track tests", cfg_fn!(rustc_attrs))), - (sym::rustc_transparent_macro, Whitelisted, template!(Word), Gated(Stability::Unstable, + (sym::rustc_macro_transparency, Whitelisted, template!(NameValueStr: + "transparent|semitransparent|opaque"), + Gated(Stability::Unstable, sym::rustc_attrs, "used internally for testing macro hygiene", cfg_fn!(rustc_attrs))), @@ -1374,7 +1376,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ "internal implementation detail", cfg_fn!(rustc_attrs))), - (sym::rustc_doc_only_macro, Whitelisted, template!(Word), Gated(Stability::Unstable, + (sym::rustc_builtin_macro, Whitelisted, template!(Word), Gated(Stability::Unstable, sym::rustc_attrs, "internal implementation detail", cfg_fn!(rustc_attrs))), |
