rustc_interface: Hide some hacky details of early linting from expand
This commit is contained in:
parent
46b67aa74d
commit
da3419e18c
4 changed files with 15 additions and 11 deletions
|
@ -5,7 +5,7 @@ use rustc_ast::ptr::P;
|
|||
use rustc_ast::token::{self, Nonterminal};
|
||||
use rustc_ast::tokenstream::{CanSynthesizeMissingTokens, LazyTokenStream, TokenStream};
|
||||
use rustc_ast::visit::{AssocCtxt, Visitor};
|
||||
use rustc_ast::{self as ast, AstLike, Attribute, NodeId, PatKind};
|
||||
use rustc_ast::{self as ast, AstLike, Attribute, Item, NodeId, PatKind};
|
||||
use rustc_attr::{self as attr, Deprecation, Stability};
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_data_structures::sync::{self, Lrc};
|
||||
|
@ -925,6 +925,9 @@ pub struct ExpansionData {
|
|||
pub prior_type_ascription: Option<(Span, bool)>,
|
||||
}
|
||||
|
||||
type OnExternModLoaded<'a> =
|
||||
Option<&'a dyn Fn(Ident, Vec<Attribute>, Vec<P<Item>>, Span) -> (Vec<Attribute>, Vec<P<Item>>)>;
|
||||
|
||||
/// One of these is made during expansion and incrementally updated as we go;
|
||||
/// when a macro expansion occurs, the resulting nodes have the `backtrace()
|
||||
/// -> expn_data` of their expansion context stored into their span.
|
||||
|
@ -942,7 +945,7 @@ pub struct ExtCtxt<'a> {
|
|||
/// Called directly after having parsed an external `mod foo;` in expansion.
|
||||
///
|
||||
/// `Ident` is the module name.
|
||||
pub(super) extern_mod_loaded: Option<&'a dyn Fn(&ast::Crate, Ident)>,
|
||||
pub(super) extern_mod_loaded: OnExternModLoaded<'a>,
|
||||
}
|
||||
|
||||
impl<'a> ExtCtxt<'a> {
|
||||
|
@ -950,7 +953,7 @@ impl<'a> ExtCtxt<'a> {
|
|||
sess: &'a Session,
|
||||
ecfg: expand::ExpansionConfig<'a>,
|
||||
resolver: &'a mut dyn ResolverExpand,
|
||||
extern_mod_loaded: Option<&'a dyn Fn(&ast::Crate, Ident)>,
|
||||
extern_mod_loaded: OnExternModLoaded<'a>,
|
||||
) -> ExtCtxt<'a> {
|
||||
ExtCtxt {
|
||||
sess,
|
||||
|
|
|
@ -1298,7 +1298,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
|
|||
ModKind::Unloaded => {
|
||||
// We have an outline `mod foo;` so we need to parse the file.
|
||||
let ParsedExternalMod {
|
||||
items,
|
||||
mut items,
|
||||
inner_span,
|
||||
file_path,
|
||||
dir_path,
|
||||
|
@ -1312,14 +1312,12 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
|
|||
&mut attrs,
|
||||
);
|
||||
|
||||
let krate =
|
||||
ast::Crate { attrs, items, span: inner_span, proc_macros: vec![] };
|
||||
if let Some(extern_mod_loaded) = self.cx.extern_mod_loaded {
|
||||
extern_mod_loaded(&krate, ident);
|
||||
(attrs, items) = extern_mod_loaded(ident, attrs, items, inner_span);
|
||||
}
|
||||
|
||||
*mod_kind = ModKind::Loaded(krate.items, Inline::No, inner_span);
|
||||
item.attrs = krate.attrs;
|
||||
*mod_kind = ModKind::Loaded(items, Inline::No, inner_span);
|
||||
item.attrs = attrs;
|
||||
// File can have inline attributes, e.g., `#![cfg(...)]` & co. => Reconfigure.
|
||||
item = configure!(self, item);
|
||||
(Some(file_path), dir_path, dir_ownership)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(decl_macro)]
|
||||
#![feature(destructuring_assignment)]
|
||||
#![feature(or_patterns)]
|
||||
#![feature(proc_macro_diagnostic)]
|
||||
#![feature(proc_macro_internals)]
|
||||
|
|
|
@ -302,8 +302,10 @@ fn configure_and_expand_inner<'a>(
|
|||
..rustc_expand::expand::ExpansionConfig::default(crate_name.to_string())
|
||||
};
|
||||
|
||||
let extern_mod_loaded = |k: &ast::Crate, ident: Ident| {
|
||||
pre_expansion_lint(sess, lint_store, k, &*ident.name.as_str())
|
||||
let extern_mod_loaded = |ident: Ident, attrs, items, span| {
|
||||
let krate = ast::Crate { attrs, items, span, proc_macros: vec![] };
|
||||
pre_expansion_lint(sess, lint_store, &krate, &ident.name.as_str());
|
||||
(krate.attrs, krate.items)
|
||||
};
|
||||
let mut ecx = ExtCtxt::new(&sess, cfg, &mut resolver, Some(&extern_mod_loaded));
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue