From 99ecdb3f5fc49efb3eccdd10fbe12dc98623a938 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sun, 24 Jun 2018 19:54:23 +0300 Subject: [PATCH] hygiene: Implement transparent marks --- src/librustc_resolve/lib.rs | 13 ++- src/librustc_resolve/macros.rs | 4 +- src/libsyntax/ext/base.rs | 8 ++ src/libsyntax/ext/expand.rs | 2 +- src/libsyntax/ext/tt/macro_rules.rs | 3 + src/libsyntax_pos/hygiene.rs | 97 ++++++++++++++----- src/libsyntax_pos/lib.rs | 6 ++ src/libsyntax_pos/symbol.rs | 9 ++ src/test/ui/hygiene/auxiliary/intercrate.rs | 6 ++ .../ui/hygiene/auxiliary/transparent-basic.rs | 16 +++ src/test/ui/hygiene/dollar-crate-modern.rs | 22 +++++ src/test/ui/hygiene/generate-mod.rs | 24 +++++ src/test/ui/hygiene/generate-mod.stderr | 17 ++++ src/test/ui/hygiene/transparent-basic.rs | 53 ++++++++++ 14 files changed, 253 insertions(+), 27 deletions(-) create mode 100644 src/test/ui/hygiene/auxiliary/transparent-basic.rs create mode 100644 src/test/ui/hygiene/dollar-crate-modern.rs create mode 100644 src/test/ui/hygiene/generate-mod.rs create mode 100644 src/test/ui/hygiene/generate-mod.stderr create mode 100644 src/test/ui/hygiene/transparent-basic.rs diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 7771bc9b1cb1..640e650207e8 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -1850,6 +1850,8 @@ fn resolve_ident_in_lexical_scope(&mut self, } else { ident.span.modern() } + } else { + ident = ident.modern_and_legacy(); } // Walk backwards up the ribs in scope. @@ -1987,7 +1989,7 @@ fn resolve_crate_root(&mut self, ident: Ident) -> Module<'a> { // When resolving `$crate` from a `macro_rules!` invoked in a `macro`, // we don't want to pretend that the `macro_rules!` definition is in the `macro` // as described in `SyntaxContext::apply_mark`, so we ignore prepended modern marks. - ctxt.marks().into_iter().find(|&mark| mark.transparency() != Transparency::Opaque) + ctxt.marks().into_iter().rev().find(|m| m.transparency() != Transparency::Transparent) } else { ctxt = ctxt.modern(); ctxt.adjust(Mark::root()) @@ -2628,6 +2630,7 @@ fn fresh_binding(&mut self, // must not add it if it's in the bindings map // because that breaks the assumptions later // passes make about or-patterns.) + let ident = ident.modern_and_legacy(); let mut def = Def::Local(pat_id); match bindings.get(&ident).cloned() { Some(id) if id == outer_pat_id => { @@ -3782,7 +3785,8 @@ fn with_resolved_label(&mut self, label: Option