Skip to content

Commit 5ebcbfc

Browse files
committed
Remove AstDeref.
It's a "utility trait to reduce boilerplate" implemented for `P` and `AstNodeWrapper`, but removing it gives a net reduction of twenty lines of code. It's also simpler to just implement `HasNodeId`/`HasAttrs`/`HasTokens` directly on types instead of via `AstDeref`. (I decided to make this change when doing some related refactoring and the error messages involving `AstDeref` and `HasAttrs` were hard to understand; removing it helped a lot.)
1 parent d22461c commit 5ebcbfc

File tree

4 files changed

+33
-53
lines changed

4 files changed

+33
-53
lines changed

compiler/rustc_ast/src/ast.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,6 @@ impl ParenthesizedArgs {
308308
}
309309
}
310310

311-
use crate::AstDeref;
312311
pub use crate::node_id::{CRATE_NODE_ID, DUMMY_NODE_ID, NodeId};
313312

314313
/// Modifiers on a trait bound like `~const`, `?` and `!`.
@@ -2349,7 +2348,7 @@ impl Ty {
23492348
pub fn is_maybe_parenthesised_infer(&self) -> bool {
23502349
match &self.kind {
23512350
TyKind::Infer => true,
2352-
TyKind::Paren(inner) => inner.ast_deref().is_maybe_parenthesised_infer(),
2351+
TyKind::Paren(inner) => inner.is_maybe_parenthesised_infer(),
23532352
_ => false,
23542353
}
23552354
}

compiler/rustc_ast/src/ast_traits.rs

+28-47
Original file line numberDiff line numberDiff line change
@@ -13,34 +13,6 @@ use crate::{
1313
Ty, Variant, Visibility, WherePredicate,
1414
};
1515

16-
/// A utility trait to reduce boilerplate.
17-
/// Standard `Deref(Mut)` cannot be reused due to coherence.
18-
pub trait AstDeref {
19-
type Target;
20-
fn ast_deref(&self) -> &Self::Target;
21-
fn ast_deref_mut(&mut self) -> &mut Self::Target;
22-
}
23-
24-
macro_rules! impl_not_ast_deref {
25-
($($T:ty),+ $(,)?) => {
26-
$(
27-
impl !AstDeref for $T {}
28-
)+
29-
};
30-
}
31-
32-
impl_not_ast_deref!(AssocItem, Expr, ForeignItem, Item, Stmt);
33-
34-
impl<T> AstDeref for P<T> {
35-
type Target = T;
36-
fn ast_deref(&self) -> &Self::Target {
37-
self
38-
}
39-
fn ast_deref_mut(&mut self) -> &mut Self::Target {
40-
self
41-
}
42-
}
43-
4416
/// A trait for AST nodes having an ID.
4517
pub trait HasNodeId {
4618
fn node_id(&self) -> NodeId;
@@ -81,12 +53,12 @@ impl_has_node_id!(
8153
WherePredicate,
8254
);
8355

84-
impl<T: AstDeref<Target: HasNodeId>> HasNodeId for T {
56+
impl<T: HasNodeId> HasNodeId for P<T> {
8557
fn node_id(&self) -> NodeId {
86-
self.ast_deref().node_id()
58+
(**self).node_id()
8759
}
8860
fn node_id_mut(&mut self) -> &mut NodeId {
89-
self.ast_deref_mut().node_id_mut()
61+
(**self).node_id_mut()
9062
}
9163
}
9264

@@ -138,21 +110,21 @@ impl_has_tokens_none!(
138110
WherePredicate
139111
);
140112

141-
impl<T: AstDeref<Target: HasTokens>> HasTokens for T {
113+
impl<T: HasTokens> HasTokens for Option<T> {
142114
fn tokens(&self) -> Option<&LazyAttrTokenStream> {
143-
self.ast_deref().tokens()
115+
self.as_ref().and_then(|inner| inner.tokens())
144116
}
145117
fn tokens_mut(&mut self) -> Option<&mut Option<LazyAttrTokenStream>> {
146-
self.ast_deref_mut().tokens_mut()
118+
self.as_mut().and_then(|inner| inner.tokens_mut())
147119
}
148120
}
149121

150-
impl<T: HasTokens> HasTokens for Option<T> {
122+
impl<T: HasTokens> HasTokens for P<T> {
151123
fn tokens(&self) -> Option<&LazyAttrTokenStream> {
152-
self.as_ref().and_then(|inner| inner.tokens())
124+
(**self).tokens()
153125
}
154126
fn tokens_mut(&mut self) -> Option<&mut Option<LazyAttrTokenStream>> {
155-
self.as_mut().and_then(|inner| inner.tokens_mut())
127+
(**self).tokens_mut()
156128
}
157129
}
158130

@@ -273,13 +245,13 @@ impl_has_attrs!(
273245
);
274246
impl_has_attrs_none!(Attribute, AttrItem, Block, Pat, Path, Ty, Visibility);
275247

276-
impl<T: AstDeref<Target: HasAttrs>> HasAttrs for T {
277-
const SUPPORTS_CUSTOM_INNER_ATTRS: bool = T::Target::SUPPORTS_CUSTOM_INNER_ATTRS;
248+
impl<T: HasAttrs> HasAttrs for P<T> {
249+
const SUPPORTS_CUSTOM_INNER_ATTRS: bool = T::SUPPORTS_CUSTOM_INNER_ATTRS;
278250
fn attrs(&self) -> &[Attribute] {
279-
self.ast_deref().attrs()
251+
(**self).attrs()
280252
}
281253
fn visit_attrs(&mut self, f: impl FnOnce(&mut AttrVec)) {
282-
self.ast_deref_mut().visit_attrs(f)
254+
(**self).visit_attrs(f);
283255
}
284256
}
285257

@@ -343,13 +315,22 @@ impl<Wrapped, Tag> AstNodeWrapper<Wrapped, Tag> {
343315
}
344316
}
345317

346-
impl<Wrapped, Tag> AstDeref for AstNodeWrapper<Wrapped, Tag> {
347-
type Target = Wrapped;
348-
fn ast_deref(&self) -> &Self::Target {
349-
&self.wrapped
318+
impl<Wrapped: HasNodeId, Tag> HasNodeId for AstNodeWrapper<Wrapped, Tag> {
319+
fn node_id(&self) -> NodeId {
320+
self.wrapped.node_id()
321+
}
322+
fn node_id_mut(&mut self) -> &mut NodeId {
323+
self.wrapped.node_id_mut()
324+
}
325+
}
326+
327+
impl<Wrapped: HasAttrs, Tag> HasAttrs for AstNodeWrapper<Wrapped, Tag> {
328+
const SUPPORTS_CUSTOM_INNER_ATTRS: bool = Wrapped::SUPPORTS_CUSTOM_INNER_ATTRS;
329+
fn attrs(&self) -> &[Attribute] {
330+
self.wrapped.attrs()
350331
}
351-
fn ast_deref_mut(&mut self) -> &mut Self::Target {
352-
&mut self.wrapped
332+
fn visit_attrs(&mut self, f: impl FnOnce(&mut AttrVec)) {
333+
self.wrapped.visit_attrs(f);
353334
}
354335
}
355336

compiler/rustc_ast/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ pub mod tokenstream;
4646
pub mod visit;
4747

4848
pub use self::ast::*;
49-
pub use self::ast_traits::{AstDeref, AstNodeWrapper, HasAttrs, HasNodeId, HasTokens};
49+
pub use self::ast_traits::{AstNodeWrapper, HasAttrs, HasNodeId, HasTokens};
5050

5151
/// Requirements for a `StableHashingContext` to be used in this crate.
5252
/// This is a hack to allow using the `HashStable_Generic` derive macro

compiler/rustc_builtin_macros/src/env.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use std::env::VarError;
88

99
use rustc_ast::token::{self, LitKind};
1010
use rustc_ast::tokenstream::TokenStream;
11-
use rustc_ast::{AstDeref, ExprKind, GenericArg, Mutability};
11+
use rustc_ast::{ExprKind, GenericArg, Mutability};
1212
use rustc_expand::base::{DummyResult, ExpandResult, ExtCtxt, MacEager, MacroExpanderResult};
1313
use rustc_span::{Ident, Span, Symbol, kw, sym};
1414
use thin_vec::thin_vec;
@@ -148,13 +148,13 @@ pub(crate) fn expand_env<'cx>(
148148
cx.dcx().emit_err(errors::EnvNotDefined::CargoEnvVar {
149149
span,
150150
var: *symbol,
151-
var_expr: var_expr.ast_deref(),
151+
var_expr: &var_expr,
152152
})
153153
} else {
154154
cx.dcx().emit_err(errors::EnvNotDefined::CustomEnvVar {
155155
span,
156156
var: *symbol,
157-
var_expr: var_expr.ast_deref(),
157+
var_expr: &var_expr,
158158
})
159159
}
160160
}

0 commit comments

Comments
 (0)