Skip to content

Commit 45205f2

Browse files
committed
Auto merge of #56262 - petrochenkov:nabsedihyg, r=petrochenkov
[master] resolve: Implement edition hygiene for imports and absolute paths Forward-port of #56053 to master. r? @ghost
2 parents 75d937c + 6f13708 commit 45205f2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+645
-539
lines changed

Diff for: src/librustc/ty/context.rs

+2-9
Original file line numberDiff line numberDiff line change
@@ -1478,15 +1478,8 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
14781478
/// done with either: `-Ztwo-phase-borrows`, `#![feature(nll)]`,
14791479
/// or by opting into an edition after 2015.
14801480
pub fn two_phase_borrows(self) -> bool {
1481-
if self.features().nll || self.sess.opts.debugging_opts.two_phase_borrows {
1482-
return true;
1483-
}
1484-
1485-
match self.sess.edition() {
1486-
Edition::Edition2015 => false,
1487-
Edition::Edition2018 => true,
1488-
_ => true,
1489-
}
1481+
self.sess.rust_2018() || self.features().nll ||
1482+
self.sess.opts.debugging_opts.two_phase_borrows
14901483
}
14911484

14921485
/// What mode(s) of borrowck should we run? AST? MIR? both?

Diff for: src/librustc/ty/item_path.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ use ty::{self, DefIdTree, Ty, TyCtxt};
1414
use middle::cstore::{ExternCrate, ExternCrateSource};
1515
use syntax::ast;
1616
use syntax::symbol::{keywords, LocalInternedString, Symbol};
17-
use syntax_pos::edition::Edition;
1817

1918
use std::cell::Cell;
2019
use std::fmt::Debug;
@@ -140,7 +139,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
140139
debug!("push_krate_path: name={:?}", name);
141140
buffer.push(&name);
142141
}
143-
} else if self.sess.edition() == Edition::Edition2018 && !pushed_prelude_crate {
142+
} else if self.sess.rust_2018() && !pushed_prelude_crate {
144143
SHOULD_PREFIX_WITH_CRATE.with(|flag| {
145144
// We only add the `crate::` keyword where appropriate. In particular,
146145
// when we've not previously pushed a prelude crate to this path.

Diff for: src/librustc_resolve/build_reduced_graph.rs

+14-8
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,21 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
132132
// so prefixes are prepended with crate root segment if necessary.
133133
// The root is prepended lazily, when the first non-empty prefix or terminating glob
134134
// appears, so imports in braced groups can have roots prepended independently.
135+
// 2015 identifiers used on global 2018 edition enter special "virtual 2015 mode", don't
136+
// get crate root prepended, but get special treatment during in-scope resolution instead.
135137
let is_glob = if let ast::UseTreeKind::Glob = use_tree.kind { true } else { false };
136-
let crate_root = if !self.session.rust_2018() &&
137-
prefix_iter.peek().map_or(is_glob, |seg| !seg.ident.is_path_segment_keyword()) {
138-
Some(Segment::from_ident(Ident::new(
139-
keywords::CrateRoot.name(), use_tree.prefix.span.shrink_to_lo()
140-
)))
141-
} else {
142-
None
143-
};
138+
let crate_root = match prefix_iter.peek() {
139+
Some(seg) if !seg.ident.is_path_segment_keyword() &&
140+
seg.ident.span.rust_2015() && self.session.rust_2015() => {
141+
Some(seg.ident.span.ctxt())
142+
}
143+
None if is_glob && use_tree.span.rust_2015() => {
144+
Some(use_tree.span.ctxt())
145+
}
146+
_ => None,
147+
}.map(|ctxt| Segment::from_ident(Ident::new(
148+
keywords::CrateRoot.name(), use_tree.prefix.span.shrink_to_lo().with_ctxt(ctxt)
149+
)));
144150

145151
let prefix = crate_root.into_iter().chain(prefix_iter).collect::<Vec<_>>();
146152
debug!("build_reduced_graph_for_use_tree: prefix={:?}", prefix);

Diff for: src/librustc_resolve/error_reporting.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
3333
(Some(fst), Some(snd)) if fst.ident.name == keywords::CrateRoot.name() &&
3434
!snd.ident.is_path_segment_keyword() => {}
3535
// `ident::...` on 2018
36-
(Some(fst), _) if self.session.rust_2018() && !fst.ident.is_path_segment_keyword() => {
36+
(Some(fst), _) if fst.ident.span.rust_2018() &&
37+
!fst.ident.is_path_segment_keyword() => {
3738
// Insert a placeholder that's later replaced by `self`/`super`/etc.
3839
path.insert(0, Segment::from_ident(keywords::Invalid.ident()));
3940
}
@@ -141,7 +142,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
141142
mut path: Vec<Segment>,
142143
parent_scope: &ParentScope<'b>,
143144
) -> Option<(Vec<Segment>, Option<String>)> {
144-
if !self.session.rust_2018() {
145+
if path[1].ident.span.rust_2015() {
145146
return None;
146147
}
147148

0 commit comments

Comments
 (0)