Skip to content

Commit 18ca294

Browse files
committed
ast: Add span to Extern
1 parent 5018181 commit 18ca294

File tree

10 files changed

+32
-19
lines changed

10 files changed

+32
-19
lines changed

Diff for: compiler/rustc_ast/src/ast.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -2667,13 +2667,16 @@ impl Item {
26672667
#[derive(Clone, Copy, Encodable, Decodable, Debug)]
26682668
pub enum Extern {
26692669
None,
2670-
Implicit,
2671-
Explicit(StrLit),
2670+
Implicit(Span),
2671+
Explicit(StrLit, Span),
26722672
}
26732673

26742674
impl Extern {
2675-
pub fn from_abi(abi: Option<StrLit>) -> Extern {
2676-
abi.map_or(Extern::Implicit, Extern::Explicit)
2675+
pub fn from_abi(abi: Option<StrLit>, span: Span) -> Extern {
2676+
match abi {
2677+
Some(name) => Extern::Explicit(name, span),
2678+
None => Extern::Implicit(span),
2679+
}
26772680
}
26782681
}
26792682

Diff for: compiler/rustc_ast_lowering/src/item.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1272,8 +1272,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
12721272
pub(super) fn lower_extern(&mut self, ext: Extern) -> abi::Abi {
12731273
match ext {
12741274
Extern::None => abi::Abi::Rust,
1275-
Extern::Implicit => abi::Abi::FALLBACK,
1276-
Extern::Explicit(abi) => self.lower_abi(abi),
1275+
Extern::Implicit(_) => abi::Abi::FALLBACK,
1276+
Extern::Explicit(abi, _) => self.lower_abi(abi),
12771277
}
12781278
}
12791279

Diff for: compiler/rustc_ast_passes/src/ast_validation.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,8 @@ impl<'a> AstValidator<'a> {
630630
match (fk.ctxt(), fk.header()) {
631631
(Some(FnCtxt::Foreign), _) => return,
632632
(Some(FnCtxt::Free), Some(header)) => match header.ext {
633-
Extern::Explicit(StrLit { symbol_unescaped: sym::C, .. }) | Extern::Implicit
633+
Extern::Explicit(StrLit { symbol_unescaped: sym::C, .. }, _)
634+
| Extern::Implicit(_)
634635
if matches!(header.unsafety, Unsafe::Yes(_)) =>
635636
{
636637
return;
@@ -842,7 +843,7 @@ impl<'a> AstValidator<'a> {
842843
.emit();
843844
});
844845
self.check_late_bound_lifetime_defs(&bfty.generic_params);
845-
if let Extern::Implicit = bfty.ext {
846+
if let Extern::Implicit(_) = bfty.ext {
846847
let sig_span = self.session.source_map().next_point(ty.span.shrink_to_lo());
847848
self.maybe_lint_missing_abi(sig_span, ty.id);
848849
}
@@ -1556,7 +1557,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
15561557
if let FnKind::Fn(
15571558
_,
15581559
_,
1559-
FnSig { span: sig_span, header: FnHeader { ext: Extern::Implicit, .. }, .. },
1560+
FnSig { span: sig_span, header: FnHeader { ext: Extern::Implicit(_), .. }, .. },
15601561
_,
15611562
_,
15621563
_,

Diff for: compiler/rustc_ast_passes/src/feature_gate.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ impl<'a> PostExpansionVisitor<'a> {
283283
}
284284

285285
fn check_extern(&self, ext: ast::Extern, constness: ast::Const) {
286-
if let ast::Extern::Explicit(abi) = ext {
286+
if let ast::Extern::Explicit(abi, _) = ext {
287287
self.check_abi(abi, constness);
288288
}
289289
}

Diff for: compiler/rustc_ast_pretty/src/pprust/state.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1734,10 +1734,10 @@ impl<'a> State<'a> {
17341734

17351735
match header.ext {
17361736
ast::Extern::None => {}
1737-
ast::Extern::Implicit => {
1737+
ast::Extern::Implicit(_) => {
17381738
self.word_nbsp("extern");
17391739
}
1740-
ast::Extern::Explicit(abi) => {
1740+
ast::Extern::Explicit(abi, _) => {
17411741
self.word_nbsp("extern");
17421742
self.print_literal(&abi.as_lit());
17431743
self.nbsp();

Diff for: compiler/rustc_parse/src/parser/mod.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -1353,7 +1353,16 @@ impl<'a> Parser<'a> {
13531353

13541354
/// Parses `extern string_literal?`.
13551355
fn parse_extern(&mut self) -> Extern {
1356-
if self.eat_keyword(kw::Extern) { Extern::from_abi(self.parse_abi()) } else { Extern::None }
1356+
if self.eat_keyword(kw::Extern) {
1357+
let mut extern_span = self.prev_token.span;
1358+
let abi = self.parse_abi();
1359+
if let Some(abi) = abi {
1360+
extern_span = extern_span.to(abi.span);
1361+
}
1362+
Extern::from_abi(abi, extern_span)
1363+
} else {
1364+
Extern::None
1365+
}
13571366
}
13581367

13591368
/// Parses a string literal as an ABI spec.

Diff for: src/tools/clippy/clippy_lints/src/excessive_bools.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ impl ExcessiveBools {
9494

9595
fn check_fn_sig(&self, cx: &EarlyContext<'_>, fn_sig: &FnSig, span: Span) {
9696
match fn_sig.header.ext {
97-
Extern::Implicit | Extern::Explicit(_) => return,
97+
Extern::Implicit(_) | Extern::Explicit(_, _) => return,
9898
Extern::None => (),
9999
}
100100

Diff for: src/tools/clippy/clippy_utils/src/ast_utils.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -600,8 +600,8 @@ pub fn eq_ty(l: &Ty, r: &Ty) -> bool {
600600
pub fn eq_ext(l: &Extern, r: &Extern) -> bool {
601601
use Extern::*;
602602
match (l, r) {
603-
(None, None) | (Implicit, Implicit) => true,
604-
(Explicit(l), Explicit(r)) => eq_str_lit(l, r),
603+
(None, None) | (Implicit(_), Implicit(_)) => true,
604+
(Explicit(l,_), Explicit(r,_)) => eq_str_lit(l, r),
605605
_ => false,
606606
}
607607
}

Diff for: src/tools/rustfmt/src/items.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ impl<'a> Item<'a> {
148148
Item {
149149
unsafety: fm.unsafety,
150150
abi: format_extern(
151-
ast::Extern::from_abi(fm.abi),
151+
ast::Extern::from_abi(fm.abi, DUMMY_SP),
152152
config.force_explicit_abi(),
153153
true,
154154
),

Diff for: src/tools/rustfmt/src/utils.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,8 @@ pub(crate) fn format_extern(
138138
) -> Cow<'static, str> {
139139
let abi = match ext {
140140
ast::Extern::None => "Rust".to_owned(),
141-
ast::Extern::Implicit => "C".to_owned(),
142-
ast::Extern::Explicit(abi) => abi.symbol_unescaped.to_string(),
141+
ast::Extern::Implicit(_) => "C".to_owned(),
142+
ast::Extern::Explicit(abi, _) => abi.symbol_unescaped.to_string(),
143143
};
144144

145145
if abi == "Rust" && !is_mod {

0 commit comments

Comments
 (0)