1
Fork 0

ast: Add span to Extern

This commit is contained in:
Nixon Enraght-Moony 2022-07-02 18:25:55 +01:00
parent 5018181c79
commit 18ca2946e0
10 changed files with 32 additions and 19 deletions

View file

@ -2667,13 +2667,16 @@ impl Item {
#[derive(Clone, Copy, Encodable, Decodable, Debug)] #[derive(Clone, Copy, Encodable, Decodable, Debug)]
pub enum Extern { pub enum Extern {
None, None,
Implicit, Implicit(Span),
Explicit(StrLit), Explicit(StrLit, Span),
} }
impl Extern { impl Extern {
pub fn from_abi(abi: Option<StrLit>) -> Extern { pub fn from_abi(abi: Option<StrLit>, span: Span) -> Extern {
abi.map_or(Extern::Implicit, Extern::Explicit) match abi {
Some(name) => Extern::Explicit(name, span),
None => Extern::Implicit(span),
}
} }
} }

View file

@ -1272,8 +1272,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
pub(super) fn lower_extern(&mut self, ext: Extern) -> abi::Abi { pub(super) fn lower_extern(&mut self, ext: Extern) -> abi::Abi {
match ext { match ext {
Extern::None => abi::Abi::Rust, Extern::None => abi::Abi::Rust,
Extern::Implicit => abi::Abi::FALLBACK, Extern::Implicit(_) => abi::Abi::FALLBACK,
Extern::Explicit(abi) => self.lower_abi(abi), Extern::Explicit(abi, _) => self.lower_abi(abi),
} }
} }

View file

@ -630,7 +630,8 @@ impl<'a> AstValidator<'a> {
match (fk.ctxt(), fk.header()) { match (fk.ctxt(), fk.header()) {
(Some(FnCtxt::Foreign), _) => return, (Some(FnCtxt::Foreign), _) => return,
(Some(FnCtxt::Free), Some(header)) => match header.ext { (Some(FnCtxt::Free), Some(header)) => match header.ext {
Extern::Explicit(StrLit { symbol_unescaped: sym::C, .. }) | Extern::Implicit Extern::Explicit(StrLit { symbol_unescaped: sym::C, .. }, _)
| Extern::Implicit(_)
if matches!(header.unsafety, Unsafe::Yes(_)) => if matches!(header.unsafety, Unsafe::Yes(_)) =>
{ {
return; return;
@ -842,7 +843,7 @@ impl<'a> AstValidator<'a> {
.emit(); .emit();
}); });
self.check_late_bound_lifetime_defs(&bfty.generic_params); self.check_late_bound_lifetime_defs(&bfty.generic_params);
if let Extern::Implicit = bfty.ext { if let Extern::Implicit(_) = bfty.ext {
let sig_span = self.session.source_map().next_point(ty.span.shrink_to_lo()); let sig_span = self.session.source_map().next_point(ty.span.shrink_to_lo());
self.maybe_lint_missing_abi(sig_span, ty.id); self.maybe_lint_missing_abi(sig_span, ty.id);
} }
@ -1556,7 +1557,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
if let FnKind::Fn( if let FnKind::Fn(
_, _,
_, _,
FnSig { span: sig_span, header: FnHeader { ext: Extern::Implicit, .. }, .. }, FnSig { span: sig_span, header: FnHeader { ext: Extern::Implicit(_), .. }, .. },
_, _,
_, _,
_, _,

View file

@ -283,7 +283,7 @@ impl<'a> PostExpansionVisitor<'a> {
} }
fn check_extern(&self, ext: ast::Extern, constness: ast::Const) { fn check_extern(&self, ext: ast::Extern, constness: ast::Const) {
if let ast::Extern::Explicit(abi) = ext { if let ast::Extern::Explicit(abi, _) = ext {
self.check_abi(abi, constness); self.check_abi(abi, constness);
} }
} }

View file

@ -1734,10 +1734,10 @@ impl<'a> State<'a> {
match header.ext { match header.ext {
ast::Extern::None => {} ast::Extern::None => {}
ast::Extern::Implicit => { ast::Extern::Implicit(_) => {
self.word_nbsp("extern"); self.word_nbsp("extern");
} }
ast::Extern::Explicit(abi) => { ast::Extern::Explicit(abi, _) => {
self.word_nbsp("extern"); self.word_nbsp("extern");
self.print_literal(&abi.as_lit()); self.print_literal(&abi.as_lit());
self.nbsp(); self.nbsp();

View file

@ -1353,7 +1353,16 @@ impl<'a> Parser<'a> {
/// Parses `extern string_literal?`. /// Parses `extern string_literal?`.
fn parse_extern(&mut self) -> Extern { fn parse_extern(&mut self) -> Extern {
if self.eat_keyword(kw::Extern) { Extern::from_abi(self.parse_abi()) } else { Extern::None } if self.eat_keyword(kw::Extern) {
let mut extern_span = self.prev_token.span;
let abi = self.parse_abi();
if let Some(abi) = abi {
extern_span = extern_span.to(abi.span);
}
Extern::from_abi(abi, extern_span)
} else {
Extern::None
}
} }
/// Parses a string literal as an ABI spec. /// Parses a string literal as an ABI spec.

View file

@ -94,7 +94,7 @@ impl ExcessiveBools {
fn check_fn_sig(&self, cx: &EarlyContext<'_>, fn_sig: &FnSig, span: Span) { fn check_fn_sig(&self, cx: &EarlyContext<'_>, fn_sig: &FnSig, span: Span) {
match fn_sig.header.ext { match fn_sig.header.ext {
Extern::Implicit | Extern::Explicit(_) => return, Extern::Implicit(_) | Extern::Explicit(_, _) => return,
Extern::None => (), Extern::None => (),
} }

View file

@ -600,8 +600,8 @@ pub fn eq_ty(l: &Ty, r: &Ty) -> bool {
pub fn eq_ext(l: &Extern, r: &Extern) -> bool { pub fn eq_ext(l: &Extern, r: &Extern) -> bool {
use Extern::*; use Extern::*;
match (l, r) { match (l, r) {
(None, None) | (Implicit, Implicit) => true, (None, None) | (Implicit(_), Implicit(_)) => true,
(Explicit(l), Explicit(r)) => eq_str_lit(l, r), (Explicit(l,_), Explicit(r,_)) => eq_str_lit(l, r),
_ => false, _ => false,
} }
} }

View file

@ -148,7 +148,7 @@ impl<'a> Item<'a> {
Item { Item {
unsafety: fm.unsafety, unsafety: fm.unsafety,
abi: format_extern( abi: format_extern(
ast::Extern::from_abi(fm.abi), ast::Extern::from_abi(fm.abi, DUMMY_SP),
config.force_explicit_abi(), config.force_explicit_abi(),
true, true,
), ),

View file

@ -138,8 +138,8 @@ pub(crate) fn format_extern(
) -> Cow<'static, str> { ) -> Cow<'static, str> {
let abi = match ext { let abi = match ext {
ast::Extern::None => "Rust".to_owned(), ast::Extern::None => "Rust".to_owned(),
ast::Extern::Implicit => "C".to_owned(), ast::Extern::Implicit(_) => "C".to_owned(),
ast::Extern::Explicit(abi) => abi.symbol_unescaped.to_string(), ast::Extern::Explicit(abi, _) => abi.symbol_unescaped.to_string(),
}; };
if abi == "Rust" && !is_mod { if abi == "Rust" && !is_mod {