Skip to content

Commit e8d7873

Browse files
committed
Allow ast validation to mutate the ast (inserting error nodes in case of validation failures)
1 parent cb2ae24 commit e8d7873

File tree

5 files changed

+245
-188
lines changed

5 files changed

+245
-188
lines changed

Cargo.lock

+1
Original file line numberDiff line numberDiff line change
@@ -3632,6 +3632,7 @@ dependencies = [
36323632
"rustc_session",
36333633
"rustc_span",
36343634
"rustc_target",
3635+
"smallvec",
36353636
"thin-vec",
36363637
]
36373638

compiler/rustc_ast/src/mut_visit.rs

+36-5
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,7 @@ fn walk_meta_list_item<T: MutVisitor>(vis: &mut T, li: &mut NestedMetaItem) {
682682
}
683683
}
684684

685-
fn walk_meta_item<T: MutVisitor>(vis: &mut T, mi: &mut MetaItem) {
685+
pub fn walk_meta_item<T: MutVisitor>(vis: &mut T, mi: &mut MetaItem) {
686686
let MetaItem { unsafety: _, path: _, kind, span } = mi;
687687
match kind {
688688
MetaItemKind::Word => {}
@@ -898,7 +898,7 @@ fn walk_coroutine_kind<T: MutVisitor>(vis: &mut T, coroutine_kind: &mut Coroutin
898898
}
899899
}
900900

901-
fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
901+
pub fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
902902
match kind {
903903
FnKind::Fn(_ctxt, _ident, FnSig { header, decl, span }, generics, body) => {
904904
// Identifier and visibility are visited as a part of the item.
@@ -931,7 +931,7 @@ fn walk_fn_ret_ty<T: MutVisitor>(vis: &mut T, fn_ret_ty: &mut FnRetTy) {
931931
}
932932
}
933933

934-
fn walk_param_bound<T: MutVisitor>(vis: &mut T, pb: &mut GenericBound) {
934+
pub fn walk_param_bound<T: MutVisitor>(vis: &mut T, pb: &mut GenericBound) {
935935
match pb {
936936
GenericBound::Trait(ty, _modifier) => vis.visit_poly_trait_ref(ty),
937937
GenericBound::Outlives(lifetime) => walk_lifetime(vis, lifetime),
@@ -981,11 +981,11 @@ pub fn walk_generic_param<T: MutVisitor>(
981981
smallvec![param]
982982
}
983983

984-
fn walk_label<T: MutVisitor>(vis: &mut T, Label { ident }: &mut Label) {
984+
pub fn walk_label<T: MutVisitor>(vis: &mut T, Label { ident }: &mut Label) {
985985
vis.visit_ident(ident);
986986
}
987987

988-
fn walk_lifetime<T: MutVisitor>(vis: &mut T, Lifetime { id, ident }: &mut Lifetime) {
988+
pub fn walk_lifetime<T: MutVisitor>(vis: &mut T, Lifetime { id, ident }: &mut Lifetime) {
989989
vis.visit_id(id);
990990
vis.visit_ident(ident);
991991
}
@@ -1323,6 +1323,14 @@ pub fn walk_crate<T: MutVisitor>(vis: &mut T, krate: &mut Crate) {
13231323
vis.visit_span(inject_use_span);
13241324
}
13251325

1326+
pub fn walk_assoc_item(
1327+
visitor: &mut impl MutVisitor,
1328+
item: P<Item<AssocItemKind>>,
1329+
ctxt: AssocCtxt,
1330+
) -> SmallVec<[P<Item<AssocItemKind>>; 1]> {
1331+
walk_item(visitor, item, Some(ctxt))
1332+
}
1333+
13261334
/// Mutates one item, returning the item again.
13271335
pub fn walk_item<K: NoopVisitItemKind>(
13281336
visitor: &mut impl MutVisitor,
@@ -1831,3 +1839,26 @@ pub enum FnKind<'a> {
18311839
/// E.g., `|x, y| body`.
18321840
Closure(&'a mut ClosureBinder, &'a mut P<FnDecl>, &'a mut P<Expr>),
18331841
}
1842+
1843+
impl FnKind<'_> {
1844+
pub fn header(&self) -> Option<&FnHeader> {
1845+
match self {
1846+
FnKind::Fn(_, _, sig, _, _) => Some(&sig.header),
1847+
FnKind::Closure(_, _, _) => None,
1848+
}
1849+
}
1850+
1851+
pub fn ctxt(&self) -> Option<FnCtxt> {
1852+
match *self {
1853+
FnKind::Fn(ctxt, ..) => Some(ctxt),
1854+
FnKind::Closure(..) => None,
1855+
}
1856+
}
1857+
1858+
pub fn decl(&self) -> &FnDecl {
1859+
match self {
1860+
FnKind::Fn(_, _, sig, _, _) => &sig.decl,
1861+
FnKind::Closure(_, decl, _) => decl,
1862+
}
1863+
}
1864+
}

compiler/rustc_ast_passes/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@ rustc_parse = { path = "../rustc_parse" }
1818
rustc_session = { path = "../rustc_session" }
1919
rustc_span = { path = "../rustc_span" }
2020
rustc_target = { path = "../rustc_target" }
21+
smallvec = { version = "1.8.1", features = ["union", "may_dangle"] }
2122
thin-vec = "0.2.12"
2223
# tidy-alphabetical-end

0 commit comments

Comments
 (0)