mirror of
https://github.com/rust-lang/rust.git
synced 2024-10-31 14:31:55 +00:00
expand: Refactor InvocationCollector
visitor for better code reuse
This commit is contained in:
parent
4fd23350cd
commit
800ba8f8e8
@ -6,12 +6,13 @@ use super::{AssocItem, Expr, ForeignItem, Item, Local, MacCallStmt};
|
||||
use super::{AttrItem, AttrKind, Block, Pat, Path, Ty, Visibility};
|
||||
use super::{AttrVec, Attribute, Stmt, StmtKind};
|
||||
|
||||
use std::fmt::Debug;
|
||||
use std::fmt;
|
||||
use std::marker::PhantomData;
|
||||
|
||||
/// An `AstLike` represents an AST node (or some wrapper around
|
||||
/// and AST node) which stores some combination of attributes
|
||||
/// and tokens.
|
||||
pub trait AstLike: Sized + Debug {
|
||||
pub trait AstLike: Sized + fmt::Debug {
|
||||
/// This is `true` if this `AstLike` might support 'custom' (proc-macro) inner
|
||||
/// attributes. Attributes like `#![cfg]` and `#![cfg_attr]` are not
|
||||
/// considered 'custom' attributes
|
||||
@ -285,3 +286,37 @@ derive_has_attrs_no_tokens! {
|
||||
derive_has_tokens_no_attrs! {
|
||||
Ty, Block, AttrItem, Pat, Path, Visibility
|
||||
}
|
||||
|
||||
/// A newtype around an `AstLike` node that implements `AstLike` itself.
|
||||
pub struct AstLikeWrapper<Wrapped, Tag> {
|
||||
pub wrapped: Wrapped,
|
||||
pub tag: PhantomData<Tag>,
|
||||
}
|
||||
|
||||
impl<Wrapped, Tag> AstLikeWrapper<Wrapped, Tag> {
|
||||
pub fn new(wrapped: Wrapped, _tag: Tag) -> AstLikeWrapper<Wrapped, Tag> {
|
||||
AstLikeWrapper { wrapped, tag: Default::default() }
|
||||
}
|
||||
}
|
||||
|
||||
impl<Wrapped: fmt::Debug, Tag> fmt::Debug for AstLikeWrapper<Wrapped, Tag> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_struct("AstLikeWrapper")
|
||||
.field("wrapped", &self.wrapped)
|
||||
.field("tag", &self.tag)
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl<Wrapped: AstLike, Tag> AstLike for AstLikeWrapper<Wrapped, Tag> {
|
||||
const SUPPORTS_CUSTOM_INNER_ATTRS: bool = Wrapped::SUPPORTS_CUSTOM_INNER_ATTRS;
|
||||
fn attrs(&self) -> &[Attribute] {
|
||||
self.wrapped.attrs()
|
||||
}
|
||||
fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
|
||||
self.wrapped.visit_attrs(f)
|
||||
}
|
||||
fn tokens_mut(&mut self) -> Option<&mut Option<LazyTokenStream>> {
|
||||
self.wrapped.tokens_mut()
|
||||
}
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ pub mod tokenstream;
|
||||
pub mod visit;
|
||||
|
||||
pub use self::ast::*;
|
||||
pub use self::ast_like::AstLike;
|
||||
pub use self::ast_like::{AstLike, AstLikeWrapper};
|
||||
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,5 @@
|
||||
#![feature(associated_type_bounds)]
|
||||
#![feature(associated_type_defaults)]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(decl_macro)]
|
||||
#![cfg_attr(bootstrap, feature(destructuring_assignment))]
|
||||
|
Loading…
Reference in New Issue
Block a user