|
1 | | -use rustc_hir::attrs::{CoverageAttrKind, OptimizeAttr, RtsanSetting, SanitizerSet, UsedBy}; |
| 1 | +use rustc_hir::attrs::{ |
| 2 | + CoverageAttrKind, ExportVisibilityAttrValue, OptimizeAttr, RtsanSetting, SanitizerSet, UsedBy, |
| 3 | +}; |
2 | 4 | use rustc_session::parse::feature_err; |
3 | 5 |
|
4 | 6 | use super::prelude::*; |
@@ -153,6 +155,43 @@ impl<S: Stage> SingleAttributeParser<S> for ExportNameParser { |
153 | 155 | } |
154 | 156 | } |
155 | 157 |
|
| 158 | +pub(crate) struct ExportVisibilityParser; |
| 159 | + |
| 160 | +impl<S: Stage> SingleAttributeParser<S> for ExportVisibilityParser { |
| 161 | + const PATH: &[rustc_span::Symbol] = &[sym::export_visibility]; |
| 162 | + const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost; |
| 163 | + const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error; |
| 164 | + const ALLOWED_TARGETS: AllowedTargets = |
| 165 | + AllowedTargets::AllowList(&[Allow(Target::Fn), Allow(Target::Static)]); |
| 166 | + const TEMPLATE: AttributeTemplate = template!(NameValueStr: "visibility"); |
| 167 | + |
| 168 | + fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser) -> Option<AttributeKind> { |
| 169 | + let Some(nv) = args.name_value() else { |
| 170 | + cx.expected_name_value(cx.attr_span, None); |
| 171 | + return None; |
| 172 | + }; |
| 173 | + let Some(sv) = nv.value_as_str() else { |
| 174 | + cx.expected_string_literal(nv.value_span, Some(nv.value_as_lit())); |
| 175 | + return None; |
| 176 | + }; |
| 177 | + |
| 178 | + let str_to_visibility = [("target_default", ExportVisibilityAttrValue::TargetDefault)]; |
| 179 | + for &(s, visibility) in str_to_visibility.iter() { |
| 180 | + if s == sv.as_str() { |
| 181 | + return Some(AttributeKind::ExportVisibility { visibility, span: cx.attr_span }); |
| 182 | + } |
| 183 | + } |
| 184 | + |
| 185 | + let allowed_str_values = str_to_visibility |
| 186 | + .into_iter() |
| 187 | + .map(|(s, _visibility)| s) |
| 188 | + .map(Symbol::intern) |
| 189 | + .collect::<Vec<_>>(); |
| 190 | + cx.expected_specific_argument_strings(nv.value_span, &allowed_str_values); |
| 191 | + None |
| 192 | + } |
| 193 | +} |
| 194 | + |
156 | 195 | pub(crate) struct RustcObjcClassParser; |
157 | 196 |
|
158 | 197 | impl<S: Stage> SingleAttributeParser<S> for RustcObjcClassParser { |
|
0 commit comments