Skip to content

Commit 9844d13

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

File tree

5 files changed

+253
-191
lines changed

5 files changed

+253
-191
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
@@ -685,7 +685,7 @@ fn walk_meta_list_item<T: MutVisitor>(vis: &mut T, li: &mut NestedMetaItem) {
685685
}
686686
}
687687

688-
fn walk_meta_item<T: MutVisitor>(vis: &mut T, mi: &mut MetaItem) {
688+
pub fn walk_meta_item<T: MutVisitor>(vis: &mut T, mi: &mut MetaItem) {
689689
let MetaItem { unsafety: _, path: _, kind, span } = mi;
690690
match kind {
691691
MetaItemKind::Word => {}
@@ -901,7 +901,7 @@ fn walk_coroutine_kind<T: MutVisitor>(vis: &mut T, coroutine_kind: &mut Coroutin
901901
}
902902
}
903903

904-
fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
904+
pub fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
905905
match kind {
906906
FnKind::Fn(_ctxt, _ident, FnSig { header, decl, span }, generics, body) => {
907907
// Identifier and visibility are visited as a part of the item.
@@ -934,7 +934,7 @@ fn walk_fn_ret_ty<T: MutVisitor>(vis: &mut T, fn_ret_ty: &mut FnRetTy) {
934934
}
935935
}
936936

937-
fn walk_param_bound<T: MutVisitor>(vis: &mut T, pb: &mut GenericBound) {
937+
pub fn walk_param_bound<T: MutVisitor>(vis: &mut T, pb: &mut GenericBound) {
938938
match pb {
939939
GenericBound::Trait(ty, _modifier) => vis.visit_poly_trait_ref(ty),
940940
GenericBound::Outlives(lifetime) => walk_lifetime(vis, lifetime),
@@ -984,11 +984,11 @@ pub fn walk_flat_map_generic_param<T: MutVisitor>(
984984
smallvec![param]
985985
}
986986

987-
fn walk_label<T: MutVisitor>(vis: &mut T, Label { ident }: &mut Label) {
987+
pub fn walk_label<T: MutVisitor>(vis: &mut T, Label { ident }: &mut Label) {
988988
vis.visit_ident(ident);
989989
}
990990

991-
fn walk_lifetime<T: MutVisitor>(vis: &mut T, Lifetime { id, ident }: &mut Lifetime) {
991+
pub fn walk_lifetime<T: MutVisitor>(vis: &mut T, Lifetime { id, ident }: &mut Lifetime) {
992992
vis.visit_id(id);
993993
vis.visit_ident(ident);
994994
}
@@ -1332,6 +1332,14 @@ pub fn walk_crate<T: MutVisitor>(vis: &mut T, krate: &mut Crate) {
13321332
vis.visit_span(inject_use_span);
13331333
}
13341334

1335+
pub fn walk_flat_map_assoc_item(
1336+
visitor: &mut impl MutVisitor,
1337+
item: P<Item<AssocItemKind>>,
1338+
ctxt: AssocCtxt,
1339+
) -> SmallVec<[P<Item<AssocItemKind>>; 1]> {
1340+
walk_flat_map_item(visitor, item, Some(ctxt))
1341+
}
1342+
13351343
/// Mutates one item, returning the item again.
13361344
pub fn walk_flat_map_item<K: NoopVisitItemKind>(
13371345
visitor: &mut impl MutVisitor,
@@ -1842,3 +1850,26 @@ pub enum FnKind<'a> {
18421850
/// E.g., `|x, y| body`.
18431851
Closure(&'a mut ClosureBinder, &'a mut P<FnDecl>, &'a mut P<Expr>),
18441852
}
1853+
1854+
impl FnKind<'_> {
1855+
pub fn header(&self) -> Option<&FnHeader> {
1856+
match self {
1857+
FnKind::Fn(_, _, sig, _, _) => Some(&sig.header),
1858+
FnKind::Closure(_, _, _) => None,
1859+
}
1860+
}
1861+
1862+
pub fn ctxt(&self) -> Option<FnCtxt> {
1863+
match *self {
1864+
FnKind::Fn(ctxt, ..) => Some(ctxt),
1865+
FnKind::Closure(..) => None,
1866+
}
1867+
}
1868+
1869+
pub fn decl(&self) -> &FnDecl {
1870+
match self {
1871+
FnKind::Fn(_, _, sig, _, _) => &sig.decl,
1872+
FnKind::Closure(_, decl, _) => decl,
1873+
}
1874+
}
1875+
}

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)