|
1 | | -use rustc_hir::attrs::{CoverageAttrKind, OptimizeAttr, RtsanSetting, SanitizerSet, UsedBy}; |
| 1 | +use std::str::FromStr; |
| 2 | + |
| 3 | +use rustc_hir::attrs::{ |
| 4 | + CoverageAttrKind, ExportVisibilityAttrValue, OptimizeAttr, RtsanSetting, SanitizerSet, UsedBy, |
| 5 | +}; |
2 | 6 | use rustc_session::parse::feature_err; |
3 | 7 |
|
4 | 8 | use super::prelude::*; |
5 | 9 | use crate::session_diagnostics::{ |
6 | | - NakedFunctionIncompatibleAttribute, NullOnExport, NullOnObjcClass, NullOnObjcSelector, |
7 | | - ObjcClassExpectedStringLiteral, ObjcSelectorExpectedStringLiteral, |
| 10 | + InvalidExportVisibility, NakedFunctionIncompatibleAttribute, NullOnExport, NullOnObjcClass, |
| 11 | + NullOnObjcSelector, ObjcClassExpectedStringLiteral, ObjcSelectorExpectedStringLiteral, |
8 | 12 | }; |
9 | 13 | use crate::target_checking::Policy::AllowSilent; |
10 | 14 |
|
@@ -153,6 +157,36 @@ impl<S: Stage> SingleAttributeParser<S> for ExportNameParser { |
153 | 157 | } |
154 | 158 | } |
155 | 159 |
|
| 160 | +pub(crate) struct ExportVisibilityParser; |
| 161 | + |
| 162 | +impl<S: Stage> SingleAttributeParser<S> for ExportVisibilityParser { |
| 163 | + const PATH: &[rustc_span::Symbol] = &[sym::export_visibility]; |
| 164 | + const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost; |
| 165 | + const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error; |
| 166 | + const ALLOWED_TARGETS: AllowedTargets = |
| 167 | + AllowedTargets::AllowList(&[Allow(Target::Fn), Allow(Target::Static)]); |
| 168 | + const TEMPLATE: AttributeTemplate = template!(NameValueStr: "visibility"); |
| 169 | + |
| 170 | + fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser) -> Option<AttributeKind> { |
| 171 | + let Some(nv) = args.name_value() else { |
| 172 | + cx.expected_name_value(cx.attr_span, None); |
| 173 | + return None; |
| 174 | + }; |
| 175 | + let Some(sv) = nv.value_as_str() else { |
| 176 | + cx.expected_string_literal(nv.value_span, Some(nv.value_as_lit())); |
| 177 | + return None; |
| 178 | + }; |
| 179 | + let Ok(visibility) = ExportVisibilityAttrValue::from_str(sv.as_str()) else { |
| 180 | + cx.emit_err(InvalidExportVisibility { |
| 181 | + span: nv.value_span, |
| 182 | + unrecognized_visibility: sv.to_string(), |
| 183 | + }); |
| 184 | + return None; |
| 185 | + }; |
| 186 | + Some(AttributeKind::ExportVisibility { visibility, span: cx.attr_span }) |
| 187 | + } |
| 188 | +} |
| 189 | + |
156 | 190 | pub(crate) struct ObjcClassParser; |
157 | 191 |
|
158 | 192 | impl<S: Stage> SingleAttributeParser<S> for ObjcClassParser { |
|
0 commit comments