Skip to content

Introduce ModernIdent type to unify macro 2.0 hygiene handling #144439

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

xizheyin
Copy link
Contributor

This pr introduce ModernIdent type to unify macro 2.0 hygiene handling

  1. Added ModernIdent type. Wraps Ident and automatically calls normalize_to_macros_2_0()
  2. Unified identifier normalization. Replaced scattered ident.normalize_to_macros_2_0() calls with ModernIdent::new(ident)

r? @petrochenkov

@rustbot rustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Jul 25, 2025
@rustbot
Copy link
Collaborator

rustbot commented Jul 25, 2025

HIR ty lowering was modified

cc @fmease

@rustbot rustbot added the T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. label Jul 25, 2025
@fee1-dead
Copy link
Member

What problem is this intended to solve? ModernIdent seems like a quite confusing name.

@petrochenkov petrochenkov added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jul 25, 2025
@petrochenkov
Copy link
Contributor

In general, I have mixed feelings about both this and MacroRulesNormalizedIdent.
It clearly can potentially catch some mistakes or inefficiencies (like it did in fn define_macro, I think), on the other hand it can only be used opportunistically because most places either do not care about the normalization, or care but the normalization should be different in different cases (like in rib.bindings, I guess).

Copy link
Contributor Author

@xizheyin xizheyin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this version, I removed some unnecessary uses.
The modifications are mainly centered around two fields.

  1. BindingKey::ident
  2. Resolver::extern_prelude

Comment on lines +2607 to +2610
// For search in index map for `Ident` as a index key
pub unsafe fn new_without_normalize(ident: Ident) -> Self {
Macros20NormalizedIdent(ident)
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the last commit, I implemented Borrow to look up in IndexMap<Macro20NormalizedIdent> with Ident as key. But in the new version, I implemented this function to temporarily convert the Ident to Macro20NormalizedIdent without normalizing it to match the type. And I also apply this function to some Idents that were not normalized using normalize_to_macros_2_0() in the original code.

I'll mark three places where I use this function and I'm not sure if I should use new or it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see any justified uses of new_without_normalize, it can be removed.

@@ -203,7 +203,7 @@ impl<'a, 'ra, 'tcx> UnusedImportCheckVisitor<'a, 'ra, 'tcx> {
if self
.r
.extern_prelude
.get(&extern_crate.ident)
.get(&unsafe { Macros20NormalizedIdent::new_without_normalize(extern_crate.ident) })
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here use new_without_normalize for indexing

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should use Macros20NormalizedIdent::new.

Comment on lines +325 to +328
let from_item = self
.extern_prelude
.get(&unsafe { Macros20NormalizedIdent::new_without_normalize(ident) })
.is_none_or(|entry| entry.introduced_by_item);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here also for Indexing

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should use Macros20NormalizedIdent::new.

Comment on lines -1476 to +1496
.map(|(name, _)| (Ident::from_str(name), Default::default()))
.map(|(name, _)| {
(
unsafe {
Macros20NormalizedIdent::new_without_normalize(Ident::from_str(name))
},
Default::default(),
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here will return extern_prelude which petrochenkov suggest to convert to Macro20NormalizedIdent.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should use Macros20NormalizedIdent::with_dummy_span, please rebase on master.

@bors

This comment was marked as resolved.

@bors

This comment was marked as resolved.

@xizheyin
Copy link
Contributor Author

xizheyin commented Aug 4, 2025

I rebased it @rustbot ready

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Aug 4, 2025
}
}

impl Deref for Macros20NormalizedIdent {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is mostly for norm_ident.as_str(), right?
Then it's probably better to just add that method to normalized idents.
Idents are not normally passed by reference besides that special case.

And I also don't see anything taking &mut Ident, so better to avoid DerefMut too.

@@ -969,7 +969,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
self.r.potentially_unused_imports.push(import);
let imported_binding = self.r.import(binding, import);
if parent == self.r.graph_root {
let ident = ident.normalize_to_macros_2_0();
let ident = Macros20NormalizedIdent::new(ident);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
let ident = Macros20NormalizedIdent::new(ident);
let norm_ident = Macros20NormalizedIdent::new(ident);

Let's use a more disambiguated naming in contexts where both normalized and non-normalized idents exist.

@@ -690,7 +690,7 @@ impl<'ra> Module<'ra> {
return;
}
if let Res::Def(DefKind::Trait | DefKind::TraitAlias, def_id) = binding.res() {
collected_traits.push((name, binding, r.as_ref().get_module(def_id)))
collected_traits.push((name.0, binding, r.as_ref().get_module(def_id)))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ModuleData::traits always contain normalized idents and can use Macros20NormalizedIdent.

@petrochenkov petrochenkov added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Aug 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants