Skip to content

Commit cabf10d

Browse files
committed
Add StaticForeignItem and use it on ForeignItemKind
1 parent cd90d5c commit cabf10d

File tree

8 files changed

+61
-26
lines changed

8 files changed

+61
-26
lines changed

compiler/rustc_ast/src/ast.rs

+36-7
Original file line numberDiff line numberDiff line change
@@ -3123,6 +3123,35 @@ pub struct StaticItem {
31233123
pub expr: Option<P<Expr>>,
31243124
}
31253125

3126+
/// A static item in `extern` block.
3127+
// This struct is identical to StaticItem for now but it's going to have a safety attribute.
3128+
#[derive(Clone, Encodable, Decodable, Debug)]
3129+
pub struct StaticForeignItem {
3130+
pub ty: P<Ty>,
3131+
pub mutability: Mutability,
3132+
pub expr: Option<P<Expr>>,
3133+
}
3134+
3135+
impl From<StaticItem> for StaticForeignItem {
3136+
fn from(static_item: StaticItem) -> StaticForeignItem {
3137+
StaticForeignItem {
3138+
ty: static_item.ty,
3139+
mutability: static_item.mutability,
3140+
expr: static_item.expr,
3141+
}
3142+
}
3143+
}
3144+
3145+
impl From<StaticForeignItem> for StaticItem {
3146+
fn from(static_item: StaticForeignItem) -> StaticItem {
3147+
StaticItem {
3148+
ty: static_item.ty,
3149+
mutability: static_item.mutability,
3150+
expr: static_item.expr,
3151+
}
3152+
}
3153+
}
3154+
31263155
#[derive(Clone, Encodable, Decodable, Debug)]
31273156
pub struct ConstItem {
31283157
pub defaultness: Defaultness,
@@ -3326,7 +3355,7 @@ impl TryFrom<ItemKind> for AssocItemKind {
33263355
#[derive(Clone, Encodable, Decodable, Debug)]
33273356
pub enum ForeignItemKind {
33283357
/// A foreign static item (`static FOO: u8`).
3329-
Static(P<Ty>, Mutability, Option<P<Expr>>),
3358+
Static(Box<StaticForeignItem>),
33303359
/// An foreign function.
33313360
Fn(Box<Fn>),
33323361
/// An foreign type.
@@ -3338,8 +3367,8 @@ pub enum ForeignItemKind {
33383367
impl From<ForeignItemKind> for ItemKind {
33393368
fn from(foreign_item_kind: ForeignItemKind) -> ItemKind {
33403369
match foreign_item_kind {
3341-
ForeignItemKind::Static(a, b, c) => {
3342-
ItemKind::Static(StaticItem { ty: a, mutability: b, expr: c }.into())
3370+
ForeignItemKind::Static(box static_foreign_item) => {
3371+
ItemKind::Static(Box::new(static_foreign_item.into()))
33433372
}
33443373
ForeignItemKind::Fn(fn_kind) => ItemKind::Fn(fn_kind),
33453374
ForeignItemKind::TyAlias(ty_alias_kind) => ItemKind::TyAlias(ty_alias_kind),
@@ -3353,8 +3382,8 @@ impl TryFrom<ItemKind> for ForeignItemKind {
33533382

33543383
fn try_from(item_kind: ItemKind) -> Result<ForeignItemKind, ItemKind> {
33553384
Ok(match item_kind {
3356-
ItemKind::Static(box StaticItem { ty: a, mutability: b, expr: c }) => {
3357-
ForeignItemKind::Static(a, b, c)
3385+
ItemKind::Static(box static_item) => {
3386+
ForeignItemKind::Static(Box::new(static_item.into()))
33583387
}
33593388
ItemKind::Fn(fn_kind) => ForeignItemKind::Fn(fn_kind),
33603389
ItemKind::TyAlias(ty_alias_kind) => ForeignItemKind::TyAlias(ty_alias_kind),
@@ -3379,8 +3408,8 @@ mod size_asserts {
33793408
static_assert_size!(Expr, 72);
33803409
static_assert_size!(ExprKind, 40);
33813410
static_assert_size!(Fn, 160);
3382-
static_assert_size!(ForeignItem, 96);
3383-
static_assert_size!(ForeignItemKind, 24);
3411+
static_assert_size!(ForeignItem, 88);
3412+
static_assert_size!(ForeignItemKind, 16);
33843413
static_assert_size!(GenericArg, 24);
33853414
static_assert_size!(GenericBound, 88);
33863415
static_assert_size!(Generics, 40);

compiler/rustc_ast/src/mut_visit.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1263,7 +1263,7 @@ pub fn noop_flat_map_foreign_item<T: MutVisitor>(
12631263
visitor.visit_vis(vis);
12641264
visit_attrs(attrs, visitor);
12651265
match kind {
1266-
ForeignItemKind::Static(ty, _, expr) => {
1266+
ForeignItemKind::Static(box StaticForeignItem { ty, mutability: _, expr }) => {
12671267
visitor.visit_ty(ty);
12681268
visit_opt(expr, |expr| visitor.visit_expr(expr));
12691269
}

compiler/rustc_ast/src/visit.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ pub fn walk_foreign_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a ForeignI
618618
try_visit!(visitor.visit_ident(ident));
619619
walk_list!(visitor, visit_attribute, attrs);
620620
match kind {
621-
ForeignItemKind::Static(ty, _, expr) => {
621+
ForeignItemKind::Static(box StaticForeignItem { ty, mutability: _, expr }) => {
622622
try_visit!(visitor.visit_ty(ty));
623623
visit_opt!(visitor, visit_expr, expr);
624624
}

compiler/rustc_ast_lowering/src/item.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -662,10 +662,10 @@ impl<'hir> LoweringContext<'_, 'hir> {
662662

663663
hir::ForeignItemKind::Fn(fn_dec, fn_args, generics)
664664
}
665-
ForeignItemKind::Static(t, m, _) => {
666-
let ty =
667-
self.lower_ty(t, ImplTraitContext::Disallowed(ImplTraitPosition::StaticTy));
668-
hir::ForeignItemKind::Static(ty, *m)
665+
ForeignItemKind::Static(box StaticForeignItem { ty, mutability, expr: _ }) => {
666+
let ty = self
667+
.lower_ty(ty, ImplTraitContext::Disallowed(ImplTraitPosition::StaticTy));
668+
hir::ForeignItemKind::Static(ty, *mutability)
669669
}
670670
ForeignItemKind::TyAlias(..) => hir::ForeignItemKind::Type,
671671
ForeignItemKind::MacCall(_) => panic!("macro shouldn't exist here"),

compiler/rustc_ast_passes/src/ast_validation.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1185,8 +1185,8 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
11851185
self.check_foreign_ty_genericless(generics, where_clauses);
11861186
self.check_foreign_item_ascii_only(fi.ident);
11871187
}
1188-
ForeignItemKind::Static(_, _, body) => {
1189-
self.check_foreign_kind_bodyless(fi.ident, "static", body.as_ref().map(|b| b.span));
1188+
ForeignItemKind::Static(box StaticForeignItem { ty: _, mutability: _, expr }) => {
1189+
self.check_foreign_kind_bodyless(fi.ident, "static", expr.as_ref().map(|b| b.span));
11901190
self.check_foreign_item_ascii_only(fi.ident);
11911191
}
11921192
ForeignItemKind::MacCall(..) => {}

compiler/rustc_ast_pretty/src/pprust/state/item.rs

+11-9
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,17 @@ impl<'a> State<'a> {
3030
ast::ForeignItemKind::Fn(box ast::Fn { defaultness, sig, generics, body }) => {
3131
self.print_fn_full(sig, ident, generics, vis, *defaultness, body.as_deref(), attrs);
3232
}
33-
ast::ForeignItemKind::Static(ty, mutbl, body) => self.print_item_const(
34-
ident,
35-
Some(*mutbl),
36-
&ast::Generics::default(),
37-
ty,
38-
body.as_deref(),
39-
vis,
40-
ast::Defaultness::Final,
41-
),
33+
ast::ForeignItemKind::Static(box ast::StaticForeignItem { ty, mutability, expr }) => {
34+
self.print_item_const(
35+
ident,
36+
Some(*mutability),
37+
&ast::Generics::default(),
38+
ty,
39+
expr.as_deref(),
40+
vis,
41+
ast::Defaultness::Final,
42+
)
43+
}
4244
ast::ForeignItemKind::TyAlias(box ast::TyAlias {
4345
defaultness,
4446
generics,

compiler/rustc_parse/src/parser/item.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -1191,7 +1191,11 @@ impl<'a> Parser<'a> {
11911191
ident_span: ident.span,
11921192
const_span,
11931193
});
1194-
ForeignItemKind::Static(ty, Mutability::Not, expr)
1194+
ForeignItemKind::Static(Box::new(StaticForeignItem {
1195+
ty,
1196+
mutability: Mutability::Not,
1197+
expr,
1198+
}))
11951199
}
11961200
_ => return self.error_bad_item_kind(span, &kind, "`extern` blocks"),
11971201
},

compiler/rustc_resolve/src/def_collector.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ impl<'a, 'b, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'b, 'tcx> {
214214

215215
fn visit_foreign_item(&mut self, fi: &'a ForeignItem) {
216216
let def_kind = match fi.kind {
217-
ForeignItemKind::Static(_, mutability, _) => {
217+
ForeignItemKind::Static(box StaticForeignItem { ty: _, mutability, expr: _ }) => {
218218
DefKind::Static { mutability, nested: false }
219219
}
220220
ForeignItemKind::Fn(_) => DefKind::Fn,

0 commit comments

Comments
 (0)