diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-06-30 01:12:04 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-07-06 16:59:08 +0300 |
| commit | 920a17a60c13101225a3a50e232c3e44017dab69 (patch) | |
| tree | 55a768d2cdeb54ac669325d596aca5bc9af18aa1 /src/libsyntax/attr | |
| parent | 987be89db32b37954bd34dcfbf3d381b24eabd35 (diff) | |
| download | rust-920a17a60c13101225a3a50e232c3e44017dab69.tar.gz rust-920a17a60c13101225a3a50e232c3e44017dab69.zip | |
privacy: Only opaque macros leak private things
Diffstat (limited to 'src/libsyntax/attr')
| -rw-r--r-- | src/libsyntax/attr/builtin.rs | 33 | ||||
| -rw-r--r-- | src/libsyntax/attr/mod.rs | 6 |
2 files changed, 34 insertions, 5 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::*; |
