mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
rustc_expand: remember module #[path]s during expansion
this fixes cycle detection for modules that need a second invocation collection pass after parsing
This commit is contained in:
parent
f7f8bdf2e0
commit
9a7644e171
@ -41,7 +41,9 @@ use crate::errors::{
|
||||
};
|
||||
use crate::fluent_generated;
|
||||
use crate::mbe::diagnostics::annotate_err_with_kind;
|
||||
use crate::module::{mod_dir_path, parse_external_mod, DirOwnership, ParsedExternalMod};
|
||||
use crate::module::{
|
||||
mod_dir_path, mod_file_path_from_attr, parse_external_mod, DirOwnership, ParsedExternalMod,
|
||||
};
|
||||
use crate::placeholders::{placeholder, PlaceholderExpander};
|
||||
|
||||
macro_rules! ast_fragments {
|
||||
@ -1202,8 +1204,14 @@ impl InvocationCollectorNode for P<ast::Item> {
|
||||
ecx.current_expansion.dir_ownership,
|
||||
*inline,
|
||||
);
|
||||
// If the module was parsed from an external file, recover its path.
|
||||
// This lets `parse_external_mod` catch cycles if it's self-referential.
|
||||
let file_path = match inline {
|
||||
Inline::Yes => None,
|
||||
Inline::No => mod_file_path_from_attr(ecx.sess, &attrs, &dir_path),
|
||||
};
|
||||
node.attrs = attrs;
|
||||
(None, dir_path, dir_ownership)
|
||||
(file_path, dir_path, dir_ownership)
|
||||
}
|
||||
ModKind::Unloaded => {
|
||||
// We have an outline `mod foo;` so we need to parse the file.
|
||||
|
@ -171,7 +171,7 @@ fn mod_file_path<'a>(
|
||||
|
||||
/// Derive a submodule path from the first found `#[path = "path_string"]`.
|
||||
/// The provided `dir_path` is joined with the `path_string`.
|
||||
fn mod_file_path_from_attr(
|
||||
pub(crate) fn mod_file_path_from_attr(
|
||||
sess: &Session,
|
||||
attrs: &[Attribute],
|
||||
dir_path: &Path,
|
||||
|
Loading…
Reference in New Issue
Block a user